Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Events vergleichen (https://www.delphipraxis.net/75386-events-vergleichen.html)

igel457 18. Aug 2006 16:54


Events vergleichen
 
Hallo, ich habe ein "kleines" Problem...

Und zwar setze ich mit...
Delphi-Quellcode:
procedure TDXLuaGUIManager.ACallBack1(Sender:TObject);
begin
  with Sender as TDXComponent do
  begin
    OnClick := AClick;
  end;
end;
...OnClick (TNotifyEvent) einer Komponente auf die Prozedut AClick. Die Deklaration davon sieht so aus:
Delphi-Quellcode:
procedure AClick(Sender:TObject);
Nun möchte ich überprüfen, ob OnClick auf AClick gesetzt worden ist.
Der Code von mir:
Delphi-Quellcode:
procedure TDXLuaGUIManager.ACallBack2(Sender:TObject);
begin
  with Sender as TDXComponent do
  begin
    if OnClick = AClick| then OnClick := nil;
  end;
end;
Leider spuckt mir der Compiler bei | eine Fehlermeldung (E2035 Nicht genügend wirkliche Parameter) aus.
Ich habe leider keine Ahnung, wie ich diesen Vergleich durführen kann. Ich habe es auch schon mit der Addresse (@) versucht, aber das hat auch nicht funktioniert.

Danke!

Meflin 18. Aug 2006 16:57

Re: Events vergleichen
 
Wie wärs
1. if assigned(...) wobei du dann halt nicht genau weist WAS zugewießen wurde, aber das muss ja auch vielleicht garnicht sein
2. boolean variable beim setzen auf true setzen :stupid:

3. was zum Geier soll | sein? oder soll das nur die Stelle markieren?? :stupid:


igel457 18. Aug 2006 17:02

Re: Events vergleichen
 
1. Geht nicht, Ich will wissen ob das Event mit dieser Funktion verküpft ist
2. :roll:
3. Ja, soll nur die Stelle makieren

NicoDE 18. Aug 2006 17:05

Re: Events vergleichen
 
Tendenziell
Delphi-Quellcode:
if TMethod(OnCreate).Code = Addr(TKlasse.AClick) then
Stellt sich nur die Frage, ob man das Problem nicht anders lösen sollte...

igel457 18. Aug 2006 17:08

Re: Events vergleichen
 
Zitat:

Zitat von NicoDE
Tendenziell
Delphi-Quellcode:
if TMethod(OnCreate).Code = Addr(TKlasse.AClick) then
Stellt sich nur die Frage, ob man das Problem nicht anders lösen sollte...

Mh...
Funktioniert leider nicht,
Wie würdest du denn das Problem lösen?

NicoDE 18. Aug 2006 17:12

Re: Events vergleichen
 
Zitat:

Zitat von igel457
Funktioniert leider nicht,
Wie würdest du denn das Problem lösen?

Meine Glaskugel ist in der Reinigung :)

Weder kann ich dir sagen warum es nicht funktioniert (da ich nicht weiß, was nicht funktioniert), noch kann ich mit den wenigen Informationen eine Lösung für das Problem vorschlagen, dessen Umfang sich von hier aus nicht abschätzen lässt (es ist nichtmal klar, warum Events verglichen werden müssen).

ps: du musst an meinem Beispiel natürlich sinnvolle Änderungen vornehmen (OnCreate -> OnClick und TKlasse -> ???)

igel457 18. Aug 2006 17:26

Re: Events vergleichen
 
Sorry...

Ok, mein Problem ist das Folgende:
Ich schreibe mein Programm in zweierlei Hinsicht um: Zum einen habe ich ein eigenes GUI System geschrieben, zum anderen binde ich die Skriptsprache LUA, welche u.a. GUI Steuert, in mein Programm ein.

Meine GUI besteht aus vielen Komponenten. Diese haben Events. Wird ein Event ausgelöst, so wird eine Entsprechende LUA Funktion (KomponentenName+'OnClick') aufgerufen.

Da ich die Events nicht "per Hand" mit LUA Verbinden möchte, habe ich mir eine Klasse geschrieben (TDXLuaGUIManager) welche alle Events der Komponenten mit einem eigenem Handler (AClick) verknüpft und der dann die entsprechende LUA Funktion aufruft.
Die Klasse hat eine Funktion TDXLuaManager.Connect, die alle Komponenten durchgeht und deren OnClick Funktion mit AClick verknüpft. Gleichzeitig will ich auch eine Disconnect Funktion haben die das OnClick Ereigniss aller Funktionen auf NIL setzt. Allerdings kann es ja vorgekommen sein, dass man OnClick zwischenzeitlich mit etwas anderem verknüpft hat und diese Verknüpfung dann auch ins Nirvana zeigen würde.
Deshalb will ich überprüfen ob OnClick auch wirklich mit AClick verknüpft ist.

Ich hoffe das war verständlich...

NicoDE 18. Aug 2006 17:36

Re: Events vergleichen
 
Zitat:

Zitat von igel457
Ich hoffe das war verständlich...

Ja, danke.

OnClick ist eine Methoden-Variable. Methoden-Referenzen bestehen intern aus zwei Teilen: (1) einer Self-Referenz (TMethod.Data) und (2) einer Adresse einer Funktion einer Klasse (TMethod.Code).
Wenn du nun prüfen willst ob die Event-Variable (intern TMethod) auf eine bestimmte Funktion einer Klasse zeigt, dann musst du TMethod(EventVariable).Code mit der Adresse der Funktion einer Klasse vergleichen (da dich die Self-Referenz von TMethod nicht interessiert).

ps: ich hoffe das war halbwegs verständlich.

igel457 18. Aug 2006 17:44

Re: Events vergleichen
 
Danke für die Antwort.

Jetzt ist mein Problem nur noch an die Addresse der Funktion meiner Klasse zu kommen.
Denn bei
Code:
@AClick
oder
Code:
Addr(AClick)
meckert Compiler mit "Variable erforderlich".

NicoDE 18. Aug 2006 18:58

Re: Events vergleichen
 
Welche Klasse implementiert AClick?
Wenn es TFoo wäre, dann:
Delphi-Quellcode:
Addr(TFoo.AClick)


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:32 Uhr.
Seite 1 von 2  1 2      

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