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é