Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Псевдо MDI-окна и модальные окна  [new]
Док
Member

Откуда: Казань
Сообщений: 6222
Мужики, разъясните мне одну вещь.

Я делаю псевдо mdi приложение. При вызове модального окна из отстыкованного окошка я пытаюсь сделать так, чтобы модальное перекрывало только отстыкованное (вызвавшее его) окно, а не все окна приложения.

Это возможно в принципе? Или модальное окно всегда будет перекрывать любое окно приложения?

=================
Док.

Win7 Ultim x64/Deb 9.6 (MATE; gtk2) i386:
FB 3.0.2.32703, Lazarus 2.1(r.60225); FPC 3.3.1 (r.41075), IBX by -Rik-

К сообщению приложен файл. Размер - 71Kb
28 апр 19, 22:56    [21873829]     Ответить | Цитировать Сообщить модератору
 Re: Псевдо MDI-окна и модальные окна  [new]
Gerasimenko
Member

Откуда:
Сообщений: 4500
Док,

не понял: Parent ?
28 апр 19, 23:23    [21873845]     Ответить | Цитировать Сообщить модератору
 Re: Псевдо MDI-окна и модальные окна  [new]
Док
Member

Откуда: Казань
Сообщений: 6222
Gerasimenko
не понял: Parent ?

да, а что? TabSheet - родитель формы, при отстыковке Parent = nil (форме назначается ShowInTaskBar:= stAlways, чтобы на таскбаре отображалась ее кнопка). IsHasParent - паблик свойство формы (для отладки). Могу проект выложить, но он на Лазаре и требует транковый компилятор (там дженерики внутрях) .
28 апр 19, 23:46    [21873853]     Ответить | Цитировать Сообщить модератору
 Re: Псевдо MDI-окна и модальные окна  [new]
Gerasimenko
Member

Откуда:
Сообщений: 4500
Док
Gerasimenko
не понял: Parent ?

да, а что? TabSheet - родитель формы, при отстыковке Parent = nil (форме назначается ShowInTaskBar:= stAlways, чтобы на таскбаре отображалась ее кнопка). IsHasParent - паблик свойство формы (для отладки). Могу проект выложить, но он на Лазаре и требует транковый компилятор (там дженерики внутрях) .

автор
При вызове модального окна из отстыкованного окошка я пытаюсь сделать так, чтобы модальное перекрывало только отстыкованное (вызвавшее его) окно, а не все окна приложения

myModalForm.Parent:=myParentFreeForm ?
29 апр 19, 09:14    [21873936]     Ответить | Цитировать Сообщить модератору
 Re: Псевдо MDI-окна и модальные окна  [new]
Gerasimenko
Member

Откуда:
Сообщений: 4500
Gerasimenko
Док
пропущено...

да, а что? TabSheet - родитель формы, при отстыковке Parent = nil (форме назначается ShowInTaskBar:= stAlways, чтобы на таскбаре отображалась ее кнопка). IsHasParent - паблик свойство формы (для отладки). Могу проект выложить, но он на Лазаре и требует транковый компилятор (там дженерики внутрях) .

автор
При вызове модального окна из отстыкованного окошка я пытаюсь сделать так, чтобы модальное перекрывало только отстыкованное (вызвавшее его) окно, а не все окна приложения

myModalForm.Parent:=myParentFreeForm ?
Parent модальной формы присвоить форму из которой она вызвана: не?
29 апр 19, 09:15    [21873937]     Ответить | Цитировать Сообщить модератору
 Re: Псевдо MDI-окна и модальные окна  [new]
ziv-2014
Member

Откуда:
Сообщений: 351
Док,
Нет, потому что сначала вызывается процедура, которая делает disable для всех окон в проекте.
Потом вызывается модальная форма.
Потом снова вызывается процедура, которая делает enable для всех окон в проекте.
Тебе надо переделывать showmodal. Изучи данную процедуру.
29 апр 19, 10:26    [21873989]     Ответить | Цитировать Сообщить модератору
 Re: Псевдо MDI-окна и модальные окна  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 4836
Док
Мужики, разъясните мне одну вещь.

Я делаю псевдо mdi приложение. При вызове модального окна из отстыкованного окошка я пытаюсь сделать так, чтобы модальное перекрывало только отстыкованное (вызвавшее его) окно, а не все окна приложения.

Это возможно в принципе? Или модальное окно всегда будет перекрывать любое окно приложения?

