Я пытаюсь десериализовать форму.
Один из объектов в сериализованной форме имеет метод, который принимает серию событий в качестве параметров.
Теперь, когда у меня нет типа класса объекта при десериализации, у меня есть метод для объекта, выполняющего десериализацию, называемый AddMethod, который объявлен так:
procedure TMyDeserializer.AddMethod(ControlName, EventName: String;
MethodAddr: Pointer);
var
TargetControl : TControl;
Method : TMethod;
begin
if Not Assigned(TempForm) then
Exit;
if TempForm.Name = ControlName then
TargetControl := TempForm
else
TargetControl := TempForm.FindChildControl(ControlName);
if Assigned(TargetControl) then
begin
Method.Code := MethodAddr;
Method.Data := TargetControl;
SetMethodProp(TargetControl, EventName, Method);
end;
end;
Чтобы я мог вставлять подпрограммы в различные элементы управления при десериализации их, проблема в том, что мне нужно добавить события в виде списка параметров (не в элемент управления). например, * +1008 *
SetUpEvents(EventHandler1:TNotifyEvent;EventHandler2:TNotifyEvent);
Где EventHandler1 и EventHandler2 определены где-то в коде как
Procedure EventHandler1(Sender:TNotifyEvent);
begin
// Do something
end;
Это не методы, а отдельные подпрограммы.
Когда я назначаю их объектам, подпрограмма не обязательно должна быть частью объекта, поскольку процедура AddMethod обрабатывает ее с помощью вызова, подобного
MyDeserializerInstance.AddMethod('Button1','OnClick',@EventHandler1);
Это работает для стандартных обработчиков событий, таких как Button1.OnClick, но не, если я хочу сделать
Procedure SetUpButton1Click(Method: TNotifyEvent)
begin
TButton(MyDeserializerInstance.TempForm.FindChildControl('Button1')).OnClick = Method;
end;
Проблема в том, что я не могу передать подпрограмму как метод в пример процедуры установки.
Создаваемая форма не объявляется в интерфейсе и полностью определяется файлом, из которого она читается, а также несколькими отдельными подпрограммами в коде.
Итак, я полагаю, что вопрос заключается в том, как превратить подпрограмму в метод во время выполнения (после создания объекта, частью которого он должен быть), и если я не могу этого сделать, как передать подпрограммы в коде? как параметры в другом методе?
До сих пор я пытался привести TMethod как правильный тип события и заполнить .Data как TempForm. Он вызвал правильный метод, но зашифровал параметры.
Delphi версия 2007