AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Wie kann ich feststellen welche Ereignismethode zugewiesen wurde?
Thema durchsuchen
Ansicht
Themen-Optionen

Wie kann ich feststellen welche Ereignismethode zugewiesen wurde?

Ein Thema von Ackerjan · begonnen am 7. Apr 2011 · letzter Beitrag vom 8. Apr 2011
Antwort Antwort
Ackerjan

Registriert seit: 4. Jun 2007
Ort: Potsdam
17 Beiträge
 
Delphi 2009 Enterprise
 
#1

Wie kann ich feststellen welche Ereignismethode zugewiesen wurde?

  Alt 7. Apr 2011, 17:39
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.
Jan
Niemals aufgeben, niemals kapitulieren! - galaxy quest
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#2

AW: Wie kann ich feststellen welche Ereignismethode zugewiesen wurde?

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

Versuch mal if (edit.onclick = @buttonclick1) then oder if (@edit.onclick = @buttonclick1) then .
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#3

AW: Wie kann ich feststellen welche Ereignismethode zugewiesen wurde?

  Alt 7. Apr 2011, 19:01
Versuch mal if (edit.onclick = @buttonclick1) then oder if (@edit.onclick = @buttonclick1) then .
Hatte ich schon probiert, hat aber leider nicht funktioniert.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#4

AW: Wie kann ich feststellen welche Ereignismethode zugewiesen wurde?

  Alt 7. Apr 2011, 19:02
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;
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#5

AW: Wie kann ich feststellen welche Ereignismethode zugewiesen wurde?

  Alt 7. Apr 2011, 19:26
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.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#6

AW: Wie kann ich feststellen welche Ereignismethode zugewiesen wurde?

  Alt 7. Apr 2011, 20:48
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Ackerjan

Registriert seit: 4. Jun 2007
Ort: Potsdam
17 Beiträge
 
Delphi 2009 Enterprise
 
#7

AW: Wie kann ich feststellen welche Ereignismethode zugewiesen wurde?

  Alt 8. Apr 2011, 11:09
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.

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 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.
Jan
Niemals aufgeben, niemals kapitulieren! - galaxy quest
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#8

AW: Wie kann ich feststellen welche Ereignismethode zugewiesen wurde?

  Alt 8. Apr 2011, 16:17
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.
Andreas
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:23 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