![]() |
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.
![]() |
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 22:46 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz