Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Анимирование иконки в трее 
:(
    Опции темы
Bima
Дата 11.1.2007, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 15.8.2006

Репутация: 2
Всего: 2



есть код, который запускается в таймере:
Код

void __fastcall TFDownExtr::TimTimer(TObject *Sender)
{
__int64 Ret;

SaveLog(StrStOpr,2);   // Log-

TrayIcon1->Icons=ImageAnimate;
TrayIcon1->Animate=true;
if (TrayIcon1->Icons==ImageAnimate)
   SaveLog("TrayIcon -> ImageAnimate",2);   // Log-файл
else
   SaveLog("TrayIcon -> ImageNoAnimate",2);   // Log-файл
if (TrayIcon1->Animate==true)
   SaveLog("TrayIcon Animate -> true",2);   // Log-файл
else
    SaveLog("TrayIcon Animate -> false",2);   // Log-файл


// очень длинный код программы


TrayIcon1->Icons=ImageNoAnimate;
TrayIcon1->Animate=false;
Application->ProcessMessages();
TrayIcon1->Hint="";
Application->ProcessMessages();     
if (MyFlagNew)
   TrayIcon1->IconIndex=1;
else
   TrayIcon1->IconIndex=0;



if (TrayIcon1->Icons==ImageNoAnimate)
   SaveLog("TrayIcon -> ImageNoAnimate",2);   // Log--файл
else
   SaveLog("TrayIcon -> ImageAnimate",2);   // Log--файл
if (TrayIcon1->Animate==true)
   SaveLog("TrayIcon Animate -> true",2);   // Log--файл
else
    SaveLog("TrayIcon Animate -> false",2);   // Log--файл


На форме трей (из стандартной поставки ВСВ6.0), два ImageList (ImageAnimate и ImageNoAnimate).
в первом ImageAnimate занесено 19 иконок для анимации, когда запускается таймер
во втором ImageNoAnimate всего две картинки с 0 и 1 индексом. Хочу, что бы при запуске таймера анимировалась иконка в трее, а она стоит как вкопанная smile

вот лог из этого участка программы:
***************************************************
Start Program 11.01.2007
***************************************************
13:06:54    Start of the cycle
13:06:54    TrayIcon -> ImageAnimate
13:06:54    TrayIcon Animate -> true
13:06:55    TrayIcon -> ImageNoAnimate
13:06:55    TrayIcon Animate -> true
13:07:05    Start of the cycle
13:07:05    TrayIcon -> ImageAnimate
13:07:05    TrayIcon Animate -> true
13:07:05    TrayIcon -> ImageNoAnimate
13:07:05    TrayIcon Animate -> true
13:07:15    Start of the cycle
13:07:15    TrayIcon -> ImageAnimate
13:07:15    TrayIcon Animate -> true
13:07:15    TrayIcon -> ImageNoAnimate
13:07:15    TrayIcon Animate -> true

из него видно, что команда TrayIcon1->Animate=false; не выполняется.
В чем дело, понять не могу smile

Это сообщение отредактировал(а) Bima - 11.1.2007, 12:18


--------------------
Чтобы дойти до цели, надо идти.

Клавиатура и мышь - это главные инструменты прогресса.
PM MAIL WWW   Вверх
Bima
Дата 11.1.2007, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 15.8.2006

Репутация: 2
Всего: 2



отслеживал по шагам свою программы, и видно, что команда TrayIcon1->Icons=ImageAnimate; не выполняется.

Каким образом можно компоненту TrayIcon1 присвоить иконку?
начал делать так:
Код

Graphics::TIcon *MyIcon = new Graphics::TIcon();
//
if (MyFlagNew)
   ImageNoAnimate->GetIcon(1,MyIcon);
else
   ImageNoAnimate->GetIcon(0,MyIcon);

но вот дальше вытащенную иконку MyIcon не могу прикрутить к TrayIcon1, как ни стараюсь smile


--------------------
Чтобы дойти до цели, надо идти.

Клавиатура и мышь - это главные инструменты прогресса.
PM MAIL WWW   Вверх
codelord
Дата 11.1.2007, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 777
Регистрация: 7.5.2005
Где: ты моя темноглаза я где?!

Репутация: 16
Всего: 39



Смотри внимательно билдеровский пример.

Присоединённый файл ( Кол-во скачиваний: 31 )
Присоединённый файл  Traydemo.zip 16,04 Kb


--------------------
Доступен поиск по исходным кодам в GOOGLE.
http://www.google.com/codesearch
PM MAIL   Вверх
Bima
Дата 12.1.2007, 06:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 15.8.2006

Репутация: 2
Всего: 2



Пример хороший, но у меня задача немного другая. В вашем примере есть один ImageList, куда загружены все иконки, а у меня анимационные иконки идут в одном ImageList, а статичные в другом. Что бы было понятно объясню мой алгоритм.
Есть программа, которая с определенным интервалом (через таймер) опрашивает сервера и в момент опроса делает определенные действия (для примера можно взять поиск файла на сервере). Так вот, когда идет поиск файла, я хочу что бы иконка в трее была анимированной, а в зависимости от того, нашла программа файл или нет выставляются по окончанию поиска либо иконку, что файл не найден или иконку, что файл найден.
На данный момент я не могу использовать RxLib, а в нем все решалось бы достаточно просто, так как там есть два свойства:
RxTrayIcon1->Icon - это свойство, куда загружается статичная иконка
RxTrayIcon1->Icons - это свойство, куда загружаюся иконки для анимации

для того, что бы поменять иконку в свойстве RxTrayIcon1->Icon, я бы использовал такой код:
Код

Graphics::TIcon *MyIcon = new Graphics::TIcon();
//
if (MyFlagNew)
   ImageNoAnimate->GetIcon(1,MyIcon);
else
   ImageNoAnimate->GetIcon(0,MyIcon);
RxTrayIcon1->Icon=MyIcon;

Как мне, все тоже самое реализовать на стандартном компоненте TrayIcon?

P.S. Запихнуть все иконки (статические и анимированные) в один ImageList, я не могу, так как при анимировании трея будут выскакивать статические иконки, что по алгоритму не правильно.



--------------------
Чтобы дойти до цели, надо идти.

Клавиатура и мышь - это главные инструменты прогресса.
PM MAIL WWW   Вверх
codelord
Дата 12.1.2007, 08:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 777
Регистрация: 7.5.2005
Где: ты моя темноглаза я где?!

Репутация: 16
Всего: 39



А если так например:

Присоединённый файл ( Кол-во скачиваний: 24 )
Присоединённый файл  animate.zip 23,15 Kb


--------------------
Доступен поиск по исходным кодам в GOOGLE.
http://www.google.com/codesearch
PM MAIL   Вверх
Bima
Дата 12.1.2007, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 15.8.2006

Репутация: 2
Всего: 2



Оригинальное решение, я об этом не подумал. Но если честно это обходное решение, но как решение - имеет право быть. Если не найду более легкого решения, то буду использовать этот метод.
Здесь используется два компонента TrayIcon которые нужно настраивать одинаково smile (прописывать события, свойства привязывать менюшки, обрабатывать хинты и т.д)
Этот пример легкий, и на моей быстрой машине смена компонентов (TrayIcon)  не заметна, а на старых машинах не может получится так, что одновременно выскачат две иконки (на небольшое время)?

Это сообщение отредактировал(а) Bima - 12.1.2007, 08:51


--------------------
Чтобы дойти до цели, надо идти.

Клавиатура и мышь - это главные инструменты прогресса.
PM MAIL WWW   Вверх
codelord
Дата 12.1.2007, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 777
Регистрация: 7.5.2005
Где: ты моя темноглаза я где?!

Репутация: 16
Всего: 39



Цитата(Bima @  12.1.2007,  04:48 Найти цитируемый пост)
Этот пример легкий, и на моей быстрой машине смена компонентов (TrayIcon)  не заметна, а на старых машинах не может получится так, что одновременно выскачат две иконки (на небольшое время)?

На пентиум 2, 600Mhz точно не вылетит smile рядом стоит.


--------------------
Доступен поиск по исходным кодам в GOOGLE.
http://www.google.com/codesearch
PM MAIL   Вверх
Bima
Дата 12.1.2007, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 15.8.2006

Репутация: 2
Всего: 2



А в эмуляторе проблемы smile
кстати, вот у меня такой код:
Код

void __fastcall TFDownExtr::TimTimer(TObject *Sender)
{
__int64 Ret;

SaveLog(StrStOpr,2);   // Log-файл

Tray (0,true); //  Запускаем анимацию

// очень длинный код программы

if (MyFlagNew)
   Tray (1,false); // Прекращаем анимацию и ставим нужную иконку      
else
   Tray (0,false); // Прекращаем анимацию и ставим нужную иконку      
}
//---------------------------------------------------------------------------
void Tray (int icon, bool Animation)
{
if (Animation)
   {
   if (FDownExtr->TrayIcon1->Visible==false) FDownExtr->TrayIcon1->Visible=true;
   if (FDownExtr->TrayIcon2->Visible==true) FDownExtr->TrayIcon2->Visible=false;
   FDownExtr->TrayIcon1->IconIndex=0;
   if (FDownExtr->TrayIcon1->Animate==false) FDownExtr->TrayIcon1->Animate=true;
   }
else
   {
   if (FDownExtr->TrayIcon2->Visible==false) FDownExtr->TrayIcon2->Visible=true;
   if (FDownExtr->TrayIcon1->Visible==true) FDownExtr->TrayIcon1->Visible=false;
   FDownExtr->TrayIcon2->IconIndex=icon;
   if (FDownExtr->TrayIcon1->Animate==true) FDownExtr->TrayIcon1->Animate=false;
   }
}
//---------------------------------------------------------------------------

проблема как раз в прорисовке иконок в трее. Сначала одна появляется, потом вторая, и после этого исчезает первая.



--------------------
Чтобы дойти до цели, надо идти.

Клавиатура и мышь - это главные инструменты прогресса.
PM MAIL WWW   Вверх
codelord
Дата 12.1.2007, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 777
Регистрация: 7.5.2005
Где: ты моя темноглаза я где?!

Репутация: 16
Всего: 39



не знаю, возможно есть другой вариант. Юзать только 1 tray. Посмотрю.

Это сообщение отредактировал(а) codelord - 12.1.2007, 10:56


--------------------
Доступен поиск по исходным кодам в GOOGLE.
http://www.google.com/codesearch
PM MAIL   Вверх
Bima
Дата 12.1.2007, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 15.8.2006

Репутация: 2
Всего: 2



Цитата

.. фигню написал.

 в смысле код плохой???


--------------------
Чтобы дойти до цели, надо идти.

Клавиатура и мышь - это главные инструменты прогресса.
PM MAIL WWW   Вверх
codelord
Дата 12.1.2007, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 777
Регистрация: 7.5.2005
Где: ты моя темноглаза я где?!

Репутация: 16
Всего: 39



Вот smile.
про фигню это я про себя поэтому стер.
У тебя все нормально.

Добавлено @ 11:09 
там 1 Tray smile

Присоединённый файл ( Кол-во скачиваний: 10 )
Присоединённый файл  animate2.zip 22,85 Kb


--------------------
Доступен поиск по исходным кодам в GOOGLE.
http://www.google.com/codesearch
PM MAIL   Вверх
Bima
Дата 12.1.2007, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 15.8.2006

Репутация: 2
Всего: 2



Я хотел реализовать подобное, но остановило вот что:
Допустим я выставляю таймер на 500 мс, иконки прокручиваются (при анимации), но в основной программе у меня есть запрос к серверу, который может выполянятся быстро, а может и пару секунд. Во время этих 2 секунд по логике должно произойти 4 прерывания на выполнение таймера и сответственно 4 раза обновится иконки. Но у меня такое ощущение, что таймер выполняется в одном потоке с программой и за эти 2 секунды обновления иконок не будет. А вот в предпоследнем способе(два компонента TrayIcon), компонент в отдельном потоке анимирует иконкии подвисаний не должно быть.
Это все мои домыслы поэтому и не утверждаю (хотя хотелось бы знать поточнее).

Добавлено @ 11:43 
codelord  Для примера поставьте в свою последнюю программу следующий код:
Код

void __fastcall TForm1::Button5Click(TObject *Sender)
{
__int64 a;
AnsiString URL=""; //введите адрес какого нибудь файла, что бы он закачивался не менее 4-5 сек
AnsiString File="c:\\test.txt"; //Это куда сохраняется
a = URLDownloadToFile(NULL, URL.c_str(), File.c_str(), 0, 0 );
Label1->Caption="Download end";
}


Запустите анимацию, а потом запустите код на 5 кнопке и посмотрите, будет ли торможение анимации


--------------------
Чтобы дойти до цели, надо идти.

Клавиатура и мышь - это главные инструменты прогресса.
PM MAIL WWW   Вверх
codelord
Дата 12.1.2007, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 777
Регистрация: 7.5.2005
Где: ты моя темноглаза я где?!

Репутация: 16
Всего: 39



таймер это не один поток с програмой. А вариант по моему приемлемый.

Добавлено @ 11:59 
Засовывай свою качалку в отдельный поток,  а то вешаешь все приложение и хочешь чтобы анимация была.


--------------------
Доступен поиск по исходным кодам в GOOGLE.
http://www.google.com/codesearch
PM MAIL   Вверх
codelord
Дата 12.1.2007, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 777
Регистрация: 7.5.2005
Где: ты моя темноглаза я где?!

Репутация: 16
Всего: 39



можешь посмотреть что стандартной анимацией во время зависа программы тоже анимирует


--------------------
Доступен поиск по исходным кодам в GOOGLE.
http://www.google.com/codesearch
PM MAIL   Вверх
codelord
Дата 12.1.2007, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 777
Регистрация: 7.5.2005
Где: ты моя темноглаза я где?!

Репутация: 16
Всего: 39



Bima, ты чего молчишь обиделся чтоли?. smile
Я к тому что основной поток (К которому относится главная форма)
Должен быть более или менее свободен, если ты предполагаешь
что он во время работы должен отзываться. В противном случае
лучше рассовывать свои не быстрые обработки по потокам. Если занят
основной поток, то он и плохо отзывается на другие дополнительные.
Поэтому и TrayIcon не анимирует когда висит форма.


--------------------
Доступен поиск по исходным кодам в GOOGLE.
http://www.google.com/codesearch
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0566 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.