Модальных окон во многооконном интерфейсе X-Window да и Windows, в принципе нет, это абстракция VCL (и LCL как его копипастера)

по характеру задачи тут конечно не ShowModal надо, а например окно с POPUP-стилем, в понимании WinAPI, Tab-ы же не блокируют выполнение
29 апр 19, 11:17    [21874055]     Ответить | Цитировать Сообщить модератору
 Re: Псевдо MDI-окна и модальные окна  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 60009
ziv-2014> Тебе надо переделывать showmodal. Изучи данную процедуру.

Ему не ShowModal надо переделывать, а делать Disable для
всех "родительских" форм (по цепочке) "псевдомодальной"
формы, кроме главной. При этом "родительская" форма в
данном случае - необязательно Parent/Owner, а вызвавшая
(для чего может понадобиться хранить соответствующую
ссылку в каждой форме и передавать её при каждом вызове).

Чтобы сделать всё это можно и ShowModal переделать, но
это некошерно, проще свой метод ShowPseudoModal добавить.

Posted via ActualForum NNTP Server 1.5

29 апр 19, 11:40    [21874099]     Ответить | Цитировать Сообщить модератору
 Re: Псевдо MDI-окна и модальные окна  [new]
Gator
Member

Откуда: Москва
Сообщений: 14357
В Вин я бы поигрался стилями модального окна(формы). А в *Nixах туплю
29 апр 19, 11:48    [21874111]     Ответить | Цитировать Сообщить модератору
 Re: Псевдо MDI-окна и модальные окна  [new]
Док
Member

Откуда: Казань
Сообщений: 6222
ziv-2014
Тебе надо переделывать showmodal. Изучи данную процедуру.

Чуйствовал, что придется в исходники лезть, но подумал, вдруг кто черный ход знает :)

Гаджимурадов Рустам
Ему не ShowModal надо переделывать, а делать Disable для
всех "родительских" форм (по цепочке) "псевдомодальной"
формы, кроме главной.

Увы, придется ручками делать Screen.DisableForms/EnableForms. Спасибо.
29 апр 19, 12:40    [21874180]     Ответить | Цитировать Сообщить модератору
 Re: Псевдо MDI-окна и модальные окна  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 60009
Док> Чуйствовал, что придется в исходники лезть,

Ты, как мы помним, упертый, поэтому спорить/убеждать
не буду, но на всякий случай повторю - правильнее/лучше
не переделывать/перекрывать ShowModal (туда можно
разве что подсмотреть за деталями), а сделать рядышком
свой метод, который будет делать что надо. Хотя можно и
VCL править, если ты свой фреймворк хочешь нарабатывать.

Док> Увы, придется ручками делать Screen.DisableForms/EnableForms. Спасибо.

Насколько я помню, этого не хватит, если мы имеем в виду одну
и ту же псевдомодальность (которая в отличие от модальности
позволяет одновременно/параллельно иметь несколько "доступных"
открытых псевдомодальных форм и необязательно дочерних).

Posted via ActualForum NNTP Server 1.5

29 апр 19, 14:40    [21874389]     Ответить | Цитировать Сообщить модератору
 Re: Псевдо MDI-окна и модальные окна  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 60009
P.S. "Disable" - необязательно именно вызов самого метода
Disable, можно просто не давать передавать фокус (Activate)
на родительскую (для псевдомодальной) форму.

Posted via ActualForum NNTP Server 1.5

29 апр 19, 14:42    [21874397]     Ответить | Цитировать Сообщить модератору
 Re: Псевдо MDI-окна и модальные окна  [new]
Док
Member

Откуда: Казань
Сообщений: 6222
Гаджимурадов Рустам
правильнее/лучше
не переделывать/перекрывать ShowModal (туда можно
разве что подсмотреть за деталями)

Так и я о чем :)

Гаджимурадов Рустам
этого не хватит, если мы имеем в виду одну
и ту же псевдомодальность

да уж, если б открывалось только одно псевдомодальное окно, то без проблем. Но с несколькими окнами, чую, придется повозиться.

Кстати, попутный вопрос (лень гуглить). Есть ли простой способ перебрать все окна экрана, которые относятся только к текущему приложению?
29 апр 19, 17:34    [21874672]     Ответить | Цитировать Сообщить модератору
 Re: Псевдо MDI-окна и модальные окна  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 4836
