gpt4 book ai didi

delphi - 使用 ModalResult 退出表单

转载 作者:行者123 更新时间:2023-12-03 14:36:53 25 4
gpt4 key购买 nike

我有一堆表单,我想将它们自动化,以便它们可以自行打开和关闭。

我知道如何打开它们(通过 OnActivate 函数),但我无法关闭它们。

例如,我有

procedure TProgressForm.FormActivate(Sender: TObject);
begin
inherited;
if FModItem.IsInQueue then
begin
RunBtnClick(Self);
ModalResult := mrOK;
end;
end;

运行一个函数。我想在函数运行后关闭窗口,这就是 ModalResult 应该做的。

(我还尝试在 RunBtnClick 过程的最后添加 ModalResult 行,但这也不起作用)

我正在创建这样的表单:

ProgForm := TProgressForm.Create(Self, FModItem);
Self.Visible := False;
try
if ProgForm.ShowModal = mrOK then
begin
Left := ProgForm.Left;
Top := ProgForm.Top;
end;

我已经能够创建按钮来关闭表单,只需将 mrOK 添加到对象检查器中的模态结果中,但我似乎无法明确执行此操作

有人能看出为什么它不起作用吗?

谢谢

最佳答案

不工作的原因是,在显示表单之后、开始检查对 ModalResult 的更改之前,VCL 在 TCustomForm.ShowModal 中主动将 ModalResult 设置为 0。所以在 OnActivate 和 OnShow 中,你太早了。

解决方案是延迟通知。这可以通过 PostMessage 来完成,如下所示:

const
UM_ACTIVATED = WM_USER + 1;

type
TProgressForm = class(TForm)
procedure FormActivate(Sender: TObject);
private
procedure UMActivated(var Message: TMessage); message UM_ACTIVATED;
end;

...

procedure TProgressForm.FormActivate(Sender: TObject);
begin
PostMessage(Handle, UM_ACTIVATED, 0, 0);
end;

procedure TProgressForm.UMActivated(var Message: TMessage);
begin
{ Your code here }
ModalResult := mrOk;
end;

来源:NLDelphi

关于delphi - 使用 ModalResult 退出表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6036375/

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