Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Псевдо MDI-окна и модальные окна / 25 сообщений из 48, страница 1 из 2
28.04.2019, 22:56
    #39807358
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Псевдо MDI-окна и модальные окна
Мужики, разъясните мне одну вещь.

Я делаю псевдо 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-
...
Рейтинг: 0 / 0
28.04.2019, 23:23
    #39807361
Gerasimenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Псевдо MDI-окна и модальные окна
Док,

не понял: Parent ?
...
Рейтинг: 0 / 0
28.04.2019, 23:46
    #39807364
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Псевдо MDI-окна и модальные окна
Gerasimenkoне понял: Parent ?
да, а что? TabSheet - родитель формы, при отстыковке Parent = nil (форме назначается ShowInTaskBar:= stAlways, чтобы на таскбаре отображалась ее кнопка). IsHasParent - паблик свойство формы (для отладки). Могу проект выложить, но он на Лазаре и требует транковый компилятор (там дженерики внутрях) .
...
Рейтинг: 0 / 0
29.04.2019, 09:14
    #39807421
Gerasimenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Псевдо MDI-окна и модальные окна
ДокGerasimenkoне понял: Parent ?
да, а что? TabSheet - родитель формы, при отстыковке Parent = nil (форме назначается ShowInTaskBar:= stAlways, чтобы на таскбаре отображалась ее кнопка). IsHasParent - паблик свойство формы (для отладки). Могу проект выложить, но он на Лазаре и требует транковый компилятор (там дженерики внутрях) .
авторПри вызове модального окна из отстыкованного окошка я пытаюсь сделать так, чтобы модальное перекрывало только отстыкованное (вызвавшее его) окно , а не все окна приложения
myModalForm.Parent:=myParentFreeForm ?
...
Рейтинг: 0 / 0
29.04.2019, 09:15
    #39807422
Gerasimenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Псевдо MDI-окна и модальные окна
GerasimenkoДокпропущено...

да, а что? TabSheet - родитель формы, при отстыковке Parent = nil (форме назначается ShowInTaskBar:= stAlways, чтобы на таскбаре отображалась ее кнопка). IsHasParent - паблик свойство формы (для отладки). Могу проект выложить, но он на Лазаре и требует транковый компилятор (там дженерики внутрях) .
авторПри вызове модального окна из отстыкованного окошка я пытаюсь сделать так, чтобы модальное перекрывало только отстыкованное (вызвавшее его) окно , а не все окна приложения
myModalForm.Parent:=myParentFreeForm ?Parent модальной формы присвоить форму из которой она вызвана: не?
...
Рейтинг: 0 / 0
29.04.2019, 10:26
    #39807451
ziv-2014
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Псевдо MDI-окна и модальные окна
Док,
Нет, потому что сначала вызывается процедура, которая делает disable для всех окон в проекте.
Потом вызывается модальная форма.
Потом снова вызывается процедура, которая делает enable для всех окон в проекте.
Тебе надо переделывать showmodal. Изучи данную процедуру.
...
Рейтинг: 0 / 0
29.04.2019, 11:17
    #39807489
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Псевдо MDI-окна и модальные окна
ДокМужики, разъясните мне одну вещь.

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

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

по характеру задачи тут конечно не ShowModal надо, а например окно с POPUP-стилем, в понимании WinAPI, Tab-ы же не блокируют выполнение
...
Рейтинг: 0 / 0
29.04.2019, 11:40
    #39807521
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Псевдо MDI-окна и модальные окна
ziv-2014> Тебе надо переделывать showmodal. Изучи данную процедуру.

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

Чтобы сделать всё это можно и ShowModal переделать, но
это некошерно, проще свой метод ShowPseudoModal добавить.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
29.04.2019, 11:48
    #39807529
Gator
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Псевдо MDI-окна и модальные окна
В Вин я бы поигрался стилями модального окна(формы). А в *Nixах туплю
...
Рейтинг: 0 / 0
29.04.2019, 12:40
    #39807564
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Псевдо MDI-окна и модальные окна
ziv-2014Тебе надо переделывать showmodal. Изучи данную процедуру.
Чуйствовал, что придется в исходники лезть, но подумал, вдруг кто черный ход знает :)

Гаджимурадов РустамЕму не ShowModal надо переделывать, а делать Disable для
всех "родительских" форм (по цепочке) "псевдомодальной"
формы, кроме главной.
Увы, придется ручками делать Screen.DisableForms/EnableForms. Спасибо.
...
Рейтинг: 0 / 0
29.04.2019, 14:40
    #39807637
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Псевдо MDI-окна и модальные окна
Док> Чуйствовал, что придется в исходники лезть,

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

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

