Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.01.23;
Скачать: [xml.tar.bz2];

Вниз

Запуск Application.Run несколько раз   Найти похожие ветки 

 
YY   (2003-01-11 23:14) [0]

Здравствуйте, уважаемые Мастера.

Не подскажет ли кто-нибудь как можно реализовать простую конструкцию, в которой программа висела бы в system tray, при щелчке по иконке создавала главную форму, а при уничтожении главной формы, снова садилась бы в system tray?

Я пытаюсь это реализовать так:

program IconTest;

...
var
WayFlag:(wfDialog,wfAppExit,wfTray);
...


begin
Application.Initialize;
repeat
WayFlag:=wfTray;

...
Через API создаётся невидимое окно, и к нему привязывается в иконка в system tray
При щелчке по иконке WayFlag:=wfDialog;
...

repeat
Application.ProcessMessages;
until WayFlag<>wfTray;

...
Уничтожаются иконка и связанное с ней окно
...

if WayFlag=wfDialog then
begin
//Create Main Form
Application.CreateForm(TForm1, Form1);
Application.Run;
end;
until WayFlag=wfAppExit;
end.


По щелчку форма создаётся, но уничтожаться не хочет. Процедура Application.Run, вызванная второй раз, уже не ждёт закрытия главной формы и заканчивается почти сразу после вызова (по-моему, после прихода первого сообщения главной форме).
В OnClose главной формы стоит Action:=caFree;

Буду очень благодарен, если мне подскажут, что здесь можно сделать.


 
Garrett   (2003-01-11 23:32) [1]

хм... по-моему, лучше так:
1. Запускается твоя прога. Создаётся невидимое главное окно и вешается иконка в трей.
2. По нажатию на иконкеделаешь главную форму видимой.
3. ловишь сообщения о закрытии формы.
4. по некому флагу определяешь, если приложение надо выгрузить вообще, то разрешаешь закрытие, иначе просто скрываешь форму.
5. если форма была скрыта - переход к пункту 2.


 
TTCustomDelphiMaster   (2003-01-11 23:44) [2]

http://www.delphikingdom.com/helloworld/samples_win.htm


 
YY   (2003-01-12 21:25) [3]

Конечно, можно просто скрывать форму, как предлагает Garrett, но главная форма моей программы насыщена разными картинками и контролями и занимает некоторое количество ресурсов. Если её просто скрывать, она будет занимать столько же места в памяти, сколько и не скрытая (по наблюдением в Task Manager в Win2000).
Хотелось бы именно создавать и уничтожать форму по запросу.

> http://www.delphikingdom.com/helloworld/samples_win.htm

На приведённой странице я не смог найти пути к решению своей проблемы. Там есть примеры как сажать иконку в system tray и показывать Splash-окно.
Один раз показать окно не сложно, однако у меня не получается создавать работающее окно каждый раз при нажатии на иконку в трее.


 
TTCustomDelphiMaster   (2003-01-12 21:54) [4]

Тогда сделай маленькую и невидимую главноую форму. И сможешь спокойно убивать свою насыщеную разными картинками и контролями вторую форму.


 
Юрий Зотов   (2003-01-12 22:04) [5]

> YY

Sorry, но Вы не совсем понимаете, что такое трей-программа и как она работает.

Когда программа сажает иконку в трей, она должна заполнить структуру TNotifyIconData. В частности, в поле Wnd записывается хэндл окна, которое будет получать сообщение "от иконки" (на самом деле - от оболочки системы, конечно), а в поле uCallbackMessage - само сообщение.

При перемещении мыши над иконкой или при щелчках по ней оболочка системы посылает указанному окну указанное сообщение, а в его параметрах передает информацию о том, что именно произошло. Все остальное должно сделать уже само окно.

Поэтому иконка в трее просто не может существовать без окна, поддерживающего ее работу. Окно это обычно делают скрытым, но существовать оно обязано. Таким образом, у Вас ну никак не получится динамически создавать и уничтожать главную форму программы при каких-то манипуляциях юзера с иконкой. У Вас просто не будет окна, которое узнало бы о действиях юзера и смогло что-то сделать.

Поэтому расстаньтесь с этой идеей сразу. Сделайте главную форму пустой, спрячьте ее и пусть она работает с иконкой (все как в примере по ссылке). А вот ту форму, которая сейчас у Вас главная, сделайте неглавной. Тогда Вы сможете создавать и уничтожать ее каждый раз, когда это будет нужно.




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

Форум: "Основная";
Текущий архив: 2003.01.23;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.014 c
7-72552
baryjul
2002-11-11 23:56
2003.01.23
Вывод ввод в из аппаратный порт байта, слова в Delphi.


9-72015
Джастер
2002-07-22 17:08
2003.01.23
GLScene


1-72402
ihtiandr
2003-01-13 17:24
2003.01.23
Вопросик


1-72270
Andy BitOff
2003-01-10 19:45
2003.01.23
Drag n Drop


3-72122
Alister
2002-12-31 02:46
2003.01.23
Как подключить Внешнюю компоненту 1С к своей DLL





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский