表格未按预期结束

时间:2014-08-07 19:17:30

标签: forms delphi delphi-2007

我正在自动化用Delphi编写的开源程序。从主窗体,我正在执行以下循环:

for i := 0 to analysisNames.Count - 1 do begin
    currentAnalysisName := analysisNames[i];
    analysisID := DatabaseModule.GetAnalysisIDForName(analysisNames[i]);
    frmIIGraph.autoMode := true;
    frmIIGraph.ShowModal();
end;

如您所见,它会打开一个名为frmIIGraph的表单。在该表单中,我必须打开另一个表单,我使用以下代码:

procedure TfrmIIGraph.FormActivate(Sender: TObject);
begin
  if autoMode then begin
    events := DatabaseModule.GetEvents(analysisID);
    frmEventEdit.autoMode := true;
    frmEventEdit.OpenDialog(events,0,analysisID);
    frmEventEdit.ShowModal();
    //frmEventEdit.Close;
    SetFocus;
    ModalResult := mrOK;
    PostMessage(Self.Handle,wm_close,0,0);
  end;
end;

从上面的方法打开的表单称为frmEventEdit。在该表单中,我运行此代码:

procedure TfrmEventEdit.FormActivate(Sender: TObject);
begin
  if autoMode then begin
    btnRTK_CalcClick(nil);
    ModalResult := mrOK;
    PostMessage(Self.Handle,wm_close,0,0);
  end;
end;

问题在于后一代码中的PostMessage(Self.Handle,wm_close,0,0);正常工作并关闭表单,在frmIIgraph SetFocus;处恢复代码。但是,IIGraph表单代码中的PostMessage(Self.Handle,wm_close,0,0);不会关闭图表形式,因此可以在主表单上继续执行,以便循环的下一次迭代。您必须手动关闭图表才能继续。

感谢任何帮助。

1 个答案:

答案 0 :(得分:4)

您的基本问题是您已在GUI代码中编写了所有业务逻辑。因此,如果没有在问题中看到的复杂代码,您将无法执行要执行的代码。

如果你想解决你真正的问题,你将处理你的困境的根本原因。您将分离业务逻辑和GUI代码。您将安排您的业务逻辑能够在没有GUI的情况下执行。

如果您不想解决您的真实问题,并希望继续这种疯狂,则需要在WM_CLOSE事件中向frmIIGraph.Handle发送OnDeactivate条消息TfrmEventEdit的处理程序。据推测,您在TfrmIIGraph.FormActivate中发布的内容正在被子表单的消息循环消耗,或者可能是对ProcessMessages的一些调用。但我不能认为这是一种理智的方式。