Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Gibt es etwas wie "FindProcedure"? (https://www.delphipraxis.net/178775-gibt-es-etwas-wie-findprocedure.html)

Opa Knack 27. Jan 2014 00:37

Gibt es etwas wie "FindProcedure"?
 
Hallo,

in meinem aktuellen Projekt erzeuge ich dynamische Objekte, denen wiederum Methoden zugewiesen werden sollen, die als Strings übergeben werden und die bereits erstellt wurden.

Als Beispiel:

Delphi-Quellcode:
procedure Tform.Prozedur1(Sender: TObject);
...

procedure Tform.Prozedur2(Sender: TObject);
...

procedure Tform.ProzedurenZuordnen(Vorgabe: String);
begin
   if(Vorgabe = 'prozedur1') then Komponente.OnClick := Prozedur1
   else if(Vorgabe = 'prozedur2') then Komponente.OnClick := Prozedur2;
end;
Mein Gedanke ist nun, dass dies die etwas unelegantere Lösung ist, da wesentlich mehr Prozeduren vergeben werden müssten. Also bräuchte ich etwas in der Form von

Delphi-Quellcode:
procedure Tform.ProzedurenZuordnen(Vorgabe: String);
begin
   Komponente.OnClick := FindProcedure(Vorgabe);
end;
(Ich hoffe, dass das halbwegs nachvollziehbar ist)

Leider kann ich nichts finden, was auch nur halbwegs in diese Richtung geht.

Hat jemand von euch einen Tipp, wie ich das umsetzen könnte?

Danke
Opa

Sir Rufo 27. Jan 2014 00:52

AW: Gibt es etwas wie "FindProcedure"?
 
Es gibt da so nette Sachen wie
Delphi-Quellcode:
ICommand = interface
  function CanExecute : Boolean;
  procedure Execute;
end;
Wenn du jetzt eine Instanz hättest, die dir zu einem String so ein Interface liefert
Delphi-Quellcode:
TCommandManager = class
  procedure RegisterCommand( const Name : string; Command : ICommand );
  property Command[const Name : string] : ICommand;
end;
dann lautet dein OnClick-Handler so
Delphi-Quellcode:
procedure TForm.KomponenteClick( Sender : TObject );
begin
  MyCommandManager.Command[ Vorgabe ].Execute;
end;

himitsu 27. Jan 2014 01:16

AW: Gibt es etwas wie "FindProcedure"?
 
Und dann gibt es auch noch die RTTI.

Opa Knack 28. Jan 2014 00:26

AW: Gibt es etwas wie "FindProcedure"?
 
Danke für die Tipps.

@Sir Rufo:

Vom Ansatz her richtig, nur setzt das doch eigentlich voraus, dass ich bei einem Auslösen erst einmal nach einer Referenz suche, die ich dann übergeben kann (wenn ich das richtig verstehe). Mein Ziel ist es aber, direkt bei der Erstellung der Komponente auf eine individuelle Prozedur zu verweisen (so, wie z. B. der OnClick-Event über den Objektmanager direkt mit einer Aktion verknüpft werden kann).

Ich habe also eine Quelle, in der die Komponenten verwaltet werden und die dann z. B. einen Eintrag für eine Combobox liefert. Diese Box wird erstellt und soll dann mit dem OnChange-Event verknüpft werden, der ebenfalls in der Quelle benannt wurde.

@himitsu:

Ich kenne mich nicht unbedingt mit RTTI aus. Aber soweit ich weiß, kann ich damit in diesem Fall (zumindest bei meinem 2006er) nicht wirklich viel anfangen, oder?

Habt ihr noch weitere Ideen?

Danke...

himitsu 28. Jan 2014 01:57

AW: Gibt es etwas wie "FindProcedure"?
 
Es gibt zwar inzwischen eine neue "erweiterte" RTTI (welche auch einer der Gründe ist, warum die EXEn so unverschämt groß werden),
aber die "Alte" ist immernoch vorhanden und wird schon seit vielen Jahrzehnten von der VCL benutzt.
> die Event-Methoden, welche im OI angehängt wurden (und natürlich die Property)

Die alte und wunderschön kleine RTTI enthält zwar nur Published-Felder/Methoden, aber das sollte doch ausreichen.
Also angefangen bei TObject.MethodAddress und aufgehört mit der Unit TypInfo.

ManBu 28. Jan 2014 07:14

AW: Gibt es etwas wie "FindProcedure"?
 
Hi,

folgender Code sollte das machen was du willst. Funktioniert allerdings nur solange die gesuchten Methoden published sind.


Code:
Type
   TTest = Class(TObject)
   (...)
   public
      function FindProcedure(const _Name : String) : TNotifyEvent;
   published
      procedure Prozedur1(Sender : TObject);
      procedure Prozedur2(Sender : TObject);
   End;

function TTest.FindProcedure(const _Name : String) : TNotifyEvent;
var
   m : TMethod;
begin
   m.Data := Pointer(Self);
   m.Code := Self.MethodAddress(Name);

   Result := TNotifyEvent(m);
end;

procedure TTest.ProzedurenZuordnen(Vorgabe: String);
begin
   Komponente.OnClick := FindProcedure(Vorgabe);
end;

Opa Knack 29. Jan 2014 00:14

AW: Gibt es etwas wie "FindProcedure"?
 
Hallo,

@ManBu: Danke, genau das war's. Nur musste "Self.MethodAddress(Name);" noch in "Self.MethodAddress(_Name);" vervollständigt werden.

@himitsu: Ich werde mich mit dem Thema noch auseinandersetzen. Danke Dir.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:24 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