Prüfen ob Methode = TNotifyEvent
Hi,
Angenommen ich habe das hier:
Delphi-Quellcode:
Wie kann ich testen ob Test/Blubb vom Typ TNotifyEvent sind?
TKlasse = class(TBlubb)
procedure Test; procedure Blubb(Sender: TObject); end; Also sowas wie:
Delphi-Quellcode:
funktioniert nicht :(
if Test is TNotifyEvent then
Gruß Neutral General |
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.
|
Re: Prüfen ob Methode = TNotifyEvent
Zitat:
Gruß Neutral General |
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.
|
Re: Prüfen ob Methode = TNotifyEvent
|
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.
|
Re: Prüfen ob Methode = TNotifyEvent
Delphi-Quellcode:
Die liefert dir für eine gegebene Klasse und published Methode eine Liste mit den Parametern.
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; 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