AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Dynamischer Funktionsaufruf

Ein Thema von testerjoe · begonnen am 12. Aug 2009 · letzter Beitrag vom 13. Aug 2009
Antwort Antwort
testerjoe

Registriert seit: 6. Jun 2007
2 Beiträge
 
#1

Dynamischer Funktionsaufruf

  Alt 12. Aug 2009, 18:06
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??
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

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

Re: Dynamischer Funktionsaufruf

  Alt 12. Aug 2009, 18:12
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.
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Dynamischer Funktionsaufruf

  Alt 12. Aug 2009, 18:20
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.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
testerjoe

Registriert seit: 6. Jun 2007
2 Beiträge
 
#4

Re: Dynamischer Funktionsaufruf

  Alt 13. Aug 2009, 14:11
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.
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#5

Re: Dynamischer Funktionsaufruf

  Alt 13. Aug 2009, 14:36
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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Antwort Antwort


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 06:58 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