0

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

4

5 回答 5

4

对我来说唯一有意义的解释是 OnShow 事件未正确连接到您的处理程序。检查对象检查器或 .dfm 表单。如果您在代码中连接,请确保您足够早地连接。

于 2011-09-21T22:52:13.937 回答
1

当不调用 OnShow 事件时,还有另一种可能性

ShowWindow(Form.Handle, SW_SHOW);   

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

于 2011-09-22T09:06:01.957 回答
1

你应该在这里检查

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 函数名称。

于 2011-09-23T01:05:42.087 回答
0

如果您想在加载表单时做一些事情,并且您想确保所有组件都已初始化,您可以使用加载

protected
   procedure Loaded; override;

它在表单创建期间被调用。

它还有一个额外的好处,即弹出的表单已初始化,而不会像 OnActivate 那样缓慢地构建表单。

于 2011-09-23T07:51:07.887 回答
0

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

于 2011-11-21T11:13:08.327 回答