Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 557

/ вопрос открыт /

Здравствуйте, эксперты!

Я искал по поиску, но однозначно-работающего ответа не нашел, поэтому мпрошу еще раз.
Есть несколько форм(2-3), каждая следующая открывается из предыдущей, как модальная(ShowModal). Как сделать, чтобы при сворачивании последней открытой, сворачивались все предыдущие, а потом соответственно разворачивались?
Application.Minimize? А куда его ставить? У формы ведь нет события OnMinimize.

Заранее спасибо

Muratov Radik Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Muratov Radik (статус: Посетитель)
Вопрос отправлен: 22 декабря 2009, 14:13
Состояние вопроса: открыт, ответов: 3.

Ответ #1. Отвечает эксперт: min@y™

Странно... Я написал тестовую программу. Там хоть 100500 модальных формы создавай, но если свернуть последнюю, то сворачиваются все предыдущие, включая главную.

Прицепляю пример к ответу.
К ответу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки ответа)

Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 22 декабря 2009, 14:40

Ответ #2. Отвечает эксперт: webkent

Здравствуйте, Muratov Radik!
Вот пример с таймером: http://webfile.ru/4181639

Ответ отправил: webkent (статус: 2-ой класс)
Время отправки: 22 декабря 2009, 15:54

Ответ #3. Отвечает эксперт: Егор

Здравствуйте, Muratov Radik!
Поиск по интернету дал полезную следующую интересную ссылку.
На основании того материала делаем следующее:
- создаём новый проект (или открываем уже существующий)
- создаём новую форму - она и будет модальной
- форме даём имя MyNewSuperPuperModalForm
- во вновь созданной форме прописываем следующий код:
секция Private объявления типа формы (type TMyNewSuperPuperModalForm = class(TForm)... ):

  private
    procedure WMSYSCOMMAND(var Msg: TWMSYSCOMMAND); message WM_SYSCOMMAND;
    procedure WMACTIVATEAPP(var Msg: TWMACTIVATEAPP); message WM_ACTIVATEAPP;

секция implementation:

implementation
 
{$R *.dfm}
procedure TMyNewSuperPuperModalForm.WMACTIVATEAPP(var Msg: TWMACTIVATEAPP);
 begin
   //Если приложение в свернутом состоянии,
   //то разворачиваем в нормальное
   if IsIconic(Application.Handle) then
     ShowWindow(Application.Handle, SW_RESTORE);
   inherited;
 end;
 
procedure TMyNewSuperPuperModalForm.WMSYSCOMMAND(var Msg: TWMSYSCOMMAND);
 begin
   //Если сообщение "свернуть",
   // то сворачиваем главную форму приложения
   if Msg.CmdType = SC_MINIMIZE then
    ShowWindow(Application.Handle, SW_MINIMIZE)
   else
     inherited;
 end;

Сохраняем модуль под именем mySuperUnit


Теперь в главной форме подключаем вновь созданный модуль (в секции implementation):
implementation
uses mySuperUnit;

Ставим кнопку. В обработчике нажатия на кнопку прописываем вызов модальной формы:
procedure TForm1.Button1Click(Sender: TObject);
begin
  if form2.ShowModal=mrOk
    then label1.Caption:='OK'
    else label1.Caption:='Cancel';
end;

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

Скачать исходник

Приложение:
  1.  
  2.  
  3. unit mySuperUnit;
  4.  
  5. interface
  6.  
  7. uses
  8. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  9. Dialogs, StdCtrls, Buttons;
  10.  
  11. type
  12. TMyNewSuperPuperModalForm = class(TForm)
  13. Label1: TLabel;
  14. BitBtn1: TBitBtn;
  15. BitBtn2: TBitBtn;
  16. private
  17. procedure WMSYSCOMMAND(var Msg: TWMSYSCOMMAND); message WM_SYSCOMMAND;
  18. procedure WMACTIVATEAPP(var Msg: TWMACTIVATEAPP); message WM_ACTIVATEAPP;
  19. public
  20. { Public declarations }
  21. end;
  22.  
  23. var
  24. MyNewSuperPuperModalForm: TMyNewSuperPuperModalForm;
  25.  
  26. implementation
  27.  
  28. {$R *.dfm}
  29. procedure TMyNewSuperPuperModalForm.WMACTIVATEAPP(var Msg: TWMACTIVATEAPP);
  30. begin
  31.  
  32.  
  33. if IsIconic(Application.Handle) then
  34. ShowWindow(Application.Handle, SW_RESTORE);
  35. inherited;
  36. end;
  37.  
  38. procedure TMyNewSuperPuperModalForm.WMSYSCOMMAND(var Msg: TWMSYSCOMMAND);
  39. begin
  40.  
  41.  
  42. if Msg.CmdType = SC_MINIMIZE then
  43. ShowWindow(Application.Handle, SW_MINIMIZE)
  44. else
  45. inherited;
  46. end;
  47. end.


