Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Adresse eine Funktion / Prozedur ermitteln (https://www.delphipraxis.net/115619-adresse-eine-funktion-prozedur-ermitteln.html)

Fussball-Robby 15. Jun 2008 00:00


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:
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.
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).
Ist das irgendwie möglich? Wenn nicht, dann werde ich wohl jeden möglichen Paramter mit if abfragen müssen :?

omata 15. Jun 2008 00:04

Re: Adresse eine Funktion / Prozedur ermitteln
 
Schau dir mal den Befehl overload an.

Neutral General 15. Jun 2008 00:04

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

Die Muhkuh 15. Jun 2008 00:06

Re: Adresse eine Funktion / Prozedur ermitteln
 
Zitat:

Zitat von omata
Schau dir mal den Befehl overload an.

Er will imho sowas erreichen:

Über CommandLine kommt z.B. -bla ?blubb

Dann will er procedure Bla mit Parameter blubb aufrufen.

Fussball-Robby 15. Jun 2008 00:07

Re: Adresse eine Funktion / Prozedur ermitteln
 
Zitat:

Zitat von omata
Schau dir mal dir mal den Befehl overload an.

Inwiefern soll ich den hier benutzuen? Ich will ja nicht eine Funktion mehrfach mit verschiedenen Parametern deklarieren, sondern jenachdem, was für ein String als Parameter übergeben wird, eine andere Funktion aufrufen.

Zitat:

Zitat von Neutral General
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.

Hatte ich fast schon befürchtet :? Naja, dann mach ich mich mal ans if..then..else tippen.. Wenn jemand noch eine Idee hat, immer her damit.

omata 15. Jun 2008 00:11

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.

Fussball-Robby 15. Jun 2008 00:14

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.

Neutral General 15. Jun 2008 00:14

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 :)

Fussball-Robby 15. Jun 2008 00:15

Re: Adresse eine Funktion / Prozedur ermitteln
 
Zitat:

Zitat von Neutral General
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 :)

Na dann schieß mal los :thumb:

Neutral General 15. Jun 2008 00:23

Re: Adresse eine Funktion / Prozedur ermitteln
 
Delphi-Quellcode:

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;
Übergeben werden kann prinzipell ein Array of TVarRec, dass du natürlich auch dynamisch erzeugen (vom Benutzer erzeugen/einstellen) lassen kannst.

Gruß
Neutral General


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:00 Uhr.
Seite 1 von 4  1 23     Letzte »    

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