Ich möchte gerne in eine TList Zeiger auf Funktionen ablegen.
Mit AddCanEvent(evt: TCanEvent): Integer; möchte ich dieser Liste was hinzufügen.
Dazu habe ich folgendes deklariert:
PCanEvent = ^TCanEvent;
TCanEvent = Procedure (CanMsg: TCanMsg) Of Object;
nun zum Problem:
Irgendwie wird ein falscher Zeiger in die Liste aufgenommen. Ich blick da nicht durch. Anbei mein Code:
Code: Alles auswählen
PCanEvent = ^TCanEvent;
TCanEvent = Procedure (CanMsg: TCanMsg) Of Object;
Function AddCanEvent(evt: TCanEvent): Integer;
Procedure RemoveCanEvent(evt: TCanEvent);
Function AddCanEvent(evt: TCanEvent): Integer;
Begin
If Not Assigned(lstCanMsgReceiver) Then
lstCanMsgReceiver := TList.Create;
lstCanMsgReceiver.Add(@evt);
Result := lstCanMsgReceiver.Count - 1;
End;
Procedure RemoveCanEvent(evt: TCanEvent);
Var i: Integer;
Begin
If Not Assigned(lstCanMsgReceiver) Then Exit;
For i := 0 To lstCanMsgReceiver.Count - 1 Do
Begin
If lstCanMsgReceiver[i] = @evt Then
Begin
lstCanMsgReceiver.Delete(i);
Break;
End;
End;
End;
Procedure TfrmMain.SerRecData(Msg: String);
Var i: Integer;
cMsg: TCanMsg;
evt: PCanEvent;
Begin
// cMsg füllen...
If Assigned(lstCanMsgReceiver) Then // In der Liste werden alle Empfänger von Messages gespeichert, Siehe "AddCanEvent()"
Begin
For i := 0 To lstCanMsgReceiver.Count - 1 Do // Alle Empfänger
Begin
If Assigned(lstCanMsgReceiver[i]) Then // Empfänger vorhanden
Try
evt := (lstCanMsgReceiver[i]); // Event auslösen
evt^(cMsg);
Except
End;
End;
End;
End;
procedure TfrmMain.FormCreate(Sender: TObject);
Begin
AddCanEvent(@LogCanData);
End;
Procedure TfrmMain.LogCanData(CanMsg: TCanMsg);
Begin
//...;
End;
Ich vermute, dass der Fehler in "AddCanEvent" schon passiert, da hier der Zeiger auf den Zeiger auf evt und nicht den Zeiger auf evt in die Liste kommt, aber ich weiß nicht wie ich es Lazarus bei bringe, dass es so tut wie ich gerne möchte.
Wenn die Zeile so aussieht:
lstCanMsgReceiver.Add(Pointer(evt));
Dann meckert der Compiller.
lstCanMsgReceiver.Add(Addr(evt));
Dann klappt es auch nicht.

Vielen Dank für eure Hilfe, Gruß Markus