我正在自动化用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);
不会关闭图表形式,因此可以在主表单上继续执行,以便循环的下一次迭代。您必须手动关闭图表才能继续。
感谢任何帮助。
答案 0 :(得分:4)
您的基本问题是您已在GUI代码中编写了所有业务逻辑。因此,如果没有在问题中看到的复杂代码,您将无法执行要执行的代码。
如果你想解决你真正的问题,你将处理你的困境的根本原因。您将分离业务逻辑和GUI代码。您将安排您的业务逻辑能够在没有GUI的情况下执行。
如果您不想解决您的真实问题,并希望继续这种疯狂,则需要在WM_CLOSE
事件中向frmIIGraph.Handle
发送OnDeactivate
条消息TfrmEventEdit
的处理程序。据推测,您在TfrmIIGraph.FormActivate
中发布的内容正在被子表单的消息循环消耗,或者可能是对ProcessMessages
的一些调用。但我不能认为这是一种理智的方式。