Насколько я помню, этого не хватит, если мы имеем в виду одну
и ту же псевдомодальность (которая в отличие от модальности
позволяет одновременно/параллельно иметь несколько "доступных"
открытых псевдомодальных форм и необязательно дочерних).
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
29.04.2019, 14:42
    #39807640
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Псевдо MDI-окна и модальные окна
P.S. "Disable" - необязательно именно вызов самого метода
Disable, можно просто не давать передавать фокус (Activate)
на родительскую (для псевдомодальной) форму.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
29.04.2019, 17:34
    #39807782
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Псевдо MDI-окна и модальные окна
Гаджимурадов Рустамправильнее/лучше
не переделывать/перекрывать ShowModal (туда можно
разве что подсмотреть за деталями)
Так и я о чем :)

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

Кстати, попутный вопрос (лень гуглить). Есть ли простой способ перебрать все окна экрана, которые относятся только к текущему приложению?
...
Рейтинг: 0 / 0
29.04.2019, 20:20
    #39807911
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Псевдо MDI-окна и модальные окна
ДокКстати, попутный вопрос (лень гуглить). Есть ли простой способ перебрать все окна экрана, которые относятся только к текущему приложению?есть, но в VCL, например, проще использовать Application.Forms
...
Рейтинг: 0 / 0
29.04.2019, 20:52
    #39807940
aleksandr-pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Псевдо MDI-окна и модальные окна
Док,

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

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

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

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


Дабы не разводить жаркую дискуссию готов поделиться в почту, правда не знаю взлетит ли в Лазаре
...
Рейтинг: 0 / 0
29.04.2019, 22:33
    #39808010
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Псевдо MDI-окна и модальные окна
aleksandr-proДабы не разводить жаркую дискуссию готов поделиться в почту, правда не знаю взлетит ли в Лазаре
скинь, плз, с удовольствием гляну: dddoc лай яндек сру

Технически практически сделал, но интересно посмотреть, может твой лисапед изящнее :)
...
Рейтинг: 0 / 0
30.04.2019, 09:08
    #39808142
ziv-2014
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Псевдо MDI-окна и модальные окна
Док,
Скинь свою реализацию?
...
Рейтинг: 0 / 0
30.04.2019, 13:14
    #39808276
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Псевдо MDI-окна и модальные окна
aleksandr-proвозможно с небольшими ограничениями правда но возможно, есть такая тема
http://rsdn.org/forum/delphi/2891825.all
Увы, там все завязано на стили - не взлетает. Гляну вечерком твои демки.

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

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

зы. Сегодня предпраздничный день, традиционно народ пытается впрок все болячки залечить (чтоб потом 5 дней из дома не выходить). Поэтому у меня на всех 3х работах полная запись. Дома буду после 20 по Мск. Отпишусь позднее...
...
Рейтинг: 0 / 0
30.04.2019, 18:13
    #39808486
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Псевдо MDI-окна и модальные окна
Док> Есть ли простой способ перебрать все окна экрана,

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

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

Созданные или "все", видимые или "все" и т.д.?
Начни с Screen.Forms, а потом задашь доп.
вопросы, если не найдешь чего-то нужного.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
30.04.2019, 18:14
    #39808488
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Псевдо MDI-окна и модальные окна
aleksandr-pro> Дабы не разводить жаркую дискуссию готов поделиться
aleksandr-pro> в почту, правда не знаю взлетит ли в Лазаре

Дык выложи прямо сюда. Если там простыня
слишком большая - приложи файлом/архивом.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
30.04.2019, 19:10
    #39808525
aleksandr-pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Псевдо MDI-окна и модальные окна
Гаджимурадов Рустам,

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

если кто то дополнит буду благодарен, со своей стороны могу тестирование провести.
...
Рейтинг: 0 / 0
30.04.2019, 21:17
    #39808586
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Псевдо MDI-окна и модальные окна
Гаджимурадов РустамСозданные или "все", видимые или "все" и т.д.?
че-та ты ворчлив сегодня больше обычного. Не выспался что ль?
...
Рейтинг: 0 / 0
30.04.2019, 22:36
    #39808603
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Псевдо MDI-окна и модальные окна
aleksandr-pro,

демка классная, спасибо за познавательный код. На Лазаре со скрипом взлетело, но ниже лежащее окно не блокируется, увы. Может, я чего не так подправил
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
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.


Если поковыряться захочется, аттачу проект
...
Рейтинг: 0 / 0
01.05.2019, 06:32
    #39808670
aleksandr-pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Псевдо MDI-окна и модальные окна
Док,
по идее вот эта команда должна лочить "заднее" окно
Код: pascal
1.
EnableWindow(p_WINDOW.Handle,False);


p_WINDOW - это как раз parent_window то есть то окно с которого произошел вызов
может быть в лазаре как то иначе формы деактивируются, можно посмотреть код ShowModal и посмотреть как там сделано
...
Рейтинг: 0 / 0
01.05.2019, 15:32
    #39808852
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Псевдо MDI-окна и модальные окна
aleksandr-pro,

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

Кстати, на лазаре с твоим кодом видно, как перерисовываются окна на RecreateWnd, вылезая поверх других ;)
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Псевдо MDI-окна и модальные окна / 25 сообщений из 48, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]