gpt4 book ai didi

Delphi7,Showmessage命令在申请表出现之前执行

转载 作者:行者123 更新时间:2023-12-03 15:48:29 25 4
gpt4 key购买 nike

我想知道为什么命令“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 是最后一个,它也会先执行。如何使消息在表单出现后出现,按钮在图像加载后隐藏?

谢谢

最佳答案

原因是表单是在显示之前创建的(因此,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 事件,每次表单获得键盘焦点时都会调用该事件:向表单添加私有(private)字段 FMessageShown: boolean类(class)。然后,在 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.)

关于Delphi7,Showmessage命令在申请表出现之前执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16131715/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com