AGB  ·  Datenschutz  ·  Impressum  







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

Eventlist

Ein Thema von Ghostwalker · begonnen am 14. Mai 2018 · letzter Beitrag vom 15. Mai 2018
Antwort Antwort
Ghostwalker

Registriert seit: 16. Jun 2003
Ort: Schönwald
1.299 Beiträge
 
Delphi 10.3 Rio
 
#1

Eventlist

  Alt 14. Mai 2018, 09:48
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 ?
Angehängte Dateien
Dateityp: zip eventlist.zip (3,8 KB, 9x aufgerufen)
Uwe
e=mc² or energy = milk * coffee²
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.158 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Eventlist

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


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


Dann sagt dir der Compiler noch dass dein Button2Click nicht funktionieren kann da du gerne var -Parameter möchtest und 'Wupti' kein 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


PS: Nimmst du bitte das Meth aus dem Button1-Click, harte Drogen sind in der Delphi-Praxis nicht zulässig.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#3

AW: Eventlist

  Alt 14. Mai 2018, 10:39
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 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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Ghostwalker

Registriert seit: 16. Jun 2003
Ort: Schönwald
1.299 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: Eventlist

  Alt 15. Mai 2018, 07:34
Vielen Dank. Funzt
Uwe
e=mc² or energy = milk * coffee²
  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 11:15 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