【问题标题】:Using another forms event procedure使用另一个表单事件过程
【发布时间】:2011-08-24 21:46:01
【问题描述】:

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

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

【问题讨论】:

  • 你可以,但是让这两种形式都调用另一个实现两者使用的逻辑的类会更好。如果您在 OnTimer 事件处理程序中编写所有程序逻辑,那么您将走上一条糟糕的道路,许多 delphi 程序员花了数年时间才意识到这是一个坏主意。
  • @warren 我认为你应该把它写下来作为答案。在我看来,这是正确的答案。
  • @David 我在我的回答中几乎写过,但似乎没有人喜欢它,出于某种原因
  • @daniel 我认为那是因为该信息隐藏在最后一段中。我会赞成一个简短的回答,说出沃伦所说的,仅此而已!

标签: delphi events tform


【解决方案1】:

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

ObstPongForm.Ticker.OnTick := PongForm.TickerTick;

【讨论】:

  • 请注意,当ObstPongForm.Ticker.OnTick 触发时,TickerTick 中的Self 变量将是PongForm,而不是ObstPongForm
  • 如果 OnTick 事件和处理程序被声明为 published,您甚至可以在设计时而不是在代码中执行此分配,只要 ObstPongForm 在其 uses 子句中包含 PongForm。
  • 小子真希望ObstPongForm在PongForm之前被销毁!
  • @Warren,我只回答了这个问题——我没有对设计发表评论(如果有的话)。
  • 我认为指出为什么(尤其是对于 wm_timer 消息)将具有不同生命周期的对象的方法连接到包含 wm_timer 事件处理程序的另一个对象是一个坏主意的原因是有帮助的。跨度>
【解决方案2】:

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

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

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

Object ObstPongForm: TObstPongFormInherited ObstPongForm: TObstPongForm

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

【讨论】:

    【解决方案3】:

    让两个表单都调用另一个实现两者使用的逻辑的类会更好。如果您在 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;
    

    【讨论】:

    • 根据要求,此评论现在是一个答案。 :-)
    【解决方案4】:

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

    uses
      ..., PongForm;
    
    procedure ObstPongForm.TickHandler(Sender: TObject);
    begin
      ...
      PongForm.TickHandler(Self);
      ...
    end;
    

    【讨论】:

    • 我会这样做:if Assigned(PongForm) then PongForm.TickHandler(Self)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多