Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Adresse einer Funktion über Name herausfinden (https://www.delphipraxis.net/6126-adresse-einer-funktion-ueber-name-herausfinden.html)

Garby 30. Jun 2003 18:40


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

Sanchez 30. Jun 2003 20:16

Hallo Garby,

Auszug aus der Delphi-Hilfe

Zitat:

TObject.MethodAddress

Die Methode MethodAddress gibt die Adresse einer als published deklarierten Methode zurück.

class function MethodAddress(const Name: ShortString): Pointer;

Beschreibung

MethodAddress wird intern vom Streaming-System verwendet. Wenn eine Ereigniseigenschaft aus einem Stream gelesen wird, wird der im Parameter Name übergebene Methodenname in einen Zeiger mit der Methodenadresse konvertiert. Normalerweise ist ein direkter Aufruf von MethodAddress nicht erforderlich.

Wenn der Parameter Name nicht auf eine als published deklarierte Methode verweist, gibt MethodAddress einen nil-Zeiger zurück.
mfg Daniel

Gast 30. Jun 2003 20:16

@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.

Garby 30. Jun 2003 20:26

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?

Christian Seehase 30. Jun 2003 22:09

Moin Garby,

Zitat:

Zitat von Delphi-Hilfe
Wenn der Parameter Name nicht auf eine als published deklarierte Methode verweist, gibt MethodAddress einen nil-Zeiger zurück.

Zitat:

Zitat von Garby
Dabei handelt es sich um Public-Funktionen bzw. Ereignisprozeduren eines Formulars.

Ich hab's auch mal mit einer public/published Methode ausprobiert:
In D5 stimmt's. Für eine published Methode gibt's eine Adresse, für public nicht.


Zitat:

Zitat von Garby
war das Verständlich?

für mich nicht. ;-)

Garby 1. Jul 2003 08:02

Hallo,

ich habs auch mit einer Prozedur probiert, die direkt in der Klassendefinition steht(wie Ereignisprozeduren).
Damit funktionierts auch:
Delphi-Quellcode:
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;
Wenn ich jetzt aPointer aufrufen will, muss ich aber erst einen Typ deklarieren, der der Originalprozedur entspricht:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
type
  TProbe = procedure(Text: String);
var
  aProbe: TProbe;
begin
  aProbe := MethodAddress('pProbe');
  aProbe('irgendein Text');
end;
Oder gleich der direkte Weg(ohne type):
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  aProbe: procedure(Text: String);
begin
  aProbe := MethodAddress('pProbe');
  aProbe('irgendein Text');
end;
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.

Ich hoffe so ists klar :freak:

jbg 1. Jul 2003 11:39

Deine Prozedurtyp muss folgendermaßen lauten:
Delphi-Quellcode:
aProbe: procedure(SelfPtr: TObject; Text: string);

aProbe(Form1, 'Hallo');
Zitat:

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.
Delphi ist kein Interpreter. Du musst für jede Anzahl und Typ von Parametern eine eigene Prozedur-Variable anlegen.

darkstone 1. Jul 2003 12:11

@jbg: Ich glaub, es müsste so heissen:
Delphi-Quellcode:
procedure aProbe( Text: String ); of object;
@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.


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