В моем приложении постоянно открыты 2 формы. frmOptions.ShowModal, вызванный из первой формы блокирует не только первую, но и вторую. Есть ли способ это обойти — сделать так, чтобы блокировалась лишь форма, вызвавшая ShowModal?
Здравствуйте, Andrey Molchanov, Вы писали:
AM>Добрый день,
AM>В моем приложении постоянно открыты 2 формы. frmOptions.ShowModal, вызванный из первой формы блокирует не только первую, но и вторую. Есть ли способ это обойти — сделать так, чтобы блокировалась лишь форма, вызвавшая ShowModal?
ShowModal — блокирует TApplication
Выход: сделать обычный Show а в свойствах frmOptions прописать OnTop и запет переключения между ней и вызвавшей ее формой
Re: ShowModal блокирующий только родительскую форму
Здравствуйте, wallaby, Вы писали:
W>Здравствуйте, Andrey Molchanov, Вы писали:
W>На вскидку
[Skip]
Ой мало тут вскидки, ой мало.
Как уже говорилось, ShowModal тут не проканывает, так как блокирует все окна. Приходится делать псевдо модальные окна
Делается это так: Окну которое нам необходимо поднять над каким то окном как модальное необходимо подправить Owner окно (не путать с VCL Owner Component). Тоесть перед его созданием необходимо подправить CreateParams
procedure TPseudoModalForm.CreateParams(var Params: TCreateParams);
begin
inherited;
if ModalCaller <> nil then begin
Params.Style := Params.Style or WS_POPUP;
Params.WndParent := ModalCaller.Handle;
end;
end;
Где ModalCaller это главная форма над которой вы хотите поместить это окно
...
Замахался тайпать. Вот целый юнит который все сделает за вас в самом наилучшем виде, я его собирал по крупицам всю свою долгую сознательную програмисткую деятельность на Delphi:
Порождайте формы от TPatternForm и будет вам неземное счастье
Вас интересуют функции ShowModalExt, в которыйх передатите метод, которы будет срабатывать на закрытие этой формы:
Здравствуйте, Oxotnik, Вы писали:
O>ShowModal — блокирует TApplication O>Выход: сделать обычный Show а в свойствах frmOptions прописать OnTop и запет переключения между ней и вызвавшей ее формой
Ну, это по-моему совсем уж примитивно. Такое решение можно оставить, но на самый крайний случай.
Здравствуйте, Danchik, Вы писали:
D>Ой мало тут вскидки, ой мало. D>Как уже говорилось, ShowModal тут не проканывает, так как блокирует все окна. Приходится делать псевдо модальные окна D>... D>Порождайте формы от TPatternForm и будет вам неземное счастье D>Там еще много полезного, если покопаетесь, подергаете новые свойства.
Спасибо, покопался. Копался весь вечер. Запутанный достаточно модуль.
Такой вопрос — а будет ли правильно просто вызывать ShowModal, но в OnActivate нужной формы написать
Здравствуйте, Andrey Molchanov, Вы писали:
AM>Спасибо, покопался. Копался весь вечер. Запутанный достаточно модуль.
Ну для меня это не проблема, гы все бы так аккуратно писали как я
AM>Такой вопрос — а будет ли правильно просто вызывать ShowModal, но в OnActivate нужной формы написать
AM>
AM> EnableWindow(frmParr.Handle, True)
AM>
AM>?
ShowModal нельзя вызывать ни в коем случае, там подымается свой цикл обработки сообщений, что за собой тянет очень много. Именно для этого я сделал свою функцию, но, как ты мог заметить она возвращает значение на ModalResult Callback. Что немного неудобно, но что же делать, селяви...
Re[5]: ShowModal блокирующий только родительскую форму
Здравствуйте, Danchik, Вы писали:
AM>>Такой вопрос — а будет ли правильно просто вызывать ShowModal, но в OnActivate нужной формы написать
AM>>
AM>> EnableWindow(frmParr.Handle, True)
AM>>
AM>>?
D>ShowModal нельзя вызывать ни в коем случае, там подымается свой цикл обработки сообщений, что за собой тянет очень много. Именно для этого я сделал свою функцию, но, как ты мог заметить она возвращает значение на ModalResult Callback. Что немного неудобно, но что же делать, селяви...
Ты имеешь ввиду, что ShowModal ест много процессорного времени? Или получится неправильная обработка сообщений? Можешь написать немного подробнее?
По реализации весьма удобным кажется второй способ:
procedure TfrmBackup.WMEnable(var Msg: TWMEnable);
begin
inherited;
EnableWindow(Handle, True);
end;
[Skip]
AM>Ты имеешь ввиду, что ShowModal ест много процессорного времени? Или получится неправильная обработка сообщений? Можешь написать немного подробнее?
AM>По реализации весьма удобным кажется второй способ:
AM>procedure TfrmBackup.WMEnable(var Msg: TWMEnable); AM>begin AM> inherited; AM> EnableWindow(Handle, True); AM>end;
Да нет ничерта оно не жрет. Ты попробуй просто без enable window, посмотри как ведут себя окна. Я когда то эксперементировал что было уже и не вспомню. Какие то проблемы с закрыванием окон и еще что то.
Здравствуйте, Danchik, Вы писали:
D>Представь cебe D>... D>Теперь ты не смодеш закрыть MainWindow пока 2. ShowModalLoop не закроется. Это так дабы напрвить пусть ваших мыслей.
Вроде бы все закрывается — никаких проблем нет. А какой смысл использовать что-то сложное, если работает все замечательно и так. Нет, надо будет, конечно, еще протестировать как следует, но я бы хотел бы конечно так оставить.
Re: ShowModal блокирующий только родительскую форму
От:
Аноним
Дата:
04.04.08 16:14
Оценка:
Здравствуйте, Andrey Molchanov, Вы писали:
AM>Добрый день,
AM>В моем приложении постоянно открыты 2 формы. frmOptions.ShowModal, вызванный из первой формы блокирует не только первую, но и вторую. Есть ли способ это обойти — сделать так, чтобы блокировалась лишь форма, вызвавшая ShowModal?
Я бы пересмотрел идеологию Вашего GUI. С одной стороны, используется модальность ("классический" SDI). С другой, два разных окна подразумевают MDI. Всё страньше и страньше. Попробуйте дать стороннему человеку "на поюзать" шаблон вашей программы, послушайте отзывы. К тому же, желаемая Вами "двойная" модальность накладывает и иные ограничения (что приводит нас к MDI). Скажем, сделали Вы то, что хотели. Теперь я (юзер вульгарус) делаю следующее
1) вызываю модельные диалоги для обоих окон одновременно
2) перетаскиваю модальный диалог (МД) от первого окна — на территорию второго окна и наоборот, МД№2 на территорию первого окна.
3) ухожу обедать на полчасика
4) по возвращении пытаюсь понять/вспомнить, где чей модальный диалог, не прибегая к помощи "научного тыка" и поллитры
Re[2]: ShowModal блокирующий только родительскую форму
Здравствуйте, Аноним, Вы писали:
А>Я бы пересмотрел идеологию Вашего GUI. С одной стороны, используется модальность ("классический" SDI). С другой, два разных окна подразумевают MDI.
Первое окно — основное. Второе — отображает процесс операции (бекапа). Во время бекапа можно делать что-то в основной программе.
А> Всё страньше и страньше. Попробуйте дать стороннему человеку "на поюзать" шаблон вашей программы, послушайте отзывы. К тому же, желаемая Вами "двойная" модальность накладывает и иные ограничения (что приводит нас к MDI). Скажем, сделали Вы то, что хотели. Теперь я (юзер вульгарус) делаю следующее
Не получится — второе окно не показывает никаких окон. Пример данного интерфейса — Антивирус Касперского, там отдельными окнами представлены процесс обновления, проверки компьютера и основное окно. Вполне удобное решение.
Здравствуйте, Sartorius78, Вы писали:
D>>И вообще я не понял, вам что ptForm не понравился? Я месяцы убил пока довел его до толку, а вы хотите сделать это from scratch ?
S>Спасибо за ценнейшую разработку. S>Есть небольшой недочет — при моргании родительской формы происходит утечка памяти (TList, TWindowItem).