我创建了两个应用程序MainApps和SubApps,SubApps具有模式类型对话框,如登录/注销表单等,并且工作正常。
将其附加到MainApps后,“模态对话框”显示为类似于普通框形式。它的行为类似于“ DIALOG.SHOW”而不是“ DIALOG.SHOWMODAL”;
我正在使用delphi编译器
SubApps buttonclick;
begin
with TfrmDialog.Create(Self, dtLogout) do
try
iMsgResult := ShowModal;
finally
Free;
end;
if iMsgResult = mrOk then
begin
dmVoca.FHomeworkXMLDoc.Active := False;
//Disabled Double Login
dmVoca.tmrDoubleLogin.Enabled := False;
................
end;
end;
MainApps ButtonClick
begin
setparent(findwindow(nil,'SubApps'),TabSheet1.Handle);
.........
end;
最佳答案
不要惊讶,您尝试的内容充其量是不寻常的。 ShowModal
通过禁用调用线程的所有窗口(但模式形式除外)来实现模式效果。由于您的父表单不属于同一线程,甚至不属于同一进程,因此不会被禁用。请参阅forms.pas中的DisableTaskWindows
以了解在调用“ ShowModal”时如何禁用表单。
您必须设计自己的模态程序;测试应用程序是否在不是桌面的顶级窗口中作为父项,请在这种情况下禁用该窗口。
但是,如果我是您,那么我会首先考虑设计,如果您关闭父窗体,该如何结束父窗体的处理呢?
编辑:对于下面的第3条评论-您可以尝试将模式表单归MainApps表单“拥有”。与MainFormOnTaskbar
为true时,由应用程序主表单拥有的表单类似。请参阅msdn的owned windows主题上的Window Features。
var
frmDialog: TfrmDialog;
begin
[...]
frmDialog := TfrmDialog.Create(Self, dtLogout);
try
SetWindowLong(frmDialog.Handle, GWL_HWNDPARENT, GetAncestor(Handle, GA_ROOT));
iMsgResult := frmDialog.ShowModal;
[...]
我会谦虚地建议您就设计要达到的目的提出一个问题,例如,如果是关于代码重用,则可以将SubApps表单托管在dll中。这种设计很脆弱,您可能会继续遇到问题...
关于delphi - 分配给Setparent(..)后Showmodal中的问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3045126/