AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Adresse eine Funktion / Prozedur ermitteln

Adresse eine Funktion / Prozedur ermitteln

Ein Thema von Fussball-Robby · begonnen am 15. Jun 2008 · letzter Beitrag vom 10. Dez 2013
Antwort Antwort
Seite 1 von 4  1 23     Letzte » 
Benutzerbild von Fussball-Robby
Fussball-Robby

Registriert seit: 22. Okt 2007
Ort: Nähe Köln
1.063 Beiträge
 
Delphi 7 Enterprise
 
#1

Adresse eine Funktion / Prozedur ermitteln

  Alt 15. Jun 2008, 01:00
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
Robert L.
Der folgende Satz ist richtig!
Der vorherige Satz ist falsch!

Paradox
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Adresse eine Funktion / Prozedur ermitteln

  Alt 15. Jun 2008, 01:04
Schau dir mal den Befehl overload an.
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

Re: Adresse eine Funktion / Prozedur ermitteln

  Alt 15. Jun 2008, 01:04
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
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von Die Muhkuh
Die Muhkuh

Registriert seit: 21. Aug 2003
7.332 Beiträge
 
Delphi 2009 Professional
 
#4

Re: Adresse eine Funktion / Prozedur ermitteln

  Alt 15. Jun 2008, 01:06
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.
  Mit Zitat antworten Zitat
Benutzerbild von Fussball-Robby
Fussball-Robby

Registriert seit: 22. Okt 2007
Ort: Nähe Köln
1.063 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: Adresse eine Funktion / Prozedur ermitteln

  Alt 15. Jun 2008, 01:07
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 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.
Robert L.
Der folgende Satz ist richtig!
Der vorherige Satz ist falsch!

Paradox
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Adresse eine Funktion / Prozedur ermitteln

  Alt 15. Jun 2008, 01:11
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.
  Mit Zitat antworten Zitat
Benutzerbild von Fussball-Robby
Fussball-Robby

Registriert seit: 22. Okt 2007
Ort: Nähe Köln
1.063 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: Adresse eine Funktion / Prozedur ermitteln

  Alt 15. Jun 2008, 01:14
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.
Robert L.
Der folgende Satz ist richtig!
Der vorherige Satz ist falsch!

Paradox
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#8

Re: Adresse eine Funktion / Prozedur ermitteln

  Alt 15. Jun 2008, 01:14
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
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von Fussball-Robby
Fussball-Robby

Registriert seit: 22. Okt 2007
Ort: Nähe Köln
1.063 Beiträge
 
Delphi 7 Enterprise
 
#9

Re: Adresse eine Funktion / Prozedur ermitteln

  Alt 15. Jun 2008, 01:15
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
Robert L.
Der folgende Satz ist richtig!
Der vorherige Satz ist falsch!

Paradox
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#10

Re: Adresse eine Funktion / Prozedur ermitteln

  Alt 15. Jun 2008, 01:23
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
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 15:21 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