Adresse eine Funktion / Prozedur ermitteln
Ich möchte eine Funktion aufrufen, von der ich lediglich den Namen habe. Ich habe bereits die Funktion MethodAddress gefunden, die aber (wie der Name schon sagt) nut für Methoden funktioniert. Die Unit, in der ich das brauche, ist so aufgebaut:
Delphi-Quellcode:
Alle Funktionen sind gleich aufgebaut, undzwar so, wie TMyProcedure. Je nach dem, welcher Parameter jetzt der Funktion HandleValues übergeben wird, soll die Funktion mit dem entsprechenden Namen aufgerufen werden(Hab die Funktionen jetzt hier nicht mit reinkopiert).
unit unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TMyProcedure = function(Value: String): String; function HandleValues(Value: String): String; implementation function HandleValues(CommandLine: String): String; var Proc: TMyProcedure; begin //?? end; end. Ist das irgendwie möglich? Wenn nicht, dann werde ich wohl jeden möglichen Paramter mit if abfragen müssen :? |
Re: Adresse eine Funktion / Prozedur ermitteln
Schau dir mal den Befehl overload an.
|
Re: Adresse eine Funktion / Prozedur ermitteln
Hi,
Soweit ich weiß, ist das nicht möglich. Denn MethodAddress arbeitet ja mit der RTTI, die ja für proceduren nicht gespeichert wird. Es sieht also meines Wissens schlecht für dich aus. Gruß Neutral General |
Re: Adresse eine Funktion / Prozedur ermitteln
Zitat:
Über CommandLine kommt z.B. -bla ?blubb Dann will er procedure Bla mit Parameter blubb aufrufen. |
Re: Adresse eine Funktion / Prozedur ermitteln
Zitat:
Zitat:
|
Re: Adresse eine Funktion / Prozedur ermitteln
Ok, overload ist hier wohl nicht geeignet. Trotzdem würde ich nicht mit einen String arbeiten. Wie wäre es mit einem Aufzählungstyp? Ausserdem wieso programmierst du das nicht gleich in einer ordentlichen OOP-Struktur?
Aber wir wissen ja nicht was du da vorhast, wie auch immer viel Glück bei der Realisierung. |
Re: Adresse eine Funktion / Prozedur ermitteln
OK, ganz kurze und grobe Erklärung von dem, was ich vorhabe: Beutzer gibt in ein Edit einen Befehl ein. Befehl wird weitergegeben an meine Funktion, Funktion ruft die Funktion auf, deren Name mit dem des eingegebenen Strings übereinstimmt.
|
Re: Adresse eine Funktion / Prozedur ermitteln
Wären es Methoden einer Klasse (, die auch notfalls nur existiert um die procedure zu enthalten) dann hätte ich da was für dich :)
|
Re: Adresse eine Funktion / Prozedur ermitteln
Zitat:
|
Re: Adresse eine Funktion / Prozedur ermitteln
Delphi-Quellcode:
Übergeben werden kann prinzipell ein Array of TVarRec, dass du natürlich auch dynamisch erzeugen (vom Benutzer erzeugen/einstellen) lassen kannst.type // Deine Proceduren TProceduren = class published // Die proceduren class procedure ShowString(S: String); // Damit werden sie aufgerufen: class procedure RunMethod(AMethod: String; Params: array of Const); end; { TProceduren } class procedure TProceduren.RunMethod(AMethod: String; Params: array of Const); var proc: Pointer; i, off: Integer; max: Integer; begin proc := MethodAddress(AMethod); max := Length(Params); for i:= 2 to max-1 do begin off := i*8; asm mov edx,[Params] add edx,off movzx ecx,[edx+$04] mov edx,[edx] sub ecx,3 jnz @NoExt movzx ecx, word ptr [edx+$08] push ecx push [edx+$04] push [edx] jmp @LoopEnd @NoExt: push [edx] @LoopEnd: end; end; asm mov eax, max and eax, eax jz @Self sub eax,1 jz @Param1 @Param2: mov ecx, [Params]; add ecx, 8 movzx eax,[ecx+$04] mov ecx,[ecx] sub eax, 3 jnz @Param1 movzx eax, word ptr [ecx+$08] push eax push [ecx+$04] push [ecx] @Param1: mov edx, [Params] movzx eax,[edx+$04] mov edx, [edx] sub eax, 3 jnz @Self movzx eax, word ptr [edx+$08] push eax push [edx+$04] push [edx] @Self: mov eax,Self call proc end; end; class procedure TProceduren.ShowString(S: String); begin ShowMessage(S); end; // Anwendung: procedure TForm1.Button1Click(Sender: TObject); begin TProceduren.RunMethod('ShowString',['Hallo Welt']); TProceduren.RunMethod('ShowString',[Edit1.Text]); end; Gruß Neutral General |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:00 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