![]() |
OnIrgendwas Handler lokal zuweisen --> Typfehler...
Hallo!
Folgendes Problem:
Delphi-Quellcode:
In der Methode MachIrgendwas() einer eigenen Klasse wird also ein Objekt erzeugt und ein EventHandler zugewiesen. Beim Compilieren erhalten ich aber immer die Meldung E2009 Inkompatible Typen: 'Methodenzeiger und reguläre Prozedur'.
type
TMeineKlase = class(TObjekt) private procedure MachIrgendwas; ... end; ... procedure TMeineKlasse.MachIrgendwas; var Obj: TEinObjekt; str: string; procedure IrgendwasPassiert(Param1: string; Param2: integer); begin ReagiereIrgendwie(); str := str + Param1; end; begin Obj := TEinObjekt.Create; Obj.OnIrgendwas := IrgendwasPassiert; Obj.MachWas; Obj.Free: end; Das Ereignis TEinObjekt.OnIrgendwas ist dabei vom Typ TIrgendeinEvent:
Delphi-Quellcode:
Die Signatur der lokalen Procedure IrgendwasPassiert() passt also zu TIrgendeinEvent und trotzdem erhalte ich die genannte Fehlermeldung.
...
TIrgendeinEvent = procedure(Param1: string; Param2: integer) of object; ... Was mache ich hier falsch? Besten Dank für eure Hilfe! Ares |
Re: OnIrgendwas Handler lokal zuweisen --> Typfehler...
Deine "Irgendwaspassiert" ist, wie dein Delphi-Compiler schon meckert, eine reguläre Prozedur, die du keinem Ereignis als Behandlungsroutine zuweisen kannst.
Die "Irgendwaspassiert" muss ein "Methodenzeiger" sein. Kurz gesagt heisst das, dass er eine Methode einer Klasse sein muss, was bei dir aber nicht gegeben ist.
Delphi-Quellcode:
Das sollte klappen.
type
TIrgendwaspassiert = procedure (Sender: TObject; Param1: String; Param2: String) of object; TIrgendeineKlasse = class (...) private FIrgendwaspassiert: TIrgendwaspassiert; public procedure MacheIrgendwas; published property OnIrgendwaspassiert: TIrgendwaspassiert read FIrgendwaspassiert write FIrgendwaspassiert; end; TForm1 = class (TForm) private FIrgendeineKlasse: TIrgendeineKlasse; procedure MyIrgendwaspassiert (Sender: TObject; Param1: String; Param2: String); public ... end; implementation procedure TIrgendeineKlasse.MacheIrgendwas; begin MacheVieleSachen; if Assigned (FIrgendwaspassiert) then FIrgendwaspassiert (Self, DeinParam1, DeinParam2); MacheAndereSachen; end; // **** procedure TForm1.Create (Sender: TObject); begin FIrgendwaspassiert := TIrgendwaspassiert.Create; FIrgendwaspassiert.OnIrgendwaspassiert := MyIrgendwaspassiert; end; procedure TForm1.Button1Click (Sender: TObject); begin FIrgendwaspassiert.MacheIrgendwas; end; procedure TForm1.Destroy; begin FreeAndNil (FIrgendwaspassiert); inherited; end; end. |
Re: OnIrgendwas Handler lokal zuweisen --> Typfehler...
Vielen Dank für deine ausführliche Antwort!
Kurz zusammengefasst heißt das, dass die Procedure die als Eventhandler zuweise eine Methode einer Klasse sein muss und nicht irgendeine "zwischendurch" definierte Procedure. Dabei habe ich aber folgende Probleme: 1. In meiner Klasse gibt es nicht nur eine Methode die ein lokales TEinObjekt verwendet sonder ziemlich viele. Fast jede dieser Methoden soll auf Ergeinisse des Objektes anders reagieren. Ich müsste also für jede Methode eigene Eventhandler in meiner Klasse definieren. Das wären ziemlich viele. 2. Die Eventhandler sollen mit lokalen Variablen der jeweiligen Methoden arbeiten. Das ist nicht möglich, wenn die Eventhandler als private Procedure der Klasse deklariert sind (siehe die Variable str in meinem Beispiel). Dann müsste ich statt lokaler Variablen in den Methoden globale Variablen im Objekt verwenden. Das wäre ebenfalls ziemlich viel und unübersichtlich. Gibt es also irgend eine Möglichkeit den Eventhandler "elegant" lokal zu definieren und zu verwenden oder ist dies ausgeschlossen? |
Re: OnIrgendwas Handler lokal zuweisen --> Typfehler...
Wenn du in solche Abhängigkeiten gerätst, solltest du vielleicht nochmal dein Vorhaben und das Konzept dazu überdenken. ;)
Du kannst auch nur einen zentralen Eventhandler anlegen, dem du als Parameter eine ID oder sowas übergibst, damit du weißt, von welcher Funktion in deiner Klasse er aufgerufen wurde. Darauf kannst du ja entsprechend reagieren ... |
Re: OnIrgendwas Handler lokal zuweisen --> Typfehler...
oder B'n'D dies so abändern:
Delphi-Quellcode:
TIrgendeinEvent = procedure(Param1: string; Param2: integer);
|
Re: OnIrgendwas Handler lokal zuweisen --> Typfehler...
Zitat:
Zitat:
Zitat:
|
Re: OnIrgendwas Handler lokal zuweisen --> Typfehler...
Hallo Ares,
Zitat:
Gruß Hawkeye |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:14 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz