为什么OnShow不会被称为TForm?

时间:2011-09-21 22:35:29

标签: delphi events delphi-7 tform

我在Delphi 7的一个项目中工作,我对语言或运行时并不是非常亲密。我正在尝试调试一个表单可见和绘制的问题,但由于某种原因,不会调用OnShow事件。在什么情况下会发生这种情况?我应该在哪里看?

5 个答案:

答案 0 :(得分:4)

唯一对我有用的解释是OnShow事件未正确连接到您的处理程序。签入Object Inspector或.dfm表单。如果您要使用代码进行连接,请确保尽早连接。

答案 1 :(得分:1)

当使用

显示表单时,未调用OnShow事件时还有一种可能性
ShowWindow(Form.Handle, SW_SHOW);   

我在查看某个项目时看到过这样的事情,这对Delphi来说真是个坏主意。

答案 2 :(得分:0)

你应该在这里查看

Fist OnShow()必须被删除。

type
  TForm2 = class(TForm)
    procedure FormShow(Sender: TObject); // <--- IM HERE!
  private
    { Private declarations }
  public
    { Public declarations }
  end;

...其次

implementation

{$R *.dfm}

procedure TForm2.FormShow(Sender: TObject); <--- IM HERE!
begin
 //this time will trigger
end;

最后一件事,你应该打开Dfm寻找FormShow事件

object Form2: TForm2
  Left = 0
  Top = 0
  Caption = 'Form2'
  ClientHeight = 284
  ClientWidth = 418
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  OnShow = FormShow      <--- IM HERE! without this it will not trigger the OnFormShow
  PixelsPerInch = 96
  TextHeight = 13
end

如果仍然不起作用,可能会将其引用到其他函数名称OnShow = FormStart或wat ever函数名称。

答案 3 :(得分:0)

如果您想在加载表单时执行某些操作,并且希望确保所有组件都已初始化,则可以使用已加载的

protected
   procedure Loaded; override;

在表单创建过程中调用它。

它具有额外的好处,即弹出窗体而不会像OnActivate那样缓慢构建窗体。

答案 4 :(得分:0)

当没有调用使用对象检查器设置的OnShow处理程序时出现类似的问题,我发现在程序执行期间分配了另一个处理程序覆盖我的设置,因此您也可以在代码中查找可能的OnShow赋值。