问题在Showmodal后分配到Setparent(..)
-
27-09-2019 - |
题
我创建了两个应用程序MainApps和SubApps,SubApps有一个模式类型对话框如登录/注销的形式等等。及其工作的罚款。
之后我把它连接到MainApps,该模式对话框显示了像正常的框形式。它的行为就像"对话。显示"而不是"对话。SHOWMODAL";
我使用德尔菲编译器
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
实现模式的效果通过禁止所有的窗户调线,但该模式的形式。因为你的父形式不属于相同的线,甚至不相同的过程,它并不得到禁止。看看 DisableTaskWindows
在形式。考绩制度,以了解如何形式的无障碍的时候'ShowModal'被称为。
你必须制定自己的模式的程序;如果测试的应用程序是父在一个顶级的窗口那不是桌面上,禁止,窗口,如果是这种情况。
但如果我是你,我会认为在设计上首先,如果有什么,f。i., 你接近父母的形式,你怎么结束的父形成的过程?
编辑: 第3下面的评论-你可以尝试的具有模式"拥有"MainApps的形式。类似形式是拥有的应用程序主要形式的同时
MainFormOnTaskbar
是真实的。看看 拥有窗户 上 窗口的功能 主题msdn。
var
frmDialog: TfrmDialog;
begin
[...]
frmDialog := TfrmDialog.Create(Self, dtLogout);
try
SetWindowLong(frmDialog.Handle, GWL_HWNDPARENT, GetAncestor(Handle, GA_ROOT));
iMsgResult := frmDialog.ShowModal;
[...]
我谦恭地建议你去问一个问题上的一个建议的设计,为什么你想要实现的,例如,如果有关代码的再利用你可以主持您的SubApps形式在dll...这种设计是脆弱的,你可以继续运行到的问题与它...
其他提示
试着做你的windows“系统模式”,而不是“应用模式”。其实,我不知道,如果你甚至可以做到这一点。这可能是不可能的,或者是一个坏主意。事实上,整个问题让我“坏主意”的味道。
不隶属于 StackOverflow