我有一堆表单,我想自动化他们,以便他们自己打开和关闭.
我知道如何让他们打开(通过使用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添加到对象检查器中的模态结果,但是我似乎无法明确地这样做
谁能看到为什么它不工作?
谢谢
解决方法
不工作的原因是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); end; procedure TProgressForm.UMActivated(var Message: TMessage); begin { Your code here } ModalResult := mrOk; end;
资料来源:NLDelphi