是否有办法允许一个表单使用来自另一个表单的事件过程?
。我有一个叫做PongForm的表单和一个叫做ObstPongForm的表单。在PongForm和ObstPongForm上各有一个。是否有可能让ObstPongForm在它自己的"tick"事件中使用PongForm的"tick"事件的代码?也许通过让ObstPongForm从PongForm继承?
您可以简单地通过代码分配它(只要您可以访问两个实例):
ObstPongForm.Ticker.OnTick := PongForm.TickerTick;
是的,窗体就像其他类一样,Delphi支持可视继承,所以你可以正常调用继承方法。
如果ObstPongForm是PongForm的一个特殊版本,那么继承是有意义的,但要小心,因为ObstPongForm将继承来自PongForm的所有可视控件,包括您将来可能添加的任何控件。
也因为我假设你已经有两个窗体,使一个从另一个继承是可行的,但需要一些手动DFM编辑,主要是改变
Object ObstPongForm: TObstPongForm
来Inherited ObstPongForm: TObstPongForm
如果您希望重用的代码可能在几个不相关的表单中需要,那么将代码移动到这些表单使用的公共单元中可能是最佳解决方案
让这两个表单调用另一个实现它们使用的逻辑的类是更好的样式。如果你在OnTimer事件处理程序中编写所有的程序逻辑,那么你就走上了一条糟糕的道路,许多delphi程序员花了很多年才意识到这是一个糟糕的主意
一个表单需要调用你的方法,它是这样做的:
procedure TForm1.DoSomething;
begin
DataModule1.LogicMethod;
end;
在别处有一个定时器…
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;
事件处理程序只是普通的过程。如果你的ObstPongForm tick handler有额外的代码需要运行,那么你可以在需要的时候手动调用PongForm的tick handler,例如:
uses
..., PongForm;
procedure ObstPongForm.TickHandler(Sender: TObject);
begin
...
PongForm.TickHandler(Self);
...
end;