我创建了两个应用程序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;
答案 0 :(得分:6)
不要惊讶,你所尝试的充其量是不寻常的。 ShowModal
通过禁用调用线程的所有窗口但是模式形式来实现模态效果。由于您的父表单不属于同一个线程,甚至不属于同一个进程,因此不会禁用它。请参阅forms.pas中的DisableTaskWindows
以了解在调用“ShowModal”时如何禁用表单。
你必须设计自己的模态程序;测试应用程序是否在不是桌面的顶级窗口中作为父级,如果是这种情况则禁用该窗口。
但如果我是你,我会首先考虑设计,如果,你关闭父表格,你如何结束父母表格的过程?
<小时/> 编辑以下第三条评论 - 您可以尝试使用MainApps表单“拥有”模式表单。类似于应用程序主表单所拥有的表单,MainFormOnTaskbar
为真。有关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 ......这个设计很脆弱,你可能会继续遇到问题......
答案 1 :(得分:2)
尝试将您的窗口设置为“系统模式”而不是“应用模式”。实际上,我不知道你是否能做到这一点。这可能是不可能的,也可能是个坏主意。事实上,整个问题给了我“坏主意”的气味。