有沒有任何方法允許一個表單使用另一個表單中的事件過程?使用其他表單事件過程
E.g.我有一個名爲PongForm的表單,另一個名爲ObstPongForm。 PongForm上有一個代碼,ObstPongForm上有另一個代碼。是否有可能讓ObstPongForm使用PongForm的'tick'事件中的代碼來處理它自己的'tick'事件?也許通過讓ObstPongForm繼承PongForm?
有沒有任何方法允許一個表單使用另一個表單中的事件過程?使用其他表單事件過程
E.g.我有一個名爲PongForm的表單,另一個名爲ObstPongForm。 PongForm上有一個代碼,ObstPongForm上有另一個代碼。是否有可能讓ObstPongForm使用PongForm的'tick'事件中的代碼來處理它自己的'tick'事件?也許通過讓ObstPongForm繼承PongForm?
只需通過代碼分配給它(只要你有機會獲得這兩種情況下):
ObstPongForm.Ticker.OnTick := PongForm.TickerTick;
只要注意的是,當'ObstPongForm.Ticker.OnTick'火災,在'TickerTick'了'Self'變量將是'PongForm',不'ObstPongForm'。 –
如果OnTick事件和處理程序被聲明爲「published」,那麼只要ObstPongForm的PongForm包含在它的'uses'子句中,您甚至可以在設計時而不是代碼中執行此任務。 –
男孩我真的希望ObstPongForm在PongForm之前銷燬! –
事件處理程序只是正常的程序。如果您ObstPongForm節拍處理程序具有它需要除了PongForm的代碼運行額外的代碼,那麼你可以手動調用PongForm的節拍處理程序需要時,如:
uses
..., PongForm;
procedure ObstPongForm.TickHandler(Sender: TObject);
begin
...
PongForm.TickHandler(Self);
...
end;
我會這樣做:'如果分配(PongForm)然後PongForm.TickHandler(Self)' –
是的,形式就像任何其他類,Delphi支持可視化繼承,所以你可以正常調用繼承的方法。
如果ObstPongForm是PongForm的專用版本,那麼繼承是有意義的,但要小心,因爲ObstPongForm將繼承PongForm中的所有可視控件,包括未來可能添加的任何控件。
此外,由於我假設你已經有兩種形式,從另一個使一個繼承是可行的,但需要一些手工DFM編輯,主要是改變
Object ObstPongForm: TObstPongForm
到 Inherited ObstPongForm: TObstPongForm
如果代碼要可能需要在若干不相關的形式重複使用,然後移動所述代碼以通過這些形式使用的公共單元可以是最佳的解決方案
這將是更好的風格有兩者的形式調用實現噸另一個類他用這兩種邏輯。如果你在你的OnTimer事件處理程序中編寫所有的程序邏輯,那麼你正在走向一條糟糕的道路,很多delphi程序員需要多年的時間才意識到這是一個糟糕的主意
所以一個表單需要調用你的方法,它是這樣的:
其他地方有一個計時器...
procedure TForm2.Timer1Timer(Sender:TObject);
begin
DataModule1.LogicMethod;
end;
,然後方法本身:
procedure TDataModule1.LogicMethod;
begin
// Everything that you used to have in Timer1Timer goes here, except the setting of
// UI properties in Form1 which is kept in Form1:
Inc(FCounter);// stupid example.
//
if Assigned(FOnResults) then
FOnResults(Self, FCounter, FDataObject1);
// Form2 is connected to FOnResults event, and stores the
// result in the UI somewhere.
end;
根據要求,現在這個評論是一個答案。 :-) –
你可以,但是讓兩個表單調用另一個實現兩者使用的邏輯的類將會是更好的方式。如果你在你的OnTimer事件處理程序編寫的所有程序邏輯,你的標題下一個壞的道路,許多德爾福程序員需要幾年時間才能實現是一個壞主意。 –
@warren我認爲你應該把它寫成答案。我認爲這是正確的答案。 –
@大衛我幾乎寫道,我的答案,但似乎沒有人喜歡它由於某種原因 –