所以我有一個形式,德爾福傳遞函數而不是調用它(德爾福)
TFrmMainForm = class(TForm, IFrmMainFormInterface)
public
procedure Display(Sender:TObject);
end;
的接口是
IFrmMainFormInterface = interface
procedure Display(Sender:TObject);
end;
而另一個類
TMainFormViewModel = class
strict private
fTimer : TTimer;
function GetOnTimer : TNotifyEvent;
procedure SetOnTimer(timerEvent : TNotifyEvent);
public
property OnTimer : TNotifyEvent read GetOnTimer write SetOnTimer;
end;
implementation
function TMainFormViewModel.GetOnTimer : TNotifyEvent;
begin
Result := fTimer.OnTimer;
end;
procedure TMainFormViewModel.SetOnTimer(timerEvent : TNotifyEvent);
begin
fTimer.OnTimer := timerEvent;
end;
我有一個表單MainForm和視圖模型類的實例MainFormViewModel
,我想嘗試
MainFormViewModel.OnTimer := IFrmMainFormInterface(MainForm).Display
問題是這樣給我一個錯誤消息
沒有足夠的實際參數
我相信這是因爲德爾福試圖調用顯示函數而不是將其分配給OnTimer事件。我不知道如何解決這個問題,我試過使用@運營商沒有成功。
編輯
我要補充的是,MainForm的聲明在此功能
procedure Initialise<T:Class, IFrmMainFormInterface>(MainForm : T);
procedure TController.Initialise<T>(MainForm : T);
begin
MainFormViewModel.OnTimer := IFrmMainFormInterface(MainForm).Display ;
end;
我認爲DSharp有一些額外的功能,使處理匿名函數,但我希望我可以避免使用外部庫只是爲了這個 – sav 2014-09-23 08:01:59
爲什麼你會聲明'Initialise'那樣?似乎沒有泛型聲明它會更有表現力:'Initialise(MainForm:IFrmMainFormInterface)'。當然,這仍然不允許你將接口成員分配給一個標準的方法指針,但我很困惑你爲什麼有複雜的起點。 – 2014-09-24 23:27:55
我正在嘗試使用MVVM設計模式。在初始化過程中,我將表單綁定到ViewModel。綁定(MainFormViewModel,'ScheduledWorkRecords'); MainForm.WorkRecords:= binding;出於測試目的,我也有一個模擬用戶界面對象,可以用來代替實際的表單。 –
sav
2014-09-26 01:29:23