1

有没有办法让一个表单使用另一个表单的事件过程?

例如,我有一个名为 PongForm 的表单和另一个名为 ObstPongForm 的表单。PongForm 上有一个代码,ObstPongForm 上有另一个。是否可以让 ObstPongForm 在它自己的 'tick' 事件中使用 PongForm 的 'tick' 事件中的代码?也许通过让 ObstPongForm 从 PongForm 继承?

4

4 回答 4

5

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

ObstPongForm.Ticker.OnTick := PongForm.TickerTick;
于 2011-08-24T21:54:57.090 回答
1

是的,表单和其他表单一样只是类,Delphi 支持可视化继承,所以可以正常调用继承的方法。

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

另外,由于我假设您已经拥有这两种形式,因此从另一种继承是可行的,但需要进行一些手动 DFM 编辑,主要是更改

Object ObstPongForm: TObstPongFormInherited ObstPongForm: TObstPongForm

如果您想要重用的代码可能需要在几个不相关的表单中,那么将代码移动到这些表单使用的公共单元可能是最好的解决方案

于 2011-08-24T22:03:09.253 回答
1

让两种形式都调用另一个实现两者使用的逻辑的类会更好。如果您在 OnTimer 事件处理程序中编写所有程序逻辑,那么您将走上一条糟糕的道路,许多德尔福程序员需要数年才能意识到这是一个坏主意

所以一个表单需要调用你的方法,它是这样的:

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;
于 2011-08-26T23:08:57.913 回答
0

事件处理程序只是普通程序。如果您的 ObstPongForm 刻度处理程序除了 PongForm 的代码之外还需要运行其他代码,那么您可以在需要时手动调用 PongForm 的刻度处理程序,例如:

uses
  ..., PongForm;

procedure ObstPongForm.TickHandler(Sender: TObject);
begin
  ...
  PongForm.TickHandler(Self);
  ...
end;
于 2011-08-24T22:01:51.577 回答