Ereignis-Handler zuweisen

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
dirk.be
Beiträge: 5
Registriert: Di 4. Nov 2014, 12:06

Ereignis-Handler zuweisen

Beitrag von dirk.be »

Hallo zusammen,

ich habe gerade ein Brett vorm Kopf, aber ich finde einfach den Fehler nicht. Warum funktioniert das so nicht?

Aus der Unit statusfrm:

Code: Alles auswählen

type
  TStatusForm = class(TForm)
    // ...
    procedure ScanTerminate(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
// ...
 
procedure TStatusForm.ScanTerminate(Sender: TObject);
begin
  Hide;
end; 
Aus der Unit scanthrd:

Code: Alles auswählen

constructor TScanThread.Create(const RootDir: String);
begin
  // ...
  FStatusForm:= TStatusForm.Create(AnalyzerForm);
  OnTerminate:= FStatusForm.ScanTerminate;    // <-- hier gibt's den Fehler! (s.u.)
  FreeOnTerminate:= true;
  inherited Create(true);
end; 
Fehlermeldung
Fehlermeldung
Die Klasse TScanThread im 2. Codeblock habe ich von TThread abgeleitet und dort ist OnTerminate als property vom Typ TNotifyEvent definiert. Irgendwie checke ich nicht, warum ich die Methode nicht wie oben zuweisen kann?!

Gruß Dirk

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2825
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Ereignis-Handler zuweisen

Beitrag von m.fuchs »

Code: Alles auswählen

constructor TScanThread.Create(const RootDir: String);
begin
  // ...
  FStatusForm:= TStatusForm.Create(AnalyzerForm);
  OnTerminate:= @FStatusForm.ScanTerminate;
  FreeOnTerminate:= true;
  inherited Create(true);
end; 
Du musst ein @ davor setzen. Das @ bedeutet: setze einen Zeiger auf die Funktion in die Property. Ohne @ wird die Funktion aufgerufen und ihr Ergebnis in die Property gegeben. Weil das Funktionsresult aber kein Zeiger ist, meckert der Compiler.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

dirk.be
Beiträge: 5
Registriert: Di 4. Nov 2014, 12:06

Re: Ereignis-Handler zuweisen

Beitrag von dirk.be »

Au man, so einfach kann es sein! Hab zwischenzeitlich zu lange in VB und C# rumprogrammiert, da kommt man schon mal durcheinander mit der Syntax. Ich dachte, der Methodenname würde der Aufrufadresse entsprechen. :oops: Wenn der Compiler hier einen Funktionsaufruf versucht, verstehe ich jetzt auch die Fehlermeldung... :roll:

Besten Dank! Thema hat sich hiermit schon erledigt.

Gruß Dirk

Antworten