Ответ отправил: Егор (статус: 10-ый класс)
Время отправки: 23 декабря 2009, 22:55
Оценка за ответ: 5


Мини-форум вопроса

Всего сообщений: 14; последнее сообщение — 23 декабря 2009, 23:04; участников в обсуждении: 5.
Вадим К

Вадим К (статус: Академик), 22 декабря 2009, 14:45 [#1]:

Delphi какая? потому что начиная с 2007 и старше поведение может заметно отличаться.
Галочка "подтверждения прочтения" - вселенское зло.
webkent

webkent (статус: 2-ой класс), 22 декабря 2009, 14:50 [#2]:

Поставь таймер и проверку, ИМХО самый простой способ.
min@y™

min@y™ (статус: Доктор наук), 22 декабря 2009, 14:59 [#3]:

Цитата (Вадим К):

Delphi какая? потому что начиная с 2007 и старше поведение может заметно отличаться.


Я пробовал только на 7. Скачай себе, попробуй. Мне интересно узнать, как оно поведёт себя на других версиях компайлера.

Цитата (webkent):

Поставь таймер и проверку, ИМХО самый простой способ.


Это 22.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Вадим К

Вадим К (статус: Академик), 22 декабря 2009, 15:18 [#4]:

таймер? да, поистине фантазия человеческая безгранична. я пытаюсь себе в уме нарисовать простое решение с таймером - не получается как то. нарисуйте, webkent. Хочется увидеть.
Галочка "подтверждения прочтения" - вселенское зло.
Вадим К

Вадим К (статус: Академик), 22 декабря 2009, 15:43 [#5]:

to min@y™
Что бы не быть голословным. самый минимальный пример, который покажет разницу.
Form1.Caption := 'test';
в 7 делфи при этом не поменяется текст на кнопке на панели задач. А в 2007 и старше - да.
Основое изменение - теперь главная форма приложения есть главным окном приложения. раньше главным окном было невидимое окно.
Галочка "подтверждения прочтения" - вселенское зло.
Muratov Radik

Muratov Radik (статус: Посетитель), 22 декабря 2009, 15:49 [#6]:

Пробовал пример от min@y™. Такая же фигня. Дельфи 7. Сворачивается только послдняя форма :(
Muratov Radik

Muratov Radik (статус: Посетитель), 22 декабря 2009, 15:51 [#7]:

Сворачивается в левый нижний угол над кнопкой Пуск
webkent

webkent (статус: 2-ой класс), 22 декабря 2009, 16:00 [#8]:

Вадим К пример выложил как ответ к этому вопросу. Может быть я что-то ннедопонял, тогда что конкретно?
Вадим К

Вадим К (статус: Академик), 22 декабря 2009, 16:14 [#9]:

Уже увидел, что там приложено решение. открыл. страшно... начнем-с:)
if (form3.Visible=true) then
да... обязательно сравнение?
Второе. а что будет, если я угадаю и сверну форму как раз в тот момент, когда сработал таймер... да, это кажется невозможным, код то отрабатывает быстро.... но поверьте, найдется пользователь, который сможет.
Третье. А что, если у меня появиться ещё 3-4 формы? а если 200?
Галочка "подтверждения прочтения" - вселенское зло.
min@y™

min@y™ (статус: Доктор наук), 22 декабря 2009, 18:56 [#10]:

Попробовал щас. Да, действительно, сворачивается над ПЗ. Она у меня автоскрывается, и куча всего открыто ещё, поэтому не заметил. Айм сорри.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
webkent

webkent (статус: 2-ой класс), 22 декабря 2009, 20:03 [#11]:

Вадим К
1. Ну если не визибл, зачем лезть менять? Не обязательно, но желательно(я думаю так, могу и ошибаться, я далеко не эксперт, в отличии от вас)
2. Даже если свернете в тот момент, то сработает через секунду, разве нет?
3. Насчет этогоуже должен заботиться автор вопроса, разве нет? Готов поспорить, что смогу дописать этот код под неопределенное количество форм.
Muratov Radik

Muratov Radik (статус: Посетитель), 23 декабря 2009, 09:08 [#12]:

To webkent:
Ваш вариант работает, но некрасиво. Да, они все сворачиваются, встают в рядок над кнопкой пуск. Также видно как они все по очереди сворачиваются и разворачиваются. Вобщем велосипед значит надо изобретать.
webkent

webkent (статус: 2-ой класс), 23 декабря 2009, 09:32 [#13]:

Вот еще один способ еще более простой:

В таймере ставите интервал=100, удаляете всё что было до этого в таймере и пишите:

if (form3.Visible=true) and (form3.WindowState=wsMinimized) then
begin
form3.WindowState:=wsnormal;
Application.Minimize;
end;

Всё прекрасно работает! И без окошек над пуском и плавно за счет интервала 100мс
Егор

Егор (статус: 10-ый класс), 23 декабря 2009, 23:04 [#14]:

таймер?
хм...
:)))))))))))))))
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:40
Выполнено за 0.03 сек.