Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Wie kann ich feststellen welche Ereignismethode zugewiesen wurde? (https://www.delphipraxis.net/159676-wie-kann-ich-feststellen-welche-ereignismethode-zugewiesen-wurde.html)

Ackerjan 7. Apr 2011 16:39

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.

himitsu 7. Apr 2011 17:42

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:
if (edit.onclick = buttonclick1) then
willst du das Ergebnis der Funktionen vergleichen. (was bei Prozeduren schlecht möglich ist.)

Versuch mal
Delphi-Quellcode:
if (edit.onclick = @buttonclick1) then
oder
Delphi-Quellcode:
if (@edit.onclick = @buttonclick1) then
.

s.h.a.r.k 7. Apr 2011 18:01

AW: Wie kann ich feststellen welche Ereignismethode zugewiesen wurde?
 
Zitat:

Zitat von himitsu (Beitrag 1093725)
Versuch mal
Delphi-Quellcode:
if (edit.onclick = @buttonclick1) then
oder
Delphi-Quellcode:
if (@edit.onclick = @buttonclick1) then
.

Hatte ich schon probiert, hat aber leider nicht funktioniert.

shmia 7. Apr 2011 18:02

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;

s.h.a.r.k 7. Apr 2011 18:26

AW: Wie kann ich feststellen welche Ereignismethode zugewiesen wurde?
 
Ich hab das gerade mal schnell generisch gelöst:
Delphi-Quellcode:
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;
Aber das von shmia ist fast besser imho, vor allem für ältere Delphi-Versionen.

himitsu 7. Apr 2011 19:48

AW: Wie kann ich feststellen welche Ereignismethode zugewiesen wurde?
 
Delphi-Quellcode:
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;
Geht mit Neuen und mit alten Delphis und bei einigen Versionen sogar als schnuckliger Inlinecode.

Ackerjan 8. Apr 2011 10:09

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:

Zitat von shmia (Beitrag 1093732)
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).

Ich habe natürlich das OnClick - Event als einfaches Beispiel gewählt. Das Problem ist, dass es pro Event immer nur einen Eventempfänger gibt. In meinem Fall will ich das Screen.OnActiveControlChange abhören und natürlich sichergehen, dass nicht ein anderer Eventempfänger mir das Event "klaut".

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:

Zitat von himitsu
Was heißt "... geht halt nicht." ?
Fehlermeldungen kann man auch genauer geben, dann können wir auch besser helfen.

Vielen Dank für die Hilfe.

shmia 8. Apr 2011 15:17

AW: Wie kann ich feststellen welche Ereignismethode zugewiesen wurde?
 
Zitat:

Zitat von Ackerjan (Beitrag 1093873)
In meinem Fall will ich das Screen.OnActiveControlChange abhören und natürlich sichergehen, dass nicht ein anderer Eventempfänger mir das Event "klaut".

Das kann man gerade nochmal so durchgehen lassen.
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 15:43 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz