powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Модальность только для вызывающей формы
16 сообщений из 16, страница 1 из 1
Модальность только для вызывающей формы
    #40005301
verter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В рамках одного приложения (процесса) открыта Form1 в отдельном окне, а также открыта Form2 тоже в отдельном окне, т.е. SDI
Из Form1 открывается Form11 в модальном режиме, т.е. делается вызов Form11.ShowModal;
Теперь нет возможности получить доступ не только к Form1, но и к Form2
Как сделать так чтобы модальность Form11 распространялась только на Form1?
Чтобы Form2 была доступна.
...
Рейтинг: 0 / 0
Модальность только для вызывающей формы
    #40005308
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Меня всегда интересовало, какая религия запрещает посмотреть в исходники ShowModal - как он работает.

Если очень коротко, модальность реализуется через свойство Enabled. Каким формам успешно сделано Enabled := false - такие и недоступны. Например:

Код: pascal
1.
2.
3.
4.
5.
6.
{ Чихаем на попытки всяких ShowModal-ов нас заблокировать }
procedure TFormBaseDebug.WmEnable(var Msg: TWMEnable);
begin
  inherited;
  if not Msg.Enabled then EnableWindow(Self.Handle, true);
end;
...
Рейтинг: 0 / 0
Модальность только для вызывающей формы
    #40005322
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
verterКак сделать так чтобы модальность Form11 распространялась только на Form1?

Код: sql
1.
2.
Form11.Parent := Form1;
Form11.Show;


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Модальность только для вызывающей формы
    #40005335
verter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
Меня всегда интересовало, какая религия запрещает посмотреть в исходники ShowModal - как он работает.

Если очень коротко, модальность реализуется через свойство Enabled. Каким формам успешно сделано Enabled := false - такие и недоступны. Например:

Код: pascal
1.
2.
3.
4.
5.
6.
{ Чихаем на попытки всяких ShowModal-ов нас заблокировать }
procedure TFormBaseDebug.WmEnable(var Msg: TWMEnable);
begin
  inherited;
  if not Msg.Enabled then EnableWindow(Self.Handle, true);
end;



Я неправильно сделал описание задачи.
Form1 создаётся динамически скажем из Form0, т.е. нет на самом деле Form2, есть несколько созданных и показанных Form1 из Form0
И мне нужно, чтобы из каждого экземпляра Form1 также динамически создавалась Form11 и показывалась в модальном режиме, но только для этого экземпляра Form1.
...
Рейтинг: 0 / 0
Модальность только для вызывающей формы
    #40005336
verter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

verterКак сделать так чтобы модальность Form11 распространялась только на Form1?

Код: sql
1.
2.
Form11.Parent := Form1;
Form11.Show;





сделал в Form1 показ Form11:

Form11.Parent := Self;
Form11.Show;

Вылезает ошибка:

Не могу передать фокус ввода отключённому или невидимому окну.
...
Рейтинг: 0 / 0
Модальность только для вызывающей формы
    #40005338
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Значит наоборот.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Модальность только для вызывающей формы
    #40005339
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
verter
В рамках одного приложения (процесса) открыта Form1 в отдельном окне, а также открыта Form2 тоже в отдельном окне, т.е. SDI
Из Form1 открывается Form11 в модальном режиме, т.е. делается вызов Form11.ShowModal;
Теперь нет возможности получить доступ не только к Form1, но и к Form2
Как сделать так чтобы модальность Form11 распространялась только на Form1?
Чтобы Form2 была доступна.


Модальные диалоги в Винде как минимум thread-modal, т.к. в UI message pump цикле идет проверка на наличие одного модального окна.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
function TApplication.ProcessMessage<==(var Msg: TMsg): Boolean;
var
  Handled: Boolean;
begin
  Result := False;
  if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then
  begin
    Result := True;
    if Msg.Message <> WM_QUIT then
    begin
      Handled := False;
      if Assigned(FOnMessage) then FOnMessage(Msg, Handled);
      if not IsHintMsg(Msg) and not Handled and not IsMDIMsg(Msg) and
        not IsKeyMsg(Msg) and not IsDlgMsg(Msg)<== then
      begin
        TranslateMessage(Msg);
        DispatchMessage(Msg);
      end;
    end
    else
      FTerminate := True;
  end;
end;



