Delphi7,Showmessage命令在应用程序表单出现之前执行

时间:2013-04-21 13:38:28

标签: delphi action message

我想知道为什么命令“showmessage”在申请表出现之前执行,我的意思是,每当我运行程序时,首先出现消息,然后是申请表:

procedure TForm1.FormCreate(Sender: TObject);
begin
button1.hide;
button2.hide;
image3.picture.loadfromfile('c:\EAS\std.bmp');
showmessage ('Hi');
end;

end.

delphi做的第一件事就是显示消息“Hi”。然后它完成剩下的工作(表单出现,隐藏按钮,加载图像等)。尽管showmessage是最后一个,但它首先被执行。如何在表单出现后显示消息,按钮是否隐藏图像是否已加载?

由于

1 个答案:

答案 0 :(得分:6)

原因是在显示表单之前创建了表单(因此,OnCreate被触发)。

解决方案1 ​​

一种解决方案是在创建表单时将窗口消息发布到表单。试试这个:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

const
  WM_GREETING = WM_USER + 1;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
  protected
    procedure WMGreeting(var Message: TMessage); message WM_GREETING;
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  PostMessage(Self.Handle, WM_GREETING, 0, 0);
end;

procedure TForm1.WMGreeting(var Message: TMessage);
begin
  ShowMessage('Created and shown!');
end;

end.

解决方案2

另一种解决方案是使用OnActivate事件,每当表单获得键盘焦点时调用该事件:向表单类添加私有字段FMessageShown: boolean。然后,在OnActivate中,如果标志为false(默认情况下是一个类的字段),则显示您的消息并将标志设置为true:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
    procedure FormActivate(Sender: TObject);
  private
    { Private declarations }
    FMessageShown: boolean;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormActivate(Sender: TObject);
begin
  if not FMessageShown then
  begin
    ShowMessage('Created and shown.');
    FMessageShown := true;
  end;
end;

end.

在实践中,两种方法都能很好地工作。第一个解决方案的缺点是它可能在某种程度上依赖于“实现细节”,而后者的缺点非常明显:每次表单重新设置键盘焦点时都会检查一个标记,即使表单最初创建后几周也是如此消息显示出来了。

解决方案3

一个既没有缺点又假设你不需要OnActivate事件的解决方案,只是在第一次(因此,只执行)执行后“取消分配”事件:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
    procedure FormActivate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormActivate(Sender: TObject);
begin
  ShowMessage('Created and shown.');
  OnActivate := nil;
end;

end.

(但是,如果您将OnActivate := nil替换为OnActivate := MySecondEventHandler,则此方法可以扩展到

}的情况。