![]() |
Adresse einer Funktion über Name herausfinden
Hallo,
kann ich die Adresse einer Funktion/Prozedur über den Namen der Funktion herausfinden. Dabei handelt es sich um Public-Funktionen bzw. Ereignisprozeduren eines Formulars. Ich dachte dabei an sowas wie TComponent.FindComponent. Danke im Voraus |
Hallo Garby,
Auszug aus der Delphi-Hilfe Zitat:
|
@FunktionsName gibt die Adresse.
@Funktion:=GetProcAddress(lib, 'FunktionsName'); gibt die Adress einer Funktion in einer geladenen DLL deren Modulhandle lib ist. Bei Methoden ist es nicht ganz so einfach ... aber ich sehe der Vorredner hat dazu schon was geschrieben. |
Danke für die Antworten :thuimb:
MethodAddress habe ich inzwischen auch herausgefunden(besser gleich die Hilfe anschauen :oops: ). Das nächste Problem besteht darin, die Funktion aufzurufen, wenn die Parameter und die Parametertypen zwar bekannt sind, aber nicht für jede verschiedene Funktionsart ein neuer Typ deklariert werden kann. war das Verständlich? |
Moin Garby,
Zitat:
Zitat:
In D5 stimmt's. Für eine published Methode gibt's eine Adresse, für public nicht. Zitat:
|
Hallo,
ich habs auch mit einer Prozedur probiert, die direkt in der Klassendefinition steht(wie Ereignisprozeduren). Damit funktionierts auch:
Delphi-Quellcode:
Wenn ich jetzt aPointer aufrufen will, muss ich aber erst einen Typ deklarieren, der der Originalprozedur entspricht:
type
TForm1 = class(TForm) Button1: TButton; procedure pProbe(Text: String); procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); var aPointer: Pointer; begin aPointer := MethodAddress('pProbe'); end;
Delphi-Quellcode:
Oder gleich der direkte Weg(ohne type):
procedure TForm1.Button1Click(Sender: TObject);
type TProbe = procedure(Text: String); var aProbe: TProbe; begin aProbe := MethodAddress('pProbe'); aProbe('irgendein Text'); end;
Delphi-Quellcode:
Die Frage ist: kann ich aProbe so deklarieren, damit ich mehrere Prozedurtypen aufrufen kann(z.B. meherere Parameter). Die Parameteranzahl(und Typen) sind mir bekannt.
procedure TForm1.Button1Click(Sender: TObject);
var aProbe: procedure(Text: String); begin aProbe := MethodAddress('pProbe'); aProbe('irgendein Text'); end; Ich hoffe so ists klar :freak: |
Deine Prozedurtyp muss folgendermaßen lauten:
Delphi-Quellcode:
aProbe: procedure(SelfPtr: TObject; Text: string);
aProbe(Form1, 'Hallo'); Zitat:
|
@jbg: Ich glaub, es müsste so heissen:
Delphi-Quellcode:
@Garby: Ich glaub ich weiss was du meinst: Du kennst die Prozedur-Typen, aber du weisst zur Laufzeit nicht, welcher daherkommt. Du willst zur Runtime wissen, welche Parameter die Proc hat. AFAIK sollte es eine Unit geben, die "DsgnInf" oder so ähnlich heisst. Auf alle Fälle sind in dieser Unit die Typen für die RTTI (RunTimeTypeInformation) drin. Darin sollte es auch "TMethod" geben, in der auch die Params stehen sollten. Wie gesagt, ich weiss den Unit-Name jetzt nicht - Es wird am besten sein, wenn du Alle *.pas deines Delphi-Verzeichnisses nach dem Inhalt "TMethod" durchsuchst. In der Hilfe steht nämlich auch nix g'scheites über RTTI - ausser dass es das Ding gibt, und dass es einen Compiler-Switch dafür gibt.
procedure aProbe( Text: String ); of object;
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:30 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