Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Duda con TrayIcon (https://www.clubdelphi.com/foros/showthread.php?t=63773)

yelian 02-03-2009 16:06:29

Duda con TrayIcon
 
Saludos a todos los del Foros

Tengo una duda que quizas alguno de ustedes me puedan ayudar el problema es que yo inserto en mi Form un TrayIcon y un ImageList...
- En el ImageList inserto varias imagenes,
- En el TrayIcon pongo su Propiedad ...
Icons=ImageList1;
Animate=true;

Pero cuando ejecuto mi aplicacion el icono enpieza animarze pero cuando llega a la ultima imagen que yo puse que va a empezar por la primera se queda un momento en blanco,

Si alguien supiera como solucionar esto se lo agradeceria mucho, seguro estoy que otras personas tambien lo agradecerian.

[Saludo]...

escafandra 02-03-2009 19:05:34

yelian, asumiendo que el TTrayIcon al que te refieres es el ejemplo que viene en el Builder, y teniendo claro este asunto para los interesados en este hilo, te diré que ese Componente no es mas que un ejemplo de como implementarlos en C++ Builder. Como ejemplo, puede estar un poco deficitario y de hecho lo está.

El problema que expones se deriva de un bug, si así queremos considerarlo.

En el código fuente podemos encontrar la función miembro que se encarga de animar el cursor:
Código:

//---------------------------------------------------------------------------
void __fastcall TTrayIcon::DoOnAnimate(TObject *Sender)
{
  if (IconIndex < FIconList->Count)
      FIconIndex++;
  else
      FIconIndex = 0;

  SetIconIndex(FIconIndex);
  Update();
}

Si te fijas, la condición de fin de iconos es incorrecta, pues tras incrementar el indice FIconIndex, éste puede ser igual a FIconList->Count. Es decir apunta a un icono que no existe. Este es el motivo de que desaparezca el icono entre el último y el primero.

Para corregir este bug, basta con dejarlo así:
Código:

//---------------------------------------------------------------------------
void __fastcall TTrayIcon::DoOnAnimate(TObject *Sender)
{
  if (IconIndex < FIconList->Count - 1)
      FIconIndex++;
  else
      FIconIndex = 0;

  SetIconIndex(FIconIndex);
  Update();
}

Saludos.

yelian 04-03-2009 13:55:10

Gracias escafandra;

Pero donde pongo ese codico que me diste estuve buscando pero no encontre donde se pone, si fueras tan amable de decirme...

escafandra 04-03-2009 20:47:30

CBuilder\Examples\Controls\Source\trayicon.cpp

Saludos.

yelian 05-03-2009 23:56:31

Gracias escafandra, que bobo soy no me fije que era en el evento OnAnimate

gracias...

JuanErasmo 09-03-2009 23:25:27

MOstrar Ballonhint en TrayIcon
 
Buenas tardes,
Escanfandra! volvemos a encontrarnos,,,
Hablando ahora de trayicons, necesito saber que componente para C++ Builder 6 podria utilizar para obtener un ballonhint en el trayicon.

luego que pueda darle click, y ejecute alguna opción,

He intentado con el de LMDtrayicon, y con el Trayicon y ninguno tiene el metodo ShowHint,,,,,,cual lo tiene??'
Gracias!!

escafandra 10-03-2009 01:05:05

El TtrayIcon que viene de ejemplo con el Builder 5, e imagino que será similar al Builder 6, No puede representar balones de texto estilo XP, pero si muestra el Hint clásico.

Para mostrar un balón de texto, añade una nueva función miembro publica:
Código:

//---------------------------------------------------------------------------
// Muestra un Balón de texto en el icono de la barra de tareas
//---------------------------------------------------------------------------
void __fastcall TTaskBarIcon::ShowBalloon(AnsiString Titulo, AnsiString Texto)
{
  FData.cbSize = sizeof(FData);
  FData.uFlags = NIF_ICON | NIF_INFO;
  strcpy(FData.szInfoTitle, Titulo.c_str());
  strcpy(FData.szInfo, Texto.c_str());
  FData.dwInfoFlags = NIIF_INFO;

  Shell_NotifyIcon(NIM_MODIFY, &FData);
}

Para usar esta función, sólo debes llamarla cuando te interese mostrar algo.
Al hacer click no realiza ninguna acción. Puedes representar menus para ello.

Saludos.

JuanErasmo 10-03-2009 14:14:38

Muchas Gracias!!
 
Muchas gracias,
Dos preguntas:

1. Me esta saliendo undefined symbol Fdata, debo incluir algo mas?

2. Si quisiera adicionarle un evento de click al ballonhint, se podría hacer de alguna manera?

Muchas gracias!!!!

escafandra 10-03-2009 14:27:29

JuanErasmo, Esa función debes colocarla como función miembro de TTrayIcon del ejemplo del Builder, es decir modificar el fuente y la cabecera para añadir la función que en tu caso se debería llamar:

Código:

void __fastcall TTrayIcon::ShowBalloon(AnsiString Titulo, AnsiString Texto)
Cita:

undefined symbol Fdata

Fdata
es una propiedad privada de TTrayIcon. Si el código no lo añadiste al componente, lógicamente no está definido.

Este balón no es sensible a eventos.

Saludos.

JuanErasmo 10-03-2009 14:48:56

No entiendo como se puede hacer,,,,
abrí el demo de Trayicon, pero no veo la forma de integrar lo que me dices....

Gracias!

escafandra 10-03-2009 16:07:47

Pues si sigues la pista encontraras la fuente.:p

Saludos.;)

JuanErasmo 10-03-2009 16:37:28

Hé modificado estas fuentes,
 
Hola,
hé modificado las fuentes, pero no he conseguido invocar la función, agregué en el trayicon.cpp la funcion, y en el trayicon.h la definición,
pero cuando intento llamar el metodo no es visible....
estoy modificando el demo de builder, pero no consigo nada,,,,
me falta modificar algun otro archivo?

Gracias!

escafandra 10-03-2009 17:49:15

El proyecto de los controles de ejemplo se llama bcbsmp50.bpk, al menos en mi BCB 5.

Una vez añadida la función, complia el proyecto y usa el control visual como otro mas.... Me dices como te ha ido.

Saludos.

lmpadron 11-03-2009 02:16:08

Gracias amigos no formaba parte de este debate pero he estado al tanto de el, y de paso así decirlo, he podido resolver algunos problemillas que tenia GRACIAS a todos
Escafandra
Juan Eramos
Yelian
Por las respuestas y por las preguntas jajajajajajaja. ;-)

fedee 14-04-2009 15:03:49

Ayuda Con Trayicon
 
busqué por todos lados y no encontré como hacerlo en mi programa hecho en c++ builder!

alguien me ayuda? necesitaría q al minimizarse se oculte en la barra de tareas! :)

escafandra 14-04-2009 16:41:55

¿Ocultar de la barra de tareas?
Código:

Visible = false;
Saludos.

escafandra 14-04-2009 17:18:01

Perdón, no te entendí bien. ¿Te refieres al uso del TrayIcon?. ¿Quieres que al minimizar tu aplicación no aparezca en la barra de tareas pero si en el SysTry?.

Bueno, si las respuestas son afirmativas, entonces debes realizar lo siguiente:

Cambia esta función:
Código:

void __fastcall TTrayIcon::Minimize()
{
  Application->Minimize();
  ShowWindow(Application->Handle, SW_HIDE);

  if (FOnMinimize)
      FOnMinimize(this);
}

Por esta otra:
Código:

void __fastcall TTrayIcon::Minimize()
{
  Application->Minimize();

  if(FHide)
      ShowWindow(Application->Handle, SW_HIDE);

  if (FOnMinimize)
      FOnMinimize(this);
}

Esto hará que al minimizar tu aplicación, si la propiedad Hide del TrayIcon es true, se esconda de la barra de tareas y no lo haga en caso contrario.

Saludos.

fedee 14-04-2009 17:25:39

no entendi, pero si te paso mi fuente me lo haces?

escafandra 14-04-2009 18:07:16

Lee esto.

Saludos.

fedee 14-04-2009 21:48:49

soy nuevo, no sabia de la existencia de ese tipo de rules.


La franja horaria es GMT +2. Ahora son las 17:33:42.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi