Проблемы в ShowModal после назначения SetParent (..)
-
27-09-2019 - |
Вопрос
Я создал два приложения MainApps и Subapps, Subapps имеет диалогообкуку модального типа, такое как форма входа / выхода из системы и т. Д., И его работают нормально.
После подключения к MainApps модальное диалоговое окно отображается как формальная форма коробки. Это ведет себя как «диалог. Show» вместо «диалога. ShowModal»;
Я использую Compiler 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
достигает модального эффекта, отключая все окна вызовов потока, но модальная форма. Поскольку ваша родительская форма не принадлежит к тому же нити, даже не в том же процессе, он не отключен. Видеть DisableTaskWindows
В формах. Понять, как формы отключены, когда называется «ShowModal».
Вы должны разработать свою собственную модальную процедуру; Испытайте, если приложение осуществляется в родиве в окне верхнего уровня, это не на рабочем столе, отключите это окно, если это так.
Но если бы я был тобой, я бы сначала подумал о дизайне, что если, если вы закрываете родительскую форму, как вы закончите процесс формы в родиве?
редактировать: Для 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 «Системный модаль» вместо «модаль приложения». На самом деле, я понятия не имею, если вы даже можете сделать это. Это может быть невозможно или плохое представление. На самом деле весь вопрос дает мне «плохой идею».