Чтобы два окна могли независимо показывать модальные диалоги, нужно свой UI thread на каждое окно.
Аппликации с несколькими UI thread - это полный атас в отладке. Аутлук, например, этого не делает, поэтому если в любом из окон вскочил модальный диалог - все встало пока его не закрыли.

Дельфи это все равно не поддерживает - у VCL одна message pump, и одна UI thread.

Если это архиважно, и верхние окна равноправны и не говорят друг с другом, их можно запускать в своем процессе.
...
Рейтинг: 0 / 0
Модальность только для вызывающей формы
    #40005340
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
verter
Я неправильно сделал описание задачи.

Прочувствуйте разницу между "Я рассказал, как сделать" и "Я сделал вместо Вас".
...
Рейтинг: 0 / 0
Модальность только для вызывающей формы
    #40005341
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Дельфи это все равно не поддерживает

И не нужно. В Дельфи потребность топикстартера отлично реализуется способом, который я привёл (да, лет десять назад у меня было приложение с таким интерфейсом, да, сделал, да, отлично работало и до сих пор работает).
...
Рейтинг: 0 / 0
Модальность только для вызывающей формы
    #40005342
verter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

Значит наоборот.


Да, получилось. Спасибо.
Только есть такая проблема.
Открыта одна Form1, открыта другая Form1 - соответственно на панели задач я вижу 2-е иконки окон.
В 1-й Form1 открываю вашим способом Form11, перехожу во 2-ю Form1, а потом пытаюсь в панели задач выбрать опять 1-ю Form1, т.е. переключиться на неё(а в ней в этот момент открыта Form11), но не получается - ничего не происходит, остаюсь во 2-й Form1 и никак не переключиться обратно, только если уменьшить размеры окна 2-й Form1 чтобы увидеть кусок 1-й Form1 или её Form11 и тогда щёлкнув по ней мышкой удаётся перейти. Но если обе Form1 максимизированы и в обоих открыты свои Form11, то никак не переключиться.
...
Рейтинг: 0 / 0
Модальность только для вызывающей формы
    #40005391
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
НеофитSQL
Дельфи это все равно не поддерживает

И не нужно. В Дельфи потребность топикстартера отлично реализуется способом, который я привёл (да, лет десять назад у меня было приложение с таким интерфейсом, да, сделал, да, отлично работало и до сих пор работает).
одно запустил, второе запустил ...
и потом ищи в какой последовательности их закрывать
...
Рейтинг: 0 / 0
Модальность только для вызывающей формы
    #40005401
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)
одно запустил, второе запустил ...
и потом ищи в какой последовательности их закрывать

Это равно верно для любого интерфейса с модальными окнами в принципе. Впрочем, в любом случае вопрос дизайна не ко мне, там было требование "повторить фичу вот отсюда, пользователи настаивают, что им так зверски удобно". Там ещё вдобавок было псевдо-mdi, то есть окна (в том числе модальные) ползали по клиентской области главного, поэтому я добавил визуализацию доступности окна цветом caption/а.
...
Рейтинг: 0 / 0
Модальность только для вызывающей формы
    #40005406
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
где-то на опен-системс (или другом ресурсе) когда-то была статья
об экскрементах экспериментах самой M$ с многопоточным UI.
резюме было таковым, как говорит НеофитSQL
...
Рейтинг: 0 / 0
Модальность только для вызывающей формы
    #40005410
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
verterОткрыта одна Form1, открыта другая Form1 - соответственно на панели задач я вижу 2-е
иконки окон.

Обычно этого не происходит. Если нужны две кнопки на панели задач - запускаются два разных
процесса.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Модальность только для вызывающей формы
    #40005421
Фотография aleksandr-pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
verter,

давненько делал пример PseudoModal.zip

В целом работает, у самого на этой штуке достаточно большой проект построен.
...
Рейтинг: 0 / 0
Модальность только для вызывающей формы
    #40005472
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleksandr-pro
verter,

давненько делал пример PseudoModal.zip

В целом работает, у самого на этой штуке достаточно большой проект построен.
та же проблема что и в 22208863

Принципиально то оно вроде как можно сделать "похожее поведение", но это уже будет не блокирующий ShowModal. А это значит, что нужно подстраивать всю логику приложения и смотреть все библиотечные вызовы (например диалоги открытия файлов), что явно не комильфо
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Модальность только для вызывающей формы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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