ShowModal блокирующий только родительскую форму
От: Andrey Molchanov http://www.doublesafety.com/
Дата: 26.03.08 21:06
Оценка:
Добрый день,

В моем приложении постоянно открыты 2 формы. frmOptions.ShowModal, вызванный из первой формы блокирует не только первую, но и вторую. Есть ли способ это обойти — сделать так, чтобы блокировалась лишь форма, вызвавшая ShowModal?
--
Best regards,
Andrey Molchanov
DoubleSafety — Data backup software
Re: ShowModal блокирующий только родительскую форму
От: Oxotnik  
Дата: 27.03.08 06:09
Оценка:
Здравствуйте, Andrey Molchanov, Вы писали:

AM>Добрый день,


AM>В моем приложении постоянно открыты 2 формы. frmOptions.ShowModal, вызванный из первой формы блокирует не только первую, но и вторую. Есть ли способ это обойти — сделать так, чтобы блокировалась лишь форма, вызвавшая ShowModal?


ShowModal — блокирует TApplication
Выход: сделать обычный Show а в свойствах frmOptions прописать OnTop и запет переключения между ней и вызвавшей ее формой
Re: ShowModal блокирующий только родительскую форму
От: wallaby  
Дата: 27.03.08 06:20
Оценка:
Здравствуйте, Andrey Molchanov, Вы писали:

На вскидку

procedure TForm4.Button1Click(Sender: TObject);
begin
Form5.Show;
Form6.Show;
end;

procedure TForm4.FormActivate(Sender: TObject);
begin
if Form6.Visible then Form6.Show;
end;


Это не совсем ShowModal (Form4 можно двигать) но контролы в нём блокированы.
---
The optimist proclaims that we live in the best of all possible worlds; and the pessimist fears this is true
Re[2]: ShowModal блокирующий только родительскую форму
От: Danchik Украина  
Дата: 27.03.08 15:16
Оценка: 2 (1)
Здравствуйте, wallaby, Вы писали:

W>Здравствуйте, Andrey Molchanov, Вы писали:


W>На вскидку


[Skip]

Ой мало тут вскидки, ой мало.
Как уже говорилось, ShowModal тут не проканывает, так как блокирует все окна. Приходится делать псевдо модальные окна

Делается это так:
  1. Окну которое нам необходимо поднять над каким то окном как модальное необходимо подправить 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, в которыйх передатите метод, которы будет срабатывать на закрытие этой формы:

ptForm.zip

Там еще много полезного, если покопаетесь, подергаете новые свойства.
Re[2]: ShowModal блокирующий только родительскую форму
От: Andrey Molchanov http://www.doublesafety.com/
Дата: 28.03.08 14:03
Оценка:
Здравствуйте, Oxotnik, Вы писали:

O>ShowModal — блокирует TApplication

O>Выход: сделать обычный Show а в свойствах frmOptions прописать OnTop и запет переключения между ней и вызвавшей ее формой

Ну, это по-моему совсем уж примитивно. Такое решение можно оставить, но на самый крайний случай.
--
Best regards,
Andrey Molchanov
DoubleSafety &mdash; Data backup software
Re[3]: ShowModal блокирующий только родительскую форму
От: Andrey Molchanov http://www.doublesafety.com/
Дата: 28.03.08 14:42
Оценка:
Здравствуйте, Danchik, Вы писали:

D>Ой мало тут вскидки, ой мало.

D>Как уже говорилось, ShowModal тут не проканывает, так как блокирует все окна. Приходится делать псевдо модальные окна
D>...
D>Порождайте формы от TPatternForm и будет вам неземное счастье
D>Там еще много полезного, если покопаетесь, подергаете новые свойства.

Спасибо, покопался. Копался весь вечер. Запутанный достаточно модуль.

Такой вопрос — а будет ли правильно просто вызывать ShowModal, но в OnActivate нужной формы написать

  EnableWindow(frmParr.Handle, True)


?
--
Best regards,
Andrey Molchanov
DoubleSafety &mdash; Data backup software
Re[4]: ShowModal блокирующий только родительскую форму
От: Andrey Molchanov http://www.doublesafety.com/
Дата: 28.03.08 14:48
Оценка:
Или еще лучше — в самой форме, которую не надо отключать:


procedure WMEnable(var Msg: TWMEnable); message WM_ENABLE;

..

procedure TfrmBackup.WMEnable(var Msg: TWMEnable);
begin
  inherited;
  EnableWindow(Handle, True);
end;


Здесь, конечно, хотелось бы написать
  Msg.Enabled := True;
  inherited;

но это не работает.
--
Best regards,
Andrey Molchanov
DoubleSafety &mdash; Data backup software
Re[4]: ShowModal блокирующий только родительскую форму
От: Danchik Украина  
Дата: 28.03.08 15:04
Оценка:
Здравствуйте, Andrey Molchanov, Вы писали:

AM>Спасибо, покопался. Копался весь вечер. Запутанный достаточно модуль.


