![]() |
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?? |
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. |
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.
|
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:
aber dass mit der classe hört sich auch sehr gut an.
procedure Command(Name: string; Data: string);
type TExecute = procedure; var Execute: TExecute; begin uebergabe := Data; Execute := MethodAddress(Name); Execute; end; nur da ich in classen nicht so fitt binn, währe es schön, wenn mir da mal wer helfen könnte. |
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