Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.12.20;
Скачать: CL | DM;

Вниз

Аналог ShowModal для свернутого в трей приложения   Найти похожие ветки 

 
GreyWolf   (2009-11-01 23:40) [0]

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

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

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


 
Leonid Troyanovsky ©   (2009-11-02 11:02) [1]


> 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.


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


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

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


 
Leonid Troyanovsky ©   (2009-11-02 12:51) [3]


> GreyWolf   (02.11.09 12:05) [2]

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

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

--
Regards, LVT.


 
Anatoly Podgoretsky ©   (2009-11-02 13:10) [4]

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

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


 
Leonid Troyanovsky ©   (2009-11-02 13:31) [5]


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

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

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

--
Regards, LVT.


 
Anatoly Podgoretsky ©   (2009-11-02 14:08) [6]

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

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


 
Leonid Troyanovsky ©   (2009-11-02 14:19) [7]


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

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

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

--
Regards, LVT.


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

Сделал следующим образом:
     
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;

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



Страницы: 1 вся ветка

Текущий архив: 2009.12.20;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.015 c
11-1163789456
SKA1997
2006-11-17 21:50
2009.12.20
Форма прозрачная для кликов


15-1255934035
AlexDan
2009-10-19 10:33
2009.12.20
Программисты Европы будут отвечать за свои ошибки


2-1257157125
Rendal
2009-11-02 13:18
2009.12.20
Удаление ключа из реестра


4-1225224879
AndreyRus
2008-10-28 23:14
2009.12.20
Странности в определении загруженности CPU


2-1257069468
stas
2009-11-01 12:57
2009.12.20
http запрос передать рефер