Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Аналог ShowModal для свернутого в трей приложения [D7, Win2k, WinXP]


GreyWolf ©   (2009-11-01 23:40:00) 

Приложение запускается и в зависимости от параметров командной строки может сворачиваться в трей при запуске. Если приложение сворачивается в трей, то главная форма не показывается, хотя и создается, то есть ShowMainForm = False.
В зависимости от другого параметра возможно автоматическое начало некоторго действия после запуска. При его начале я через ShowModal показываю индикатор прогресса. Теперь я хочу, чтобы если приложение было свернуто в трей, вызвать некоторую функцию-аналог ShowModal, которая бы:
- не возвращала управления до закрытия формы
- не показывала никаких форм сразу, и не помещала на TaskBar кнопку приложения, но при восстановлении приложения индикатор прогресса оказывался бы активной modal form

При попытке использовать ShowModal при свернутом в трей приложении, появляется кнопка на TaskBar, и индикатор прогресса не модален (можно переключаться между ним и восстановленной главной формой)

Как это можно сделать с наименьшим объемом кода и затрачиваемым временем?


GreyWolf   (2009-11-02 17:07:00) [1]

Сделал следующим образом:
     
const
 WM_MINIMIZETOTRAY = WM_USER + 102;
var
 FStartedInTray: Boolean;
....
     FStartedInTray := TrayIcon.IconVisible;
     if FStartedInTray then
     begin
       EnableWindow(Application.MainForm.Handle, False);
       PostMessage(FProgressForm.Handle, WM_MINIMIZETOTRAY, 0, 0);
     end;
     FProgressForm.ShowModal;
     if FStartedInTray then
     begin
       EnableWindow(Application.MainForm.Handle, True);
     end;

Этио работает, хотя при этом возможны мелькания формы на экране. Хотел найти более изящное решение.


Leonid Troyanovsky   (2009-11-02 14:19:00) [2]


> Anatoly Podgoretsky ©   (02.11.09 14:08) [6]

> Так еще и красить нужно!

Ну, это только для эстетов.

--
Regards, LVT.


Anatoly Podgoretsky   (2009-11-02 14:08:00) [3]

> Leonid Troyanovsky  (02.11.2009 13:31:05)  [5]

Так еще и красить нужно!


Leonid Troyanovsky   (2009-11-02 13:31:00) [4]


> Anatoly Podgoretsky ©   (02.11.09 13:10) [4]

> В прямом смысле?

В смысле "покрасить и выбросить".

--
Regards, LVT.


Anatoly Podgoretsky   (2009-11-02 13:10:00) [5]

> Leonid Troyanovsky  (02.11.2009 12:51:03)  [3]

В прямом смысле?


Leonid Troyanovsky   (2009-11-02 12:51:00) [6]


> GreyWolf   (02.11.09 12:05) [2]

> становилась видимой и модальной.

DisableTaskWindows - в руки, а приложение - в корзину.

--
Regards, LVT.


GreyWolf   (2009-11-02 12:05:00) [7]


> Чего-то больно все наворочено.Почему б не показывать скрытую
> главную форму, когда нужно что-либо показать? Прогресс можно
> хоть в статус-баре показать.

Мне НЕ НУЖНО показывать прогресс-бар если приложение свернуто в трей. Просто сейчас есть такая логика: я начинаю операцию, при этом показываю форму с индикатором прогресса, в коде есть обращения на обновление ее контролов по мене изменения состояния процесса обработки. Это работает, если приложение не свернуто никуда. Я не хочу менять этот код, исключать эти обращения. Вместо этого мне нужно, чтобы:
1. форма с прогрессом создавалась, но была невидимой
2. при восстановлении приложения методом Restore эта форма становилась видимой и модальной.
Для второго пункта очевидно нужно как-то модифицировать списки Disabled окон, которые есть в VCL, потому что автоматически и корректно это происходит только если главная форма на экране.


Leonid Troyanovsky   (2009-11-02 11:02:00) [8]


> GreyWolf   (01.11.09 23:40)  

> Как это можно сделать с наименьшим объемом кода и затрачиваемым
> временем?

Чего-то больно все наворочено.
Почему б не показывать скрытую главную форму, когда нужно что-либо показать? Прогресс можно хоть в статус-баре показать.

А чтобы не показывать кнопку на таскбаре, сделай в контекстном
меню пункт: Restore, на который будет выполняться примерно такое:

procedure TForm1.miRestoreClick(Sender: TObject);
begin
 Show;
 ShowWindow(Application.Handle, SW_HIDE);
end;

Т.е., в случаях, когда надо показать главное окно, можно сделать  miRestore.Click (предварив вызовом SetForegroundWindow(Handle)
при вызове из конт.меню "у" иконки).

--
Regards, LVT.


Наверх

Титульная страница Поиск, карта сайта Написать письмо