delphi 7关闭可用模态形式在特定条件下停用

Pre*_*ias 3 forms delphi delphi-7

我正在使用delphi 7工作项目,该项目是一个维护项目,我不是项目的原始编码器,我有一种情况,我需要在某些情况下通过代码创建后关闭可用的表单,表格是模特

这是示例代码

       var 
       frmStratum : TfrmStratum;
       begin
          if not assigned(frmStratum) then myMainForm.OnExecute(PropAction);
        end; 
Run Code Online (Sandbox Code Playgroud)

在myMainForm.OnExecute(PropAction)中; 我有

frmStratum := TfrmStratum.Create(Self, Self as IStratum,inttostr(m_surveyno),Module,m_stations,false);
Run Code Online (Sandbox Code Playgroud)

现在程序TfrmStratum.FormActivateTfrmStratum 我做很多calucaltion和写入数据库

var
  if (bMassStratumExport) AND (bDoneOne)  then
  begin
             //write to database..
  end;
Run Code Online (Sandbox Code Playgroud)

现在我不得不这样做ATLEAST 20倍

1. Create the form
2. onactivate do database writing
3. close TfrmStratum
Run Code Online (Sandbox Code Playgroud)

因为它是一种模态形式,所以我无法关闭,如果在我创建它的地方下面,所以我想在第2步完成时关闭它onactivate

现在我试过这个

  if (bMassStratumExport) AND (bDoneOne) AND NOT (bReadyToclose) then
 begin
    //do database writing
    if bNowClo then frmStratum.close;
 end
Run Code Online (Sandbox Code Playgroud)

编辑:(编辑,以使问题更清楚)

表单的onactivate(frmStratum),我想关闭模态表单(frmStratum),所以我这样做

procedure TfrmStratum.FormActivate(Sender: TObject);
 begin
  if (bMassStratumExport) AND (bDoneOne) AND NOT (bReadyToclose) then
    begin
      //do database writing
      if bNowClo then self.close;// i need to close the form after after doing database write
    end
  end;
Run Code Online (Sandbox Code Playgroud)

但是控制虽然窃听到了自我关闭但它并没有关闭形式.如何解决这个问题?

Ton*_*son 5

假设它的frmStatum是无效的,它会给你A/V异常

如果bNowClo然后self.close;


Mar*_*der 5

在过去,当我需要在激活期间关闭表单时,我向自己发布了一条消息,而不是调用self.close.

PostMessage(Self.Handle, WM_CLOSE, 0, 0);
Run Code Online (Sandbox Code Playgroud)

我试图找到我指向这个方向的原始来源,但我找不到它.

PostMessage将立即返回,而不是等待处理消息.一旦OnActivate函数完成并且消息Delphi处理循环处理消息关闭将在您的表单上调用.