我正在自动化用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);
不会关闭图形表单,因此对于循环的下一次迭代,可以在主表单上继续执行。您必须手动关闭图形才能继续。任何帮助表示赞赏。
最佳答案
您的基本问题是,您已将所有业务逻辑编码为GUI代码。因此,如果没有问题中看到的复杂代码,就无法执行要执行的代码。
如果您想解决自己的实际问题,则可以解决造成麻烦的根本原因。您将分离业务逻辑和GUI代码。您将安排您的业务逻辑能够在没有GUI的情况下执行。
如果您不想解决真正的问题,并希望继续这种疯狂,则需要在WM_CLOSE
的frmIIGraph.Handle
事件处理程序中向OnDeactivate
发送TfrmEventEdit
消息。大概您在TfrmIIGraph.FormActivate
中发布的内容已被子窗体的消息循环或某些对ProcessMessages
的调用所占用。但是我不能认为这是理智的前进方式。
关于forms - 表格未关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25190453/