![]() |
Eventlist
Liste der Anhänge anzeigen (Anzahl: 1)
Moinmoin,
folgendes Problem: Ich möchte verschiedene Eventhandler (mit unterschiedlichen Parametern) in einer Liste (Dictionary) zwischen speichern und diese dann bei Bedarf einem anderen Objekt als Eventhandler hinterlegen. Mein Ansatz war ein Dictionary<STRING,TMethod> aber ich bekomm dann einfach den implementierten Handler nicht auf TMethod rüber. Zur verdeutlichung mal ein (simples) Beispiel-Proggi im Anhang. Kann mir da jemand auf die Sprünge helfen ? |
AW: Eventlist
Ich habe keine Ahnung was genau
Delphi-Quellcode:
ist, aber ich bin mir sicher das ist nicht was du suchst. Du willst nicht ein TMethod, sondern wohl ein
TMethod
Delphi-Quellcode:
oder [Delphi]procedure(Sender: TObject; Var param1: String) of object;
reference to procedure(Sender: TObject; Var param1: String);
Deklariere in deiner core.pas mal
Delphi-Quellcode:
oder
TMyCustomProcedure = reference to procedure(Sender: TObject; Var param1: String);
Delphi-Quellcode:
und ändere
TMyCustomProcedure = procedure(Sender: TObject; Var param1: String) of object;
Delphi-Quellcode:
auf
TMethod
Delphi-Quellcode:
ab.
TMyCustomProcedure
Dann sagt dir der Compiler noch dass dein
Delphi-Quellcode:
nicht funktionieren kann da du gerne
Button2Click
Delphi-Quellcode:
-Parameter möchtest und 'Wupti' kein
var
Delphi-Quellcode:
ist.
var
Also abgeändert auf
Delphi-Quellcode:
und was war hoffentlich was du wolltest 8-)
procedure TForm52.Button2Click(Sender: TObject);
var param: String; begin param := 'Wupti'; mylist.GetEvent('Event')(NIL, param); end; PS: Nimmst du bitte das
Delphi-Quellcode:
aus dem Button1-Click, harte Drogen sind in der Delphi-Praxis nicht zulässig.
Meth
|
AW: Eventlist
Günther hat ja schon den entscheidenden Hinweis mit der Deklaration des Event-Typs gegeben. Allerdings kannst du mit seiner Lösung nur gleichartige Events in der Eventlist speichern, was aber deine Vorgabe der verschiedenen Eventhandler nicht berücksichtigt.
Abhilfe schafft hier ein bisschen RTTI und die Verwendung von
Delphi-Quellcode:
als Listenelement:
TValue
Delphi-Quellcode:
unit core;
interface uses System.Classes, System.Generics.Collections, System.Rtti; TYPE TEventList = TDictionary<STRING, TValue>; TMyList = Class private flist: TEventList; public constructor Create; Destructor Destroy; override; function GetEvent<T>(const Name: string): T; overload; procedure SetEvent<T>(const Name: string; const Value: T); overload; End; implementation uses System.SysUtils; constructor TMyList.Create; begin inherited Create; flist := TEventList.Create; end; Destructor TMyList.Destroy; begin flist.free; inherited Destroy; end; function TMyList.GetEvent<T>(const Name: string): T; begin if (flist.containskey(name)) then result := flist[name].AsType<T> else RAise Exception.Create(name+' is not available !'); end; procedure TMyList.SetEvent<T>(const Name: string; const Value: T); begin if (not flist.containskey(name)) then flist.AddOrSetValue(name, TValue.From<T>(Value)) else Raise Exception.Create(name+' already assigned !'); end; end.
Delphi-Quellcode:
unit mainU;
interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls,core; type TMyEventHandler = procedure (Sender:TObject; const param1:String) of object; TMyEventHandler2 = procedure (Sender:TObject; const param1, param2:String) of object; type TForm52 = class(TForm) Button1: TButton; Button2: TButton; Button3: TButton; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); private mylist : TMylist; public procedure MyEventHandler(Sender:TObject; const param1:String); procedure MyEventHandler2(Sender: TObject; const param1, param2: String); end; var Form52: TForm52; implementation {$R *.dfm} procedure TForm52.Button1Click(Sender: TObject); begin mylist.SetEvent<TMyEventHandler>('Event', MyEventHandler); mylist.SetEvent<TMyEventHandler2>('Event2', MyEventHandler2); end; procedure TForm52.Button2Click(Sender: TObject); begin MyList.GetEvent<TMyEventHandler>('Event')(nil, 'Wupti'); end; procedure TForm52.Button3Click(Sender: TObject); begin MyList.GetEvent<TMyEventHandler2>('Event2')(nil, 'Wupti', 'Hallo'); end; procedure TForm52.FormCreate(Sender: TObject); begin mylist := TMyList.create; end; procedure TForm52.FormDestroy(Sender: TObject); begin mylist.free; end; procedure TForm52.MyEventHandler(Sender: TObject; const param1: string); begin ShowMessage(Param1); end; procedure TForm52.MyEventHandler2(Sender: TObject; const param1, param2: String); begin ShowMessage(Param1 + #13 + Param2); end; end. |
AW: Eventlist
Vielen Dank. Funzt :)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:23 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