我想知道为什么命令“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是最后一个,但它首先被执行。如何在表单出现后显示消息,按钮是否隐藏图像是否已加载?
由于
答案 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
,则此方法可以扩展到