使用另一个窗体事件过程



是否有办法允许一个表单使用来自另一个表单的事件过程?

。我有一个叫做PongForm的表单和一个叫做ObstPongForm的表单。在PongForm和ObstPongForm上各有一个。是否有可能让ObstPongForm在它自己的"tick"事件中使用PongForm的"tick"事件的代码?也许通过让ObstPongForm从PongForm继承?

您可以简单地通过代码分配它(只要您可以访问两个实例):

ObstPongForm.Ticker.OnTick := PongForm.TickerTick;

是的,窗体就像其他类一样,Delphi支持可视继承,所以你可以正常调用继承方法。

如果ObstPongForm是PongForm的一个特殊版本,那么继承是有意义的,但要小心,因为ObstPongForm将继承来自PongForm的所有可视控件,包括您将来可能添加的任何控件。

也因为我假设你已经有两个窗体,使一个从另一个继承是可行的,但需要一些手动DFM编辑,主要是改变

Object ObstPongForm: TObstPongFormInherited 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;

最新更新