|
Вопрос # 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.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|