Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Eventlist (https://www.delphipraxis.net/196338-eventlist.html)

Ghostwalker 14. Mai 2018 08:48

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 ?

Der schöne Günther 14. Mai 2018 09:22

AW: Eventlist
 
Ich habe keine Ahnung was genau
Delphi-Quellcode:
TMethod
ist, aber ich bin mir sicher das ist nicht was du suchst. Du willst nicht ein TMethod, sondern wohl ein
Delphi-Quellcode:
reference to procedure(Sender: TObject; Var param1: String);
oder [Delphi]procedure(Sender: TObject; Var param1: String) of object;


Deklariere in deiner core.pas mal
Delphi-Quellcode:
TMyCustomProcedure = reference to procedure(Sender: TObject; Var param1: String);
oder
Delphi-Quellcode:
TMyCustomProcedure = procedure(Sender: TObject; Var param1: String) of object;
und ändere
Delphi-Quellcode:
TMethod
auf
Delphi-Quellcode:
TMyCustomProcedure
ab.


Dann sagt dir der Compiler noch dass dein
Delphi-Quellcode:
Button2Click
nicht funktionieren kann da du gerne
Delphi-Quellcode:
var
-Parameter möchtest und 'Wupti' kein
Delphi-Quellcode:
var
ist.

Also abgeändert auf
Delphi-Quellcode:
procedure TForm52.Button2Click(Sender: TObject);
var
   param: String;
begin
   param := 'Wupti';
   mylist.GetEvent('Event')(NIL, param);
end;
und was war hoffentlich was du wolltest 8-)


PS: Nimmst du bitte das
Delphi-Quellcode:
Meth
aus dem Button1-Click, harte Drogen sind in der Delphi-Praxis nicht zulässig.

Uwe Raabe 14. Mai 2018 09:39

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:
TValue
als Listenelement:

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.

Ghostwalker 15. Mai 2018 06:34

AW: Eventlist
 
Vielen Dank. Funzt :)


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