Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Prüfen ob Methode = TNotifyEvent (https://www.delphipraxis.net/110333-pruefen-ob-methode-%3D-tnotifyevent.html)

Neutral General 16. Mär 2008 17:39


Prüfen ob Methode = TNotifyEvent
 
Hi,

Angenommen ich habe das hier:

Delphi-Quellcode:
TKlasse = class(TBlubb)
  procedure Test;
  procedure Blubb(Sender: TObject);
end;
Wie kann ich testen ob Test/Blubb vom Typ TNotifyEvent sind?

Also sowas wie:

Delphi-Quellcode:
if Test is TNotifyEvent then
funktioniert nicht :(

Gruß
Neutral General

3_of_8 16. Mär 2008 17:41

Re: Prüfen ob Methode = TNotifyEvent
 
Das geht nicht, weil eine Methode keine Klasse ist. Aber das steht doch schon zur Designzeit fest. Schau doch einfach nach, ob es ein TNotifyEvent ist oder nicht.

Neutral General 16. Mär 2008 17:43

Re: Prüfen ob Methode = TNotifyEvent
 
Zitat:

Zitat von 3_of_8
Das geht nicht, weil eine Methode keine Klasse ist. Aber das steht doch schon zur Designzeit fest. Schau doch einfach nach, ob es ein TNotifyEvent ist oder nicht.

Ja das mans sieht, weiß ich auch. Aber ich muss es eben prüfen können. Wie gesagt das es mit "is" nicht funktioniert habe ich ja bereits gemerkt. Aber gibt es denn andere Methoden? Notfalls meinetwegen auch RTTI.

Gruß
Neutral General

3_of_8 16. Mär 2008 17:48

Re: Prüfen ob Methode = TNotifyEvent
 
Ich denke nicht, weil Methoden AFAIK keinen RTTI-Eintrag haben. Eine Methode ist ja nicht mehr als ein Pointer auf einen Haufen Maschinenbefehle. Ich fürchte, da wirst du wirklich zur Designzeit schauen müssen.

mirage228 16. Mär 2008 17:49

Re: Prüfen ob Methode = TNotifyEvent
 
RTTI hilft dir zumindest bei Published-Eigenschaften weiter...
Delphi-Referenz durchsuchenTypInfo / Delphi-Referenz durchsuchenTTypeData

mfG
mirage228

Apollonius 16. Mär 2008 17:50

Re: Prüfen ob Methode = TNotifyEvent
 
Mit Mühe kann man feststellen, wenn die Klasse und der Methodenname gegeben ist, wie die Methodensignatur ist und damit, ob es sich um ein TNotifyEvent handelt. Hier steht, wie es geht. Man sieht aber auch, dass man eine zusätzliche Compiler-Direktive braucht.

sirius 16. Mär 2008 18:51

Re: Prüfen ob Methode = TNotifyEvent
 
Delphi-Quellcode:
function getMethodInfo(aObject:TObject;const aMethodname:string {oder aMethodaddress:pointer}):TStringList;
type PParam=^TParam;
     TParam=packed record //Parameter
       Paramtype:byte; //var, const, in oder out
       TypInfo:PPointer; //Pointer zu TypeInfo des Parameters
       ParamPos:Word; //0=eax; 1=edx; 2=ecx; ansonsten bei ebp+x
       Name:ShortString;
     end;
var obj:pointer;
    MInfo:pointer;
    count,lengthMethod:pword;
    i:integer;
    adr:pointer;
    name:PShortstring;
    Param:PParam;
    typInfo:pointer;
begin
  result:=TStringlist.Create;
  result.NameValueSeparator:='=';
  obj:=aObject.ClassType;
  repeat
    MInfo:=ppointer(integer(obj)+vmtMethodTable)^;
    if assigned(MInfo) then
    begin
      count:=MInfo;
      lengthMethod:=pointer(integer(count)+2);
      for i:=1 to count^ do
      begin
        name:=pointer(integer(lengthMethod)+6);
        adr:=ppointer(integer(lengthMethod)+2)^;
        if name^=aMethodname then //oder "if adr=aMethodaddress then"
        begin
          Param:=pointer(pbyte(name)^+integer(name)+1+8); //8 für allg. Methodeninfo
          while integer(param)<lengthMethod^+integer(lengthMethod) do
          begin
            typInfo:=Param^.TypInfo^;
            name:=pointer(integer(typInfo)+1);
            result.Add(param^.Name+'='+Name^);
            param:=pointer(integer(param)+sizeof(TParam)-$100+pbyte(@Param^.Name)^+1);
          end;
          exit;
        end;
        lengthMethod:=pointer(integer(lengthMethod)+lengthMethod^);
      end;
    end;
    obj:=TClass(obj).ClassParent;
  until obj=nil;
end;
Die liefert dir für eine gegebene Klasse und published Methode eine Liste mit den Parametern.
Das funktioniert ab D7 mit {$MethodInfo on}. Allerdings veranlasst der Compiler hin und wieder keine RTTI für die Parameter. Wann genau kann ich nicht 100%ig sagen. Aber zum Beispiel, wenn ein Array direkt im MethodenHeader verwendet wird ohne das ein extra Typ deklariert wurde.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:42 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