AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi funktion aufrufen deren namen in einem string steckt
Thema durchsuchen
Ansicht
Themen-Optionen

funktion aufrufen deren namen in einem string steckt

Ein Thema von griever · begonnen am 5. Jul 2009 · letzter Beitrag vom 7. Jul 2009
Antwort Antwort
Seite 2 von 2     12   
griever

Registriert seit: 27. Apr 2008
19 Beiträge
 
#11

Re: funktion aufrufen deren namen in einem string steckt

  Alt 5. Jul 2009, 17:35
ok das ergibt sinn
dann fällt mir jetzt nur noch ein das ich den inhalt des strings als name für die variable (welche den pointer auf die funktion hat) z.B.:
string := 'abc';
abc := @funktion;

nur wie komme ich jetzt mit den namen der variablen im string an deren inhalt?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#12

Re: funktion aufrufen deren namen in einem string steckt

  Alt 5. Jul 2009, 17:42
Zitat von griever:
nur wie komme ich jetzt mit den namen der variablen im string an deren inhalt?
siehe oben


Delphi-Quellcode:
type TMyFunc = function(b: Byte);
  TMyArray = array of record
    name: String;
    func: TMyFunc;
  end;
var a: TMyArray;

function TestFunc(b: Byte);
begin
end;


SetLength(a, 1);
a[0].name := 'Test';
a[0].func := TestFunc; // 1

for i := 0 to High(a) do
  if a[i].name = {'Test'} then begin
    x := a[i].func({123});
    Break;
  end;
1: falls sich da wer wundert, daß dort nicht @TestFunk steht ... Delphi erkennt, daß Links ein Funktionszeiger erwartet wird und weiß, daß ich den Zeiger zur Funktion zuweisen will.
$2B or not $2B
  Mit Zitat antworten Zitat
griever

Registriert seit: 27. Apr 2008
19 Beiträge
 
#13

Re: funktion aufrufen deren namen in einem string steckt

  Alt 5. Jul 2009, 18:08
ok bin mir sicher das das funktioniert aber gibt es keinen befehl in delphi der direkt den inhalt eines stringes als name umwandelt (außer das findcomponents) weil sonst kann ich auch gleich
if string = 'abc' then abc(a,b); machen nur find ich das nicht "optional"
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#14

Re: funktion aufrufen deren namen in einem string steckt

  Alt 5. Jul 2009, 18:17
Erstelle eine Superklasse, die alle Methoden als published Property hat - dann kannst du mit der RTTI darauf zugreifen und eine Methode aufrufen, deren namen du im String hast.

Was soll das eigentlich mal werden? Vll. gibts da bessere Lösungen ...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#15

Re: funktion aufrufen deren namen in einem string steckt

  Alt 5. Jul 2009, 19:43
Zitat von griever:
ok bin mir sicher das das funktioniert aber gibt es keinen befehl in delphi der direkt den inhalt eines stringes als name umwandelt (außer das findcomponents) weil sonst kann ich auch gleich if string = 'abc' then abc(a,b); machen nur find ich das nicht "optional"
Was denkst du eigentlich, was FindComponent macht?

Das geht auch nur die in der Form registrierten Komponenten durch, welche auch in einer Art Array/Liste dort gespeichert sind.
Delphi-Quellcode:
function TComponent.FindComponent(const AName: string): TComponent;
var
  I: Integer;
begin
  if (AName <> '') and (FComponents <> nil) then
    for I := 0 to FComponents.Count - 1 do
    begin
      Result := FComponents[I];
      if SameText(Result.FName, AName) then Exit;
    end;
  Result := nil;
end;
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#16

Re: funktion aufrufen deren namen in einem string steckt

  Alt 5. Jul 2009, 20:51
Es ist zwar schon mehrfach angesprochen worden, aber hier mal ein konkretes Beispiel. Der Einfachheit halber geben die Funktionen lediglich einen Integer-Wert zurück:

Delphi-Quellcode:
type
  TMyFunc = function: Integer of object;

function CallObjectFunction(Instance: TObject; const FuncName: string): Integer;
var
  Func: TMyFunc;
  MVar: TMethod;
begin
  MVar.Data := Instance;
  MVar.Code := Instance.MethodAddress(FuncName);
  Assert(Assigned(MVar.Code));
  Func := TMyFunc(MVar);
  result := Func();
end;

type
{$METHODINFO ON}  // falls das nicht geht, müssen die Methoden published sein!
  TTestObject = class
  public
    function Test1: Integer;
    function Test2: Integer;
  end;

function TTestObject.Test1: Integer;
begin
  result := 42;
end;

function TTestObject.Test2: Integer;
begin
  result := 4711;
end;

procedure TestIt;
var
  res: Integer;
  TestObject: TTestObject;
begin
  TestObject := TTestObject.Create;
  try
    res := CallObjectFunction(TestObject, 'Test1');
    Assert(res = 42);
    res := CallObjectFunction(TestObject, 'Test2');
    Assert(res = 4711);
  finally
    TestObject.Free;
  end;
end;
Uwe Raabe
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#17

Re: funktion aufrufen deren namen in einem string steckt

  Alt 5. Jul 2009, 21:25
Und .MethodAddress macht genau das Selbe wie die anderen Vorschläge ... es durchsucht eine Liste nach den Namen und gibt einen Zeiger auf dessen zugeordnete Funktion zurück.
$2B or not $2B
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.477 Beiträge
 
Delphi 12 Athens
 
#18

Re: funktion aufrufen deren namen in einem string steckt

  Alt 7. Jul 2009, 14:32
Abhilfe schafft nur ein Precompiler, wie er z.B. in den meisten Basic-Dialekten eingesetzt wird.
Dieser würde die Funktionsaufrufe durch Token mit der entsprechenden Adresse oder Nummer ersetzen.
Dadurch wird dann die eigentliche Ausführung schneller.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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