Главная страница
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
2-1257247329
Qwerg_ntgl
2009-11-03 14:22
2009.12.20
Работа с EkRTF


2-1256925793
-
2009-10-30 21:03
2009.12.20
Узнать версию OC.


4-1225617182
Skazi21101
2008-11-02 12:13
2009.12.20
Работа с COM портом. Помогите.


6-1209028510
ivanov
2008-04-24 13:15
2009.12.20
3агрузить страницу с подменой своего стиля


4-1225373404
Vayrus
2008-10-30 16:30
2009.12.20
Восстановление прав доступа