我创建了两个应用程序 MainApps 和 SubApps,SubApps 有一个模式类型对话框,例如登录/注销表单等,并且工作正常。
将其附加到 MainApps 后,模态对话框显示为正常的框形式。它的行为类似于“DIALOG.SHOW”而不是“DIALOG.SHOWMODAL”;
我正在使用delphi编译器
单击子应用程序按钮;
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;
单击主要应用程序按钮
begin
setparent(findwindow(nil,'SubApps'),TabSheet1.Handle);
.........
end;
不要感到惊讶,你正在尝试的事情充其量只是不寻常。ShowModal
通过禁用调用线程除模态窗体之外的所有窗口来实现模态效果。由于您的父窗体不属于同一线程,甚至不属于同一进程,因此它不会被禁用。看DisableTaskWindows
在 forms.pas 中了解调用“ShowModal”时如何禁用表单。
您必须设计自己的模态程序;测试应用程序是否在不是桌面的顶级窗口中建立父级,如果是这种情况,请禁用该窗口。
但如果我是你,我会首先考虑设计,如果,例如,你关闭父窗体,你如何结束父窗体的进程?
edit: for 3rd comment below - you might try having the modal form "owned" by the MainApps's form. Similiar to forms being owned by the application main form while
MainFormOnTaskbar
is true. See
owned windows on
Window Features topic of msdn.
var
frmDialog: TfrmDialog;
begin
[...]
frmDialog := TfrmDialog.Create(Self, dtLogout);
try
SetWindowLong(frmDialog.Handle, GWL_HWNDPARENT, GetAncestor(Handle, GA_ROOT));
iMsgResult := frmDialog.ShowModal;
[...]
我谦虚地建议你提出一个关于你想要实现的设计建议的问题,例如,如果它是关于代码重用,你可以在 dll 中托管你的 SubApps 表单......这个设计很脆弱,你可能会继续遇到问题...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)