Einzelnen Beitrag anzeigen

Andre1

Registriert seit: 19. Nov 2016
8 Beiträge
 
#1

Event handler dynamisch setzen

  Alt 20. Feb 2023, 23:06
Delphi-Version: 10.2 Tokyo
Hallo,

ich möchte einen Event Handler dynamisch setzen. Der Event Handler hat dieselbe Signatur wie TNotifyEvent
in dem dynamischen Coding kann ich aber nicht das Symbol "TNotifyEvent" verwenden, deshalb habe ich ein
neues Symbol "TEventArgsRef" angelegt, das identisch ist.

Das Beispiel ist auf ein minimum reduziert:

Delphi-Quellcode:
program ex1;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils,
  System.classes, Rtti;

type
  TEventArgsRef = procedure(Sender: TObject) of object;

type
  TWrapper = class(TObject)
  private
  public
  published
    procedure Event(Sender: TObject);
  end;

procedure TWrapper.Event(Sender: TObject);
begin
  writeln('Event');
end;

var
  sl: TStringlist;
  Event: TEventArgsRef;
  value: TValue;
  context: TRttiContext;
  rttiType: TRttiType;
  prop: TRttiProperty;
begin
  sl := TStringlist.Create;
  Event := TWrapper.Create().Event;

  context := TRttiContext.Create;
  rttiType := (context.GetType(sl.ClassType));
  prop := rttiType.GetProperty(string('OnChange'));

  // Does not work
  //TValue.Make(@event, prop.PropertyType.handle, value);
  //prop.SetValue(sl, value);

  // Does also not work
  prop.SetValue(sl, TValue.From<TEventArgsRef>(Event));

  sl.Add('foo');
end.
Der Versuch mit TValue.Make führt zu einer Speicherausnahme. Auch TValue.From funktioniert nicht,
hier kommt "Ungültige Typenumwandlung", obwohl TEventArgsRef und TNotifyEvent diesselbe Signatur haben.
Gibt es einen Weg das Coding zum Laufen zu bringen, ohne im dynamischen Coding das Symbol TNotifyEvent
zu benutzen?

Viele Grüße
André
  Mit Zitat antworten Zitat