![]() |
Wie kann ich feststellen welche Ereignismethode zugewiesen wurde?
Hallo ich stehe gerade auf dem Schlauch.
Wenn ich einer Ereignismethode eine Procedure zuweise, dann kann ich mit "if Assigned(Button.OnClick) then" prüfen, ob eine Procedure zugewiesen wurde, aber wie kann ich prüfen welche? if (edit.onclick = buttonclick1) then if (edit.onclick = buttonclick2) then ... geht halt nicht. |
AW: Wie kann ich feststellen welche Ereignismethode zugewiesen wurde?
Was heißt "... geht halt nicht." ?
Fehlermeldungen kann man auch genauer geben, dann können wir auch besser helfen. PS: Fehlermeldungsdialoge kann man mit Strg+C kopieren (also den inhalt des aktiven Dialogs als Text) und die Debuggermeldungen lassen sich auch kopieren (schau mal ins entsprechende Kontextmenü) Hier
Delphi-Quellcode:
willst du das Ergebnis der Funktionen vergleichen. (was bei Prozeduren schlecht möglich ist.)
if (edit.onclick = buttonclick1) then
Versuch mal
Delphi-Quellcode:
oder
if (edit.onclick = @buttonclick1) then
Delphi-Quellcode:
.
if (@edit.onclick = @buttonclick1) then
|
AW: Wie kann ich feststellen welche Ereignismethode zugewiesen wurde?
Zitat:
|
AW: Wie kann ich feststellen welche Ereignismethode zugewiesen wurde?
Also zunächst einmal ist das Prüfen des Empfängers eines Events
nicht sinnvoll, denn Events sollen ja gerade beliebig verdrahtet werden können, ohne dass der Eventauslöser den Empfänger kennt. Die Eventempfänger sollen anonym bleiben (Geheimnisprinzip der Objekt-orientierten Programmierung). Aber falls doch, dann so:
Delphi-Quellcode:
function IsSameMethod(a,b:TMethod):Boolean;
begin Result := (a.Code=b.Code) and (a.Data=b.Data); end; procedure TForm1.Button1Click(Sender: TObject); var a, b : TMethod; begin a := TMethod(Button1.OnClick); b.Code := @TForm1.Button1Click; b.Data := Self; if IsSameMethod(a, b) then Caption := 'Gleich' else Caption := 'Ungleich'; end; |
AW: Wie kann ich feststellen welche Ereignismethode zugewiesen wurde?
Ich hab das gerade mal schnell generisch gelöst:
Delphi-Quellcode:
Aber das von shmia ist fast besser imho, vor allem für ältere Delphi-Versionen.
function TForm1.CompareMethod<T>(M1, M2: T): Boolean;
begin Result := (TMethod(Pointer(@M1)^).Code = TMethod(Pointer(@M2)^).Code) and (TMethod(Pointer(@M1)^).Data = TMethod(Pointer(@M2)^).Data); end; |
AW: Wie kann ich feststellen welche Ereignismethode zugewiesen wurde?
Delphi-Quellcode:
Geht mit Neuen und mit alten Delphis und bei einigen Versionen sogar als schnuckliger Inlinecode.
function CompareMethods(const M1, M2): Boolean; // inline;
begin Result := (TMethod(M1).Code = TMethod(M2).Code) and (TMethod(M1).Data = TMethod(M2).Data); end; // bzw. function CompareMethods(const M1, M2): Boolean; // inline; begin Result := Int64(M1) = Int64(M2); end; |
AW: Wie kann ich feststellen welche Ereignismethode zugewiesen wurde?
Erst einmal vielen Dank für die schnelle Hilfe. Ich verwende die Variante von shmia! Ihr habt mir sehr geholfen, denn bei
"@X als Adresse der Variable X" oder "Zeiger-Dereferenzierung mit ^" tue ich mich immer sehr schwer. Zitat:
Also prüfe ich, wenn ich meine "Action" ausführe, ob das Event noch der "Action" gehört. Und mir ist nichts anderes eingefallen als zu prüfen, ob meine Procedure der Action immernoch der tatsächliche Eventempfänger von Screen.OnActiveControlChange ist. Wenn jemand da noch etwas besseres weiß... Aber ich fürchte das kann ich nicht mit einen "geht halt nicht" im Raum stehen lassen. Zitat:
|
AW: Wie kann ich feststellen welche Ereignismethode zugewiesen wurde?
Zitat:
Wobei, wenn der Programmierer dein Objekt von dem Event abkoppelt, dann ist er selber schuld und hat halt Pech gehabt. Schutz gegen Fehler ist im Prinzip nichts Schlechtes; ich denke nur, dass der Benutzer deiner Klasse das Event Screen.OnActiveControlChange (also nicht innerhalb deines Codes zuweisen) setzen sollte und so auch die Verantwortung übernimmt, dass das so bleibt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:51 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 by Thomas Breitkreuz