Проблемы в Showmodal после назначения Setparent (..) - PullRequest
3 голосов
/ 15 июня 2010

Я создал два приложения MainApps и SubApps, у SubApps есть диалоговое окно модального типа, такое как форма входа в систему / выхода из системы и т. Д., И оно нормально работает.

После того, как я прикрепил его к MainApps, в диалоговом окне Modal отображаетсякак нормальная коробка формы.Он работает как "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;

Ответы [ 2 ]

6 голосов
/ 15 июня 2010

Не удивляйтесь, то, что вы пытаетесь, в лучшем случае необычно.ShowModal достигает модального эффекта, отключая все окна вызывающего потока, кроме модальной формы.Поскольку ваша родительская форма не принадлежит одному и тому же потоку, даже одному и тому же процессу, она не отключается.См. DisableTaskWindows в forms.pas, чтобы понять, как формы отключаются при вызове ShowModal.

Вы должны разработать свою собственную модальную процедуру;проверить, если приложение создано в окне верхнего уровня, которое не является рабочим столом, отключите это окно, если это так.

Но на вашем месте я сначала подумал бы о дизайне, что если, fi, вы закроетеродительская форма, как вы заканчиваете процесс родительской формы?


edit: для третьего комментария ниже - вы можете попробовать использовать модальную форму, "принадлежащую" форме MainApps.Похоже на то, что формы принадлежат основной форме приложения, в то время как MainFormOnTaskbar верно.См. принадлежащие Windows на Особенности окна тема 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 ... Этот дизайн хрупок, вы можете продолжать сталкиваться с проблемами с ним ...

2 голосов
/ 15 июня 2010

Попробуйте сделать ваши окна "модальными для системы" вместо "модальных приложений".На самом деле, я понятия не имею, можете ли вы это сделать.Это может быть невозможно или плохая идея.На самом деле, весь вопрос дает мне запах "плохой идеи".

...