Я знаю, что вы пометили вопрос как ответ, но вот некоторые другие предложения:
type
IClicker = Interface
function GetOnClickProc : TNotifyEvent;
End;
type
TBlob = class( TInterfacedObject, IClicker )
procedure OnClick( Sender : TObject );
function GetOnClickProc : TNotifyEvent;
end;
{ TBlob }
function TBlob.GetOnClickProc : TNotifyEvent;
begin
Result := Self.OnClick;
end;
procedure TBlob.OnClick(Sender: TObject);
begin
MessageDlg('Clicked !', mtWarning, [mbOK], 0);
end;
{ MyForm }
var
clicker : IClicker;
begin
...
menuItem.OnClick := clicker.GetOnClickProc;
end;
Конечно, вы должны быть осторожны с временем жизни объекта "кликера" ...
Если вы можете управлять своими объектами как объектами (а не только как интерфейсами), попробуйте добавить общий подкласс:
type
TClicker = class
procedure OnClick( Sender : TObject ); virtual;
end;
var
lClicker : TClicker;
...
menuItem.OnClick := lClicker.OnClick;
Я бы также обратился за комментарием к Cosmin Prund: создайте специализированный подкласс TMenuItem.