| 
| 
 | Вопрос # 3 557/ вопрос открыт / | 
 |  Здравствуйте, эксперты!
 Я искал по поиску, но однозначно-работающего ответа не нашел, поэтому мпрошу еще раз.
 Есть несколько форм(2-3), каждая следующая открывается из предыдущей, как модальная(ShowModal). Как сделать, чтобы при сворачивании последней открытой, сворачивались все предыдущие, а потом соответственно разворачивались?
 Application.Minimize? А куда его ставить? У формы ведь нет события OnMinimize.
 
 Заранее спасибо
 
|  |   Вопрос задал: 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. Чтобы сделать такую форму доступной для повторного использования без переписывания всего кода снова и снова, лезем по вышеуказанной ссылке и читаем статью внимательно - там про это как раз и рассказывается.
 
 Скачать исходник
 Приложение:Переключить в обычный режим   unit mySuperUnit; interface uses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, StdCtrls, Buttons; type  TMyNewSuperPuperModalForm = class(TForm)    Label1: TLabel;    BitBtn1: TBitBtn;    BitBtn2: TBitBtn;  private    procedure WMSYSCOMMAND(var Msg: TWMSYSCOMMAND); message WM_SYSCOMMAND;    procedure WMACTIVATEAPP(var Msg: TWMACTIVATEAPP); message WM_ACTIVATEAPP;  public    { Public declarations }  end; var  MyNewSuperPuperModalForm: TMyNewSuperPuperModalForm; 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;end.
|  | Ответ отправил: Егор (статус: 10-ый класс)Время отправки: 23 декабря 2009, 22:55
 Оценка за ответ: 5
 |  
 Мини-форум вопросаВсего сообщений: 14; последнее сообщение — 23 декабря 2009, 23:04; участников в обсуждении: 5. 
|   | Вадим К (статус: Академик), 22 декабря 2009, 14:45 [#1]:Delphi какая? потому что начиная с 2007 и старше поведение может заметно отличаться. Галочка "подтверждения прочтения" - вселенское зло. |  
|   | webkent (статус: 2-ой класс), 22 декабря 2009, 14:50 [#2]:Поставь таймер и проверку, ИМХО самый простой способ. |  
|   | 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 (статус: Посетитель), 22 декабря 2009, 15:49 [#6]:Пробовал пример от  min@y™. Такая же фигня. Дельфи 7. Сворачивается только послдняя форма   |  
|   | Muratov Radik (статус: Посетитель), 22 декабря 2009, 15:51 [#7]:Сворачивается в левый нижний угол над кнопкой Пуск |  
|   | webkent (статус: 2-ой класс), 22 декабря 2009, 16:00 [#8]:Вадим К пример выложил как ответ к этому вопросу. Может быть я что-то ннедопонял, тогда что конкретно? |  
|   | Вадим К (статус: Академик), 22 декабря 2009, 16:14 [#9]:Уже увидел, что там приложено решение. открыл. страшно... начнем-с  if (form3.Visible=true) then
 да... обязательно сравнение?
 Второе. а что будет, если я угадаю и сверну форму как раз в тот момент, когда сработал таймер... да, это кажется невозможным, код то отрабатывает быстро.... но поверьте, найдется пользователь, который сможет.
 Третье. А что, если у меня появиться ещё 3-4 формы? а если 200?
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | min@y™ (статус: Доктор наук), 22 декабря 2009, 18:56 [#10]:Попробовал щас. Да, действительно, сворачивается над ПЗ. Она у меня автоскрывается, и куча всего открыто ещё, поэтому не заметил. Айм сорри. Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | webkent (статус: 2-ой класс), 22 декабря 2009, 20:03 [#11]:Вадим К 1. Ну если не визибл, зачем лезть менять? Не обязательно, но желательно(я думаю так, могу и ошибаться, я далеко не эксперт, в отличии от вас)
 2. Даже если свернете в тот момент, то сработает через секунду, разве нет?
 3. Насчет этогоуже должен заботиться автор вопроса, разве нет? Готов поспорить, что смогу дописать этот код под неопределенное количество форм.
 |  
|   | Muratov Radik (статус: Посетитель), 23 декабря 2009, 09:08 [#12]:To 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.
 |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |