gpt4 book ai didi

delphi - 如何在应用程序的主窗体可见后立即出现对话框?

转载 作者:行者123 更新时间:2023-12-03 14:56:00 27 4
gpt4 key购买 nike

我一直在使用 TFormOnActivate 事件,让我有机会在应用程序启动后立即显示对话框。我希望主窗体已加载且可见。有什么好的方法可以做到这一点?

我发现 OnActivate 工作正常,除非表单 WindowStatewsMaximized

过去我已经通过各种方式完成了我想要的事情,但我希望有更好的方法。

这对我有用:

procedure TForm1.FormCreate(Sender: TObject);  
begin
Application.OnIdle:=OnIdle;
end;

procedure TForm1.OnIdle(Sender: TObject; var Done: Boolean);
begin
Application.OnIdle:=nil;
form2:=TForm2.Create(Application);
form2.ShowModal;
end;

有更好的方法吗?

最佳答案

在表单的 OnCreate 事件处理程序中发布用户消息并在消息处理程序中显示对话框:

unit Unit1;

interface

const
UM_DLG = WM_USER + $100;

type
TForm1 = class(TForm)
...
procedure UMDlg(var Msg: TMessage); message UM_DLG;
...

implementation

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

procedure TForm1.UMDlg(var Msg: TMessage);
begin
form2 := TForm2.Create(Application);
form2.ShowModal;
end;

尽管我发现计时器方法更好:只需在表单上放置一个计时器组件,将 Interval 设置为 100(毫秒)并实现 OnTimer 事件:

procedure Timer1Timer(Sender: TObject);
begin
Timer1.Enabled := False; // stop the timer - should be executed only once

form2 := TForm2.Create(Application);
form2.ShowModal;
end;
<小时/>

两种方法的区别在于:

当从 OnCreate 或 OnShow 处理程序发布用户消息时,该消息将以正常优先级分派(dispatch),这意味着其他窗口初始化消息可能会在其之后发布和处理。从本质上讲,WM_PAINT 消息将在 UM_DLG 消息之后处理。如果 UM_DLG 消息需要很长时间来处理而不泵入消息队列(例如,打开数据库连接),则表单将显示为空白,而不会绘制客户区域。

WM_TIMER 消息是低优先级消息,意味着将首先处理表单初始化消息,然后才处理 WM_TIMER 消息,即使 WM_TIMER 消息是在表单创建完成之前发布的。

关于delphi - 如何在应用程序的主窗体可见后立即出现对话框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6203090/

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