Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Dynamischer Funktionsaufruf (https://www.delphipraxis.net/138569-dynamischer-funktionsaufruf.html)

testerjoe 12. Aug 2009 17:06


Dynamischer Funktionsaufruf
 
also ich habe eine liste von befehlen, zu denen jeweis eine bestimmte funktion oder prozedur gehört.
jetzt möchte ich nach einer eingabe überprüfen, ob der befehl existiert, und die dazugehörige funktion aufrufen...
mit einer case- anweisung und direktem aufruf der funktion geht sowas ja sehr einfach, doch wenn ich eine große liste von befehlen habe, wird mir diese case einfach zu lang.

wenn ich jetzt den nahmen der funktion als string habe, wie kann ich die funktion dynamisch zuweisen und aufrufen??

jfheins 12. Aug 2009 17:12

Re: Dynamischer Funktionsaufruf
 
Also so ein case kann ruhig lang werden, das macht gar nichts ;)
(wenn mans dann z.B. noch alphabetisch sortiert, bleibts auch übersichtlich)

Alternativ könntest du auch zusammengehörige Befehle in einer Klasse zusammenfassen, und dann im Hauptprogramm nur eine Liste führen. Und wenn dann ein Befehl kommt, gehst du einfach die Liste durch und "fragst" das Objekt, ob es mit dem Befehl was anfangen kann. Wenn nicht, weitersuchen, wenn ja abbrechen.

Apollonius 12. Aug 2009 17:20

Re: Dynamischer Funktionsaufruf
 
Das wäre doch eine nette Anwendung von message-Methoden. Einfach mit der message-Direktive eine Nummer zuweisen und dann mit TObject.Dispatch aufrufen lassen. Alternativ gehen natürlich auch published Methoden und RTTI (TObject.MethodAddress), das hätte dann auch den Vorteil, dass man statt Nummern Namen vergeben darf.

testerjoe 13. Aug 2009 13:11

Re: Dynamischer Funktionsaufruf
 
also mit dem MethodAddress habe ich das schon gut hinbekommen, nur mit parameter will es irgendwie nicht.
(habs erstmal über eine globale variable gelöst..)
Delphi-Quellcode:
procedure Command(Name: string; Data: string);
type
  TExecute = procedure;
var
  Execute: TExecute;
begin
  uebergabe := Data;
  Execute := MethodAddress(Name);
  Execute;
end;
aber dass mit der classe hört sich auch sehr gut an.
nur da ich in classen nicht so fitt binn, währe es schön, wenn mir da mal wer helfen könnte.

alzaimar 13. Aug 2009 13:36

Re: Dynamischer Funktionsaufruf
 
So gehts:
Delphi-Quellcode:
unit Unit4;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm4 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    procedure ExecMethod(aObject: TObject; MethodName, Param: string);
  published
    procedure Test(Astring: string);
  end;

var
  Form4: TForm4;

implementation

{$R *.dfm}

type
  TStringParamProc = procedure(aString: string) of object;

procedure TForm4.Button1Click(Sender: TObject);
begin
  ExecMethod(Self, 'Test', 'Hallo');
end;

procedure TForm4.Test(Astring: string);
begin
  showmessage('Bingo ' + aString);
end;

procedure TForm4.ExecMethod(aObject: TObject; MethodName, Param: string);
var
  Routine: TMethod;
  Exec: TStringParamProc;

begin
  Routine.Data := Pointer(aObject);
  Routine.Code := aObject.MethodAddress(MethodName);
  if not Assigned(Routine.Code) then Exit;
  Exec := TStringParamProc(Routine);
  Exec(Param);
end;

end.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:48 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz