TProc к TNotifyEvent
далее в должности чей принятый ответ остается очень загадочным:
@Button1.OnClick := pPointer(Cardinal(pPointer( procedure (sender: tObject) begin ((sender as TButton).Owner as TForm).Caption := 'Freedom to anonymous methods!' end )^ ) + C)^;
интересно, можно ли придумать самый простой и элегантный способ сродни:
Button.OnClick :=
                    AnonProc2NotifyEvent (
                    procedure (Sender: TObject)
                    begin
                      ((Sender as TButton).Owner as TForm).Caption := 'Freedom to anonymous methods!'
                    end
                      );
чтобы достичь той же цели и где AnonProc2NotifyEvent является методом владельца кнопки со следующей подписью:
TOwnerOfButton = class(TForm)
  Button: TButton;
  ...
private
  ...
protected
  function AnonProc2NotifyEvent(aProc: TProc<TObject>): TNotifyEvent;
public
  ...
end;
это возможно и если да то как это реализовать ?
2 ответов
это сделает работу достаточно легко:
type
  TNotifyEventWrapper = class(TComponent)
  private
    FProc: TProc<TObject>;
  public
    constructor Create(Owner: TComponent; Proc: TProc<TObject>);
  published
    procedure Event(Sender: TObject);
  end;
constructor TNotifyEventWrapper.Create(Owner: TComponent; Proc: TProc<TObject>);
begin
  inherited Create(Owner);
  FProc := Proc;
end;
procedure TNotifyEventWrapper.Event(Sender: TObject);
begin
  FProc(Sender);
end;
function AnonProc2NotifyEvent(Owner: TComponent; Proc: TProc<TObject>): TNotifyEvent;
begin
  Result := TNotifyEventWrapper.Create(Owner, Proc).Event;
end;
на
для справки это то, что я получаю, я изучал Бэрри Келлиблог с в должности ссылается на предыдущий пост SO, упомянутый выше, и придумал это решение:
function TMainForm.Proc2NotifyEvent(const aProc: TNotifyReference): TNotifyEvent;
type
  TVtable = array[0..3] of Pointer;
  PVtable = ^TVtable;
  PPVtable = ^PVtable;
begin
  TMethod(Result).Code := PPVtable((@aProc)^)^^[3];
  TMethod(Result).Data := Pointer((@aProc)^);
end;
все еще загадочно, но инкапсулировано, поэтому облегчает задачу кодера по сравнению с начальным методом.
Я пытался привести в порядок MethRefToMethPtr и MakeNotify и поставить все это в один метод.
обратите внимание ,что было (небольшое) изменение подписи метода, аргумента aProc стало const.