Док
Кстати, попутный вопрос (лень гуглить). Есть ли простой способ перебрать все окна экрана, которые относятся только к текущему приложению?
есть, но в VCL, например, проще использовать Application.Forms
29 апр 19, 20:20    [21874841]     Ответить | Цитировать Сообщить модератору
 Re: Псевдо MDI-окна и модальные окна  [new]
aleksandr-pro
Member

Откуда: Самара
Сообщений: 188
Док,

возможно с небольшими ограничениями правда но возможно, есть такая тема
http://rsdn.org/forum/delphi/2891825.all

вот оттуда и отчасти из других источников я делал процедурку которая при многооконном (правда не DMI)интерфейсе реализует как раз то что надо, сделана как раз способом который выше описывает
Гаджимурадов Рустам
ziv-2014> Тебе надо переделывать showmodal. Изучи данную процедуру.

Ему не ShowModal надо переделывать, а делать Disable для
всех "родительских" форм (по цепочке) "псевдомодальной"
формы, кроме главной. При этом "родительская" форма в
данном случае - необязательно Parent/Owner, а вызвавшая
(для чего может понадобиться хранить соответствующую
ссылку в каждой форме и передавать её при каждом вызове).

Чтобы сделать всё это можно и ShowModal переделать, но
это некошерно, проще свой метод ShowPseudoModal добавить.


Дабы не разводить жаркую дискуссию готов поделиться в почту, правда не знаю взлетит ли в Лазаре
29 апр 19, 20:52    [21874879]     Ответить | Цитировать Сообщить модератору
 Re: Псевдо MDI-окна и модальные окна  [new]
Док
Member

Откуда: Казань
Сообщений: 6222
aleksandr-pro
Дабы не разводить жаркую дискуссию готов поделиться в почту, правда не знаю взлетит ли в Лазаре

скинь, плз, с удовольствием гляну: dddoc лай яндек сру

Технически практически сделал, но интересно посмотреть, может твой лисапед изящнее :)
29 апр 19, 22:33    [21874989]     Ответить | Цитировать Сообщить модератору
 Re: Псевдо MDI-окна и модальные окна  [new]
ziv-2014
Member

Откуда:
Сообщений: 351
Док,
Скинь свою реализацию?
30 апр 19, 09:08    [21875199]     Ответить | Цитировать Сообщить модератору
 Re: Псевдо MDI-окна и модальные окна  [new]
Док
Member

Откуда: Казань
Сообщений: 6222
aleksandr-pro
возможно с небольшими ограничениями правда но возможно, есть такая тема
http://rsdn.org/forum/delphi/2891825.all

Увы, там все завязано на стили - не взлетает. Гляну вечерком твои демки.

ziv-2014
Скинь свою реализацию?

нет пока работоспособной реализации. Для одного открепленного окна есть, для нескольких - нет.

Лазарь, падла, не работает со стилями окна в CreateParams. Пытаюсь через Classes.TList реализовать, но там приложение падает с ошибкой External: SIGSEGV и при отладке вываливается в окно с ассемблером :)

зы. Сегодня предпраздничный день, традиционно народ пытается впрок все болячки залечить (чтоб потом 5 дней из дома не выходить). Поэтому у меня на всех 3х работах полная запись. Дома буду после 20 по Мск. Отпишусь позднее...
30 апр 19, 13:14    [21875472]     Ответить | Цитировать Сообщить модератору
 Re: Псевдо MDI-окна и модальные окна  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 60009
Док> Есть ли простой способ перебрать все окна экрана,

Окна - это которые Windows или формы?

Док> которые относятся только к текущему приложению?

Созданные или "все", видимые или "все" и т.д.?
Начни с Screen.Forms, а потом задашь доп.
вопросы, если не найдешь чего-то нужного.

Posted via ActualForum NNTP Server 1.5

30 апр 19, 18:13    [21875842]     Ответить | Цитировать Сообщить модератору
 Re: Псевдо MDI-окна и модальные окна  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 60009
aleksandr-pro> Дабы не разводить жаркую дискуссию готов поделиться
aleksandr-pro> в почту, правда не знаю взлетит ли в Лазаре

Дык выложи прямо сюда. Если там простыня
слишком большая - приложи файлом/архивом.

Posted via ActualForum NNTP Server 1.5

30 апр 19, 18:14    [21875844]     Ответить | Цитировать Сообщить модератору
 Re: Псевдо MDI-окна и модальные окна  [new]
aleksandr-pro
Member

Откуда: Самара
Сообщений: 188
Гаджимурадов Рустам,

уговорил :) PseudoModal.zip данный способ собран с множества разных источников, на правильность не претендую, на этой штуке у меня работает до сих достаточно большой проект, косяки встречаются связанные с последовательностью отображения форм, но достаточно редко.

если кто то дополнит буду благодарен, со своей стороны могу тестирование провести.
30 апр 19, 19:10    [21875895]     Ответить | Цитировать Сообщить модератору
 Re: Псевдо MDI-окна и модальные окна  [new]
Док
Member

Откуда: Казань
Сообщений: 6222
Гаджимурадов Рустам
Созданные или "все", видимые или "все" и т.д.?

че-та ты ворчлив сегодня больше обычного. Не выспался что ль?
30 апр 19, 21:17    [21875987]     Ответить | Цитировать Сообщить модератору
 Re: Псевдо MDI-окна и модальные окна  [new]
Док
Member

Откуда: Казань
Сообщений: 6222
aleksandr-pro,

демка классная, спасибо за познавательный код. На Лазаре со скрипом взлетело, но ниже лежащее окно не блокируется, увы. Может, я чего не так подправил
+
function TForm.MyShowModal(const ModalCaler:TCustomForm=nil):integer;
var
 ActiveWindow: HWnd;
 p_WINDOW:Forms.TForm;

 //в TCustomForm для дельфей эта процедура protected, в Лазаре - private
  procedure CloseModal;
  var
    CloseAction: TCloseAction;
  begin
    try
      CloseAction := caNone;
      if CloseQuery then
      begin
        CloseAction := caHide;
        DoClose(CloseAction);
      end;
      case CloseAction of
        caNone: ModalResult := 0;
        caFree: Release;
      end;
      { do not call widgetset CloseModal here, but in ShowModal to
        guarantee execution of it }
    except
      ModalResult := 0;
      Application.HandleException(Self);
    end;
  end;

begin
  if Owner=nil
    then p_WINDOW:=Screen.ActiveForm
    else p_WINDOW:=Tform(owner);

  ActiveWindow := GetActiveWindow;

  if ModalCaler<>nil
    then modalform:=ModalCaler
    else modalform:=TForm(p_WINDOW);

  EnableWindow(p_WINDOW.Handle,False);
  ModalResult:=0;
  RecreateWnd(modalform);////в Лазаре процедура требует в качестве параметра константу TCustomForm 
  Include(FFormState, fsModal);
  Show;
  try
    SendMessage(Self.Handle, CM_ACTIVATE, 0, 0);
    repeat
      Application.HandleMessage;
      if (Application.Terminated) or (not visible)
        then ModalResult:= mrCancel
        else
          if ModalResult <> 0 then
          begin
            CloseModal;
            Break;
          end
    until ModalResult <> 0;

    Result:= ModalResult;
    SendMessage(Self.Handle, CM_DEACTIVATE, 0, 0);
    modalform:= nil;
  finally
    Hide;
  end;
  Exclude(FFormState, fsModal);
  EnableWindow(p_WINDOW.Handle,true);
  if GetActiveWindow = Self.Handle then SetActiveWindow(ActiveWindow);
end;

end.

Если поковыряться захочется, аттачу проект

К сообщению приложен файл (project1.zip - 137Kb) cкачать
30 апр 19, 22:36    [21876019]     Ответить | Цитировать Сообщить модератору
 Re: Псевдо MDI-окна и модальные окна  [new]
aleksandr-pro
Member

Откуда: Самара
Сообщений: 188
Док,
по идее вот эта команда должна лочить "заднее" окно
EnableWindow(p_WINDOW.Handle,False);

p_WINDOW - это как раз parent_window то есть то окно с которого произошел вызов
может быть в лазаре как то иначе формы деактивируются, можно посмотреть код ShowModal и посмотреть как там сделано
1 май 19, 06:32    [21876120]     Ответить | Цитировать Сообщить модератору
 Re: Псевдо MDI-окна и модальные окна  [new]
Док
Member

Откуда: Казань
Сообщений: 6222
aleksandr-pro,

Я смотрел, если я правильно помню, там DisableForms используется с перебором всех форм приложения.

Кстати, на лазаре с твоим кодом видно, как перерисовываются окна на RecreateWnd, вылезая поверх других ;)
1 май 19, 15:32    [21876368]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Delphi Ответить