AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Adresse einer Funktion über Name herausfinden
Thema durchsuchen
Ansicht
Themen-Optionen

Adresse einer Funktion über Name herausfinden

Ein Thema von Garby · begonnen am 30. Jun 2003 · letzter Beitrag vom 1. Jul 2003
Antwort Antwort
Benutzerbild von Garby
Garby

Registriert seit: 17. Mär 2003
Ort: Tirol
199 Beiträge
 
Delphi 2005 Professional
 
#1

Adresse einer Funktion über Name herausfinden

  Alt 30. Jun 2003, 18:40
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
Walter
Wenn zwei dasselbe tun, ist es noch lange nicht dasselbe
(Adelphi)
  Mit Zitat antworten Zitat
Benutzerbild von Sanchez
Sanchez

Registriert seit: 24. Apr 2003
Ort: Neumarkt Stmk
892 Beiträge
 
Delphi XE6 Enterprise
 
#2
  Alt 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
Daniel
  Mit Zitat antworten Zitat
Gast
(Gast)

n/a Beiträge
 
#3
  Alt 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.
  Mit Zitat antworten Zitat
Benutzerbild von Garby
Garby

Registriert seit: 17. Mär 2003
Ort: Tirol
199 Beiträge
 
Delphi 2005 Professional
 
#4
  Alt 30. Jun 2003, 20:26
Danke für die Antworten
MethodAddress habe ich inzwischen auch herausgefunden(besser gleich die Hilfe anschauen ).

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?
Walter
Wenn zwei dasselbe tun, ist es noch lange nicht dasselbe
(Adelphi)
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#5
  Alt 30. Jun 2003, 22:09
Moin Garby,

Zitat von Delphi-Hilfe:
Wenn der Parameter Name nicht auf eine als published deklarierte Methode verweist, gibt MethodAddress einen nil-Zeiger zurück.
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 von Garby:
war das Verständlich?
für mich nicht.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von Garby
Garby

Registriert seit: 17. Mär 2003
Ort: Tirol
199 Beiträge
 
Delphi 2005 Professional
 
#6
  Alt 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
Walter
Wenn zwei dasselbe tun, ist es noch lange nicht dasselbe
(Adelphi)
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.481 Beiträge
 
Delphi 10.1 Berlin Professional
 
#7
  Alt 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.
  Mit Zitat antworten Zitat
darkstone

Registriert seit: 4. Feb 2003
26 Beiträge
 
#8
  Alt 1. Jul 2003, 12:11
@jbg: Ich glaub, es müsste so heissen:
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:10 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