我有一堆表格,我想使它们自动化,以便它们自己打开和关闭。

我知道如何打开它们(通过具有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

10-05 22:42