@pluto
Für solche Fälle richte ich mir immer ne Unit mit Event-Deklarationen ein die man überall zuladen kann. Da könnte man dann sowas wie:
typ
TDataTransfer = procedure(Sender: TObject; Origin: integer; var Data) of object;
derklarieren. Das kann dann überall benutzt werden wo man es braucht. Also ganz einfach.
Forward type not resolved ?
-
- Beiträge: 1187
- Registriert: Mi 13. Dez 2006, 10:58
- OS, Lazarus, FPC: Winux (L 1.2.xy FPC 2.6.z)
- CPU-Target: AMD A4-6400 APU
- Wohnort: Hamburg
-
- Beiträge: 1187
- Registriert: Mi 13. Dez 2006, 10:58
- OS, Lazarus, FPC: Winux (L 1.2.xy FPC 2.6.z)
- CPU-Target: AMD A4-6400 APU
- Wohnort: Hamburg
@pluto
TNotifyEvent, der ist so deklariert:
TNotifyEvent = procedure(Sender: TObject) of object;
und gilt überall da, wo Classes geladen ist. Also praktisch überall. Den kann man immer nehmen wenn nicht zusätzliche Daten übergeben muß.
Über:
TThisClass(Sender)^.
kann man dann auf alles zugreifen was als public oder published deklariert ist. Vorher sollte man aber testen welchen Typ Sender wirklich hat. Dafür kann man den Klassen-Namen abfragen. Dann kann man entscheiden was TThisClass wirklich sein soll. Dafür geht mein ich:
TObject(Sender)^.ClassName
oder so ähnlich. Mußt Du mal probieren. Dann bekommst Du den tatsächlichen Klassennamen von dem Objekt und kannst dann auch an die Daten ran. Damit wäre dann auch Dein Problem gelöst ohne da was schwieriges bauen zu müssen.
TNotifyEvent, der ist so deklariert:
TNotifyEvent = procedure(Sender: TObject) of object;
und gilt überall da, wo Classes geladen ist. Also praktisch überall. Den kann man immer nehmen wenn nicht zusätzliche Daten übergeben muß.
Über:
TThisClass(Sender)^.
kann man dann auf alles zugreifen was als public oder published deklariert ist. Vorher sollte man aber testen welchen Typ Sender wirklich hat. Dafür kann man den Klassen-Namen abfragen. Dann kann man entscheiden was TThisClass wirklich sein soll. Dafür geht mein ich:
TObject(Sender)^.ClassName
oder so ähnlich. Mußt Du mal probieren. Dann bekommst Du den tatsächlichen Klassennamen von dem Objekt und kannst dann auch an die Daten ran. Damit wäre dann auch Dein Problem gelöst ohne da was schwieriges bauen zu müssen.
Humor ist der Knopf, der verhindert, daß uns der Kragen platzt.
(Ringelnatz)
(Ringelnatz)
-
- Lazarusforum e. V.
- Beiträge: 7192
- Registriert: So 19. Nov 2006, 12:06
- OS, Lazarus, FPC: Linux Mint 19.3
- CPU-Target: AMD
- Wohnort: Oldenburg(Oldenburg)
ich mache das jetzt mit einem ereignis was ich auslöse weil es ja nicht anderes geht:
TonChangeValue = procedure of object ich brauche keine variabeln *G*
und dieses ereignis wird dann direckt mit einer procedre zugeiwesen in der eigentlichen klasse die probleme gemacht hat !
achja vohrer solltes du noch prüfen ob das ereignis überhaupt belegt ist weil ich habe im lazarus qullcodes zwischendurch stellen gesehen dort wird ein ereinigs aufgerufen aber es wird nicht geprüft ob es belegt ist !
ich finde das ist ein bug weil meiner meinung nach ist/war dieses ergnis nicht zwingend ervorderlich für die procedure....
und solche stellen treffe ich immer wieder !
unter delphi ging das übring so(meine ich)
if sender is TObject wobei ich immer mit is durcheinander komme und mit der reinfolge: erst variabeln name oder erst klasse namen ?
TonChangeValue = procedure of object ich brauche keine variabeln *G*
und dieses ereignis wird dann direckt mit einer procedre zugeiwesen in der eigentlichen klasse die probleme gemacht hat !
achja vohrer solltes du noch prüfen ob das ereignis überhaupt belegt ist weil ich habe im lazarus qullcodes zwischendurch stellen gesehen dort wird ein ereinigs aufgerufen aber es wird nicht geprüft ob es belegt ist !
ich finde das ist ein bug weil meiner meinung nach ist/war dieses ergnis nicht zwingend ervorderlich für die procedure....
und solche stellen treffe ich immer wieder !
unter delphi ging das übring so(meine ich)
if sender is TObject wobei ich immer mit is durcheinander komme und mit der reinfolge: erst variabeln name oder erst klasse namen ?
MFG
Michael Springwald
Michael Springwald
-
- Beiträge: 1187
- Registriert: Mi 13. Dez 2006, 10:58
- OS, Lazarus, FPC: Winux (L 1.2.xy FPC 2.6.z)
- CPU-Target: AMD A4-6400 APU
- Wohnort: Hamburg
Schon richtig so, so kann man das auch machen. Vor dem Aufruf, also im Aufrufer sollte man auch immer noch ein:
if Assigned(FEventName) then EventName(Self);
veranstalten um sicher zu gehen das es auch nen Empfänger gibt. Events ohne Absender (Self) sollte man nicht machen. Das kann Probleme geben, schließlich könnte ja eine ganze Liste von Objekten den Event ansprechen. Dann brauchst du den Absender um auch das richtige Objekt in der Liste rauszukriegen.
if Assigned(FEventName) then EventName(Self);
veranstalten um sicher zu gehen das es auch nen Empfänger gibt. Events ohne Absender (Self) sollte man nicht machen. Das kann Probleme geben, schließlich könnte ja eine ganze Liste von Objekten den Event ansprechen. Dann brauchst du den Absender um auch das richtige Objekt in der Liste rauszukriegen.
Humor ist der Knopf, der verhindert, daß uns der Kragen platzt.
(Ringelnatz)
(Ringelnatz)