Ну для меня это не проблема, гы все бы так аккуратно писали как я

AM>Такой вопрос — а будет ли правильно просто вызывать ShowModal, но в OnActivate нужной формы написать


AM>
AM>  EnableWindow(frmParr.Handle, True)
AM>


AM>?


ShowModal нельзя вызывать ни в коем случае, там подымается свой цикл обработки сообщений, что за собой тянет очень много. Именно для этого я сделал свою функцию, но, как ты мог заметить она возвращает значение на ModalResult Callback. Что немного неудобно, но что же делать, селяви...
Re[5]: ShowModal блокирующий только родительскую форму
От: Andrey Molchanov http://www.doublesafety.com/
Дата: 28.03.08 16:07
Оценка:
Здравствуйте, 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;
--
Best regards,
Andrey Molchanov
DoubleSafety &mdash; Data backup software
Re[6]: ShowModal блокирующий только родительскую форму
От: Danchik Украина  
Дата: 28.03.08 18:41
Оценка: 2 (1)
Здравствуйте, Andrey Molchanov, Вы писали:

[Skip]

AM>Ты имеешь ввиду, что ShowModal ест много процессорного времени? Или получится неправильная обработка сообщений? Можешь написать немного подробнее?


AM>По реализации весьма удобным кажется второй способ:


AM>procedure TfrmBackup.WMEnable(var Msg: TWMEnable);

AM>begin
AM> inherited;
AM> EnableWindow(Handle, True);
AM>end;

Да нет ничерта оно не жрет. Ты попробуй просто без enable window, посмотри как ведут себя окна. Я когда то эксперементировал что было уже и не вспомню. Какие то проблемы с закрыванием окон и еще что то.

Представь cебe
MainLoop
MainWindow
  1. ShowModalLoop
    ShwithcToAnotherMainWindow
       2. ShowModalLoop



Теперь ты не смодеш закрыть MainWindow пока 2. ShowModalLoop не закроется. Это так дабы напрвить пусть ваших мыслей.

И вообще я не понял, вам что ptForm не понравился? Я месяцы убил пока довел его до толку, а вы хотите сделать это from scratch ?
Re[7]: ShowModal блокирующий только родительскую форму
От: Andrey Molchanov http://www.doublesafety.com/
Дата: 29.03.08 14:53
Оценка:
Здравствуйте, Danchik, Вы писали:

D>Представь cебe

D>...
D>Теперь ты не смодеш закрыть MainWindow пока 2. ShowModalLoop не закроется. Это так дабы напрвить пусть ваших мыслей.

Вроде бы все закрывается — никаких проблем нет. А какой смысл использовать что-то сложное, если работает все замечательно и так. Нет, надо будет, конечно, еще протестировать как следует, но я бы хотел бы конечно так оставить.

В любом случае — спасибо за помощь.
--
Best regards,
Andrey Molchanov
DoubleSafety &mdash; Data backup software
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 блокирующий только родительскую форму
От: Andrey Molchanov http://www.doublesafety.com/
Дата: 04.04.08 16:58
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Я бы пересмотрел идеологию Вашего GUI. С одной стороны, используется модальность ("классический" SDI). С другой, два разных окна подразумевают MDI.


Первое окно — основное. Второе — отображает процесс операции (бекапа). Во время бекапа можно делать что-то в основной программе.

А> Всё страньше и страньше. Попробуйте дать стороннему человеку "на поюзать" шаблон вашей программы, послушайте отзывы. К тому же, желаемая Вами "двойная" модальность накладывает и иные ограничения (что приводит нас к MDI). Скажем, сделали Вы то, что хотели. Теперь я (юзер вульгарус) делаю следующее


Не получится — второе окно не показывает никаких окон. Пример данного интерфейса — Антивирус Касперского, там отдельными окнами представлены процесс обновления, проверки компьютера и основное окно. Вполне удобное решение.
--
Best regards,
Andrey Molchanov
DoubleSafety &mdash; Data backup software
Re[7]: ShowModal блокирующий только родительскую форму
От: Sartorius78  
Дата: 25.09.08 11:39
Оценка: 1 (1)
D>И вообще я не понял, вам что ptForm не понравился? Я месяцы убил пока довел его до толку, а вы хотите сделать это from scratch ?

Спасибо за ценнейшую разработку.
Есть небольшой недочет — при моргании родительской формы происходит утечка памяти (TList, TWindowItem).
Re[8]: ShowModal блокирующий только родительскую форму
От: Danchik Украина  
Дата: 25.09.08 16:11
Оценка:
Здравствуйте, Sartorius78, Вы писали:

D>>И вообще я не понял, вам что ptForm не понравился? Я месяцы убил пока довел его до толку, а вы хотите сделать это from scratch ?


S>Спасибо за ценнейшую разработку.

S>Есть небольшой недочет — при моргании родительской формы происходит утечка памяти (TList, TWindowItem).

Спасибо подправил.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.