我有一堆表格,我想使它们自动化,以便它们自己打开和关闭。
我知道如何打开它们(通过具有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添加到Object Inspector中的Modal Result中来创建按钮来关闭表单,但是我似乎无法明确地做到这一点
谁能看到它为什么不起作用?
谢谢
最佳答案
不起作用的原因是,VCL在显示表单的TCustomForm.ShowModal文件中主动将ModalResult设置为0,但是在开始检查对ModalResult的更改之前。因此,在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