AGB  ·  Datenschutz  ·  Impressum  







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

Gibt es etwas wie "FindProcedure"?

Ein Thema von Opa Knack · begonnen am 27. Jan 2014 · letzter Beitrag vom 29. Jan 2014
Antwort Antwort
Opa Knack

Registriert seit: 28. Dez 2004
Ort: Köln
166 Beiträge
 
#1

Gibt es etwas wie "FindProcedure"?

  Alt 27. Jan 2014, 01:37
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
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Gibt es etwas wie "FindProcedure"?

  Alt 27. Jan 2014, 01:52
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;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Gibt es etwas wie "FindProcedure"?

  Alt 27. Jan 2014, 02:16
Und dann gibt es auch noch die RTTI.
$2B or not $2B
  Mit Zitat antworten Zitat
Opa Knack

Registriert seit: 28. Dez 2004
Ort: Köln
166 Beiträge
 
#4

AW: Gibt es etwas wie "FindProcedure"?

  Alt 28. Jan 2014, 01:26
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...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Gibt es etwas wie "FindProcedure"?

  Alt 28. Jan 2014, 02:57
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.
$2B or not $2B

Geändert von himitsu (28. Jan 2014 um 03:00 Uhr)
  Mit Zitat antworten Zitat
ManBu

Registriert seit: 4. Mär 2008
9 Beiträge
 
#6

AW: Gibt es etwas wie "FindProcedure"?

  Alt 28. Jan 2014, 08:14
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;
  Mit Zitat antworten Zitat
Opa Knack

Registriert seit: 28. Dez 2004
Ort: Köln
166 Beiträge
 
#7

AW: Gibt es etwas wie "FindProcedure"?

  Alt 29. Jan 2014, 01:14
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.
  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 22:32 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