PDA

Ver la Versión Completa : Balón de texto de Windows.


fide
19-12-2006, 21:54:06
Hola, en realidad lo que necesito es como mostrar un balón de texto de los que muestra Windows pero mediante una aplicación en delphi. Si me pueden enviar un ejemplo a fide1988man@yahoo.es o decirme donde puedo encontrar un ejemplo se los agradecería.

Gracias de nuevo amigos.

seoane
19-12-2006, 22:18:10
Si me pueden enviar un ejemplo a fide1988man@yahoo.es


Por favor, respeta la guia de estilo y no pidas que te envíen la información a tu email. Piensa que la razón de ser de un foro es el de compartir las respuestas con todos los usuarios.

Y volviendo al tema de tu pregunta, ¿Que versión de delphi utilizas?. Porque según la versión que utilices, puede que tengas que implementar tu todo el código, que ya dispongas de un componente para mostrar el icono en la barra de tareas, e incluso en la ultimas versiones, el mismo componente se encarga de mostrar los globos.

fide
24-12-2006, 12:46:38
Hola, y disculpas por lo del email. El problema es que no había leido la guía de estilos.

Volviendo al balon, uso delphi 5.

fide
24-12-2006, 12:50:17
Ha, y si pueden decirme como encontrar un componente que haga eso o ayudarme a crear uno se los agradecería.

Gracias a todos de antemano amigos.

dec
24-12-2006, 13:04:26
Hola,

¿Te refieres a los "balones" que se muestran en los iconos de la Bandeja del Sistema o te refieres a los que aparecen en distintos controles de los formularios de las aplicaciones? En todo caso busca en Torry's (http://www.torry.net/quicksearchd.php?String=Balloon&Title=Yes).

seoane
24-12-2006, 13:15:41
Hola fide, según creo la versión de delphi que utilizas no cuenta con ningún componente como el que necesitamos, aunque no estoy seguro porque nunca he trabajado con esa versión. De todas formas si es un componente lo que buscas, seguro que en esta pagina encontraras varios http://www.torry.net/

Ahora bien, si lo quieres crear por código, no resulta muy difícil:

// Lo primero es añadir ShellApi a las uses
uses ShellApi;

// Y el tipo TNOTIFYICONDATA que ne versiones anteriores no esta completo
type
TNOTIFYICONDATA = record
cbSize: DWORD;
Wnd: HWND;
uID: UINT;
uFlags: UINT;
uCallbackMessage: UINT;
hIcon: HICON;
szTip: array [0..127] of AnsiChar;
dwState: DWORD;
dwStateMask: DWORD;
szInfo: array [0..255] of AnsiChar;
uTimeout: UINT;
szInfoTitle: array [0..63] of AnsiChar;
dwInfoFlags: DWORD;
end;

//Para crearalo
procedure TForm1.FormCreate(Sender: TObject);
var
Data: TNOTIFYICONDATA;
begin
FillChar(Data,Sizeof(Data),0);
with Data do
begin
cbSize:= Sizeof(Data);
Wnd:= Handle;
uID:= 100;
uFlags:= NIF_ICON;
hIcon:= Application.Icon.Handle;
end;
Shell_NotifyIcon(NIM_ADD,@Data);
end;

// Para destruirlo
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
Data: TNOTIFYICONDATA;
begin
FillChar(Data,Sizeof(Data),0);
with Data do
begin
cbSize:= Sizeof(Data);
Wnd:= Handle;
uID:= 100;
end;
Shell_NotifyIcon(NIM_DELETE, @Data);
end;

// Para mostrar un mensaje
procedure TForm1.MostrarBalon(Titulo, Texto: String);
var
Data: TNOTIFYICONDATA;
begin
FillChar(Data,Sizeof(Data),0);
with Data do
begin
cbSize:= Sizeof(Data);
Wnd:= Handle;
uID:= 100;
uFlags:= NIF_ICON or NIF_INFO;
hIcon:= Application.Icon.Handle;
StrLCopy(szInfoTitle,PChar(Titulo),Sizeof(szInfoTitle)-1);
StrLCopy(szInfo,PChar(Texto),Sizeof(szInfo)-1);
dwInfoFlags:= NIIF_INFO;
end;
Shell_NotifyIcon(NIM_MODIFY,@Data);
end;

// Por ejemplo
MostrarBalon('Titulo','Hola mundo');

fide
24-12-2006, 13:56:08
Hola seoane, tu siempre ayudando man. Muchas gracias. Todo me fue de marabillas. El unico detalle es que en la función que me disate no me mostraba los icono. Alberto me ayudo en eso y me dio todas las constantes apara los íconos de los balones. Muchas gracias de nuevo y

== Felíz Año Nuevo man y suerte ==

Alcolea
28-12-2006, 03:26:31
Hola seoane, tu siempre ayudando man. Muchas gracias. Todo me fue de marabillas. El unico detalle es que en la función que me disate no me mostraba los icono. Alberto me ayudo en eso y me dio todas las constantes apara los íconos de los balones. Muchas gracias de nuevo y

== Felíz Año Nuevo man y suerte ==

Amigo fide, como a ti me sucede que hay problemas con los iconos, ¿
cuales son esas constantes, por favor?

seoane
28-12-2006, 03:54:15
:confused: No comprendo, cuando decís que no muestra los iconos ¿de que iconos estáis hablando?. Solo es curiosidad, porque a mi el código que puse me funciona perfectamente.

roman
28-12-2006, 05:31:30
Al parecer en Delphi7- no sólo la estructura TNotifyIcon está incompleta para la versión más reciente del shell, sino que también se omiten algunas constantes que usas en tu código. Supongo que es a lo que se refieren e imagino que fide olvidó compartirlo ("regaño" suave para fide :p).

Estas son las constantes:


const
NIF_INFO = $10;

NIIF_NONE = $0;
NIIF_INFO = $1;
NIIF_WARNING = $2;
NIIF_ERROR = $3;
NIIF_USER = $4;
NIIF_NOSOUND = $10;


// Saludos

Alcolea
28-12-2006, 05:38:41
Debe faltar algo que no he puesto, pero no me funciona lo del balón con el ejemplo que pusiste, más bajé los componentes que sujeriste y es con esto con lo que puedo hacer lo del balón. (no sale el balón pero si el icono)

Seguiré intentando, gracias por la ayuda.

Alcolea
28-12-2006, 05:59:54
Un último consejo sobre esto del balón, ¿en que evento aconsejaría usarlo, por ejemplo, para un Edit ? lo he probado con OnMouseMove, OnMouseDown y otros, y todos me resultan molestos ya que al menos estos dos que menciono se repiten constantemente cada ves que se trata de acceder al control por el usuario.

seoane
28-12-2006, 11:56:20
Al parecer en Delphi7- no sólo la estructura TNotifyIcon está incompleta para la versión más reciente del shell, sino que también se omiten algunas constantes que usas en tu código.

:p Es verdad, no me acorde de incluir las constantes. Y eso que un tema anterior (http://www.clubdelphi.com/foros/showpost.php?p=162995&postcount=5), si que me acordaba de incluirlas.

Lepe
28-12-2006, 12:37:58
Dependerá del componente, hay algunos que pueden suplantar el OnHint de delphi, quizás sea el mejor momento para mostrarlo.

Por código, suelo usarlo para mostrar errores / información / aviso a los usuarios, olvidando el MessageBox y el ShowMessage.

Saludos

roman
28-12-2006, 19:29:22
No sé por qué, pero a mi me da la impresión de que en este hilo se ha estado hablando de dos cosas distintas. Por un lado están los iconos en la bandeja del sistema con un hint en forma de balón, que es de lo que trata el código de seoane, y por otro están los balones que funcionen como hint sobre algún otro control. Que yo sepa no es lo mismo, ¿o sí?

// Saludos

Lepe
29-12-2006, 11:16:03
Tienes toda la razón roman, no había visto el código de seoane para el mostrar el balon.

Yo uso el de la JVCL para mostrarlo sobre cualquier control, con posibilidad de sustituir al Hint.

Saludos

fide
31-12-2006, 20:52:29
Bueno, bueno, en este hilo lo que yo pretendía desarrollar es el balón de texto que se imprime cuando por ejemplo, Windows no tiene antivirus o el Firewall no está activo.

[Puede que se equipo esté en riesgo, se a cuerdan????]

O sea, es mismo que me explico seoane y que solo funciona en Windows 2000 o XP.

Aunque me interesa eso de mostrar ese mismo balón sobre los controles de las ventanas.

¿Cómo lo hacen?

Lepe
01-01-2007, 04:27:19
En mi caso, tienes que instalar la JVCL (más de 600 controles para delphi), aunque también lo podrás en torrys.net buscando por Balloon o BalloonHint

Saludos

fide
09-01-2007, 12:27:09
Amigos, gracias a la ayuda que me han brindado he logrado desarrollar un componente bello para imprimir el dichoso balón de texto. Le he puesto como nombre de la clase TNotifyBalloon y contiene las propiedades


Title
Text
Icon
Quiero seguir mejorándolo para incluirle incluso nuevos eventos y cosas buenas. Dentro de poco les pongo la Unit para que la analicen y me ayuden a mejorarlo.

Ha, importante. Si alguien sabe como hacer que el baloncito se pueda notificar también sobre cualquier control del formulario nos lo puede comunicar a mi y a todos los de este foro para mejorar el componente.

Y ya que fue gracias a Seoane y Roman principalmente que hice este componente en el About ellos tendrán su buen lugar. Jeje je.

fide
18-01-2007, 10:33:26
// Sepan que no estoy muy diestro en la creación de componentes pero me atreví a hacer este con la ayuda de unos amigos una tarde de aurrimiento.



//---------------------------------------------------------

unit NotifyBalloon;

interface

uses
SysUtils,Windows, Classes, ShellApi,Forms,Dialogs;


const
NIF_INFO = $10;


type
TNotifyIcons = (NIIF_NONE , NIIF_INFO ,NIIF_WARNING ,NIIF_ERROR ,NIIF_USER );

TNOTIFYICONDATA = record
cbSize: DWORD;
Wnd: HWND;
uID: UINT;
uFlags: UINT;
uCallbackMessage: UINT;
hIcon: HICON;
szTip: array [0..127] of AnsiChar;
dwState: DWORD;
dwStateMask: DWORD;
szInfo: array [0..255] of AnsiChar;
uTimeout: UINT;
szInfoTitle: array [0..63] of AnsiChar;
dwInfoFlags: DWORD;
end;
TNotifyBalloon = class(TComponent)

private
FTitle: String;
FText: String;
NIcon : Integer;

protected
{ Protected declarations }
FIcon: TNotifyIcons;
Data: TNOTIFYICONDATA;
procedure SetIcon;

public
{ Public declarations }
ClientHandle : HWND;
IconHandle : HWND;
constructor Create(AOwner: Tcomponent); override;
procedure ShowNotifyBalloon;
procedure NotifyIcon;
procedure DeleteIcon;
published
{ Published declarations }
property Icon : TNotifyIcons read FIcon write FIcon;
property Title : String read FTitle write FTitle ;
property Text : String read FText write FText ;

end;

procedure Register;

implementation
{*.res}
constructor TNotifyBalloon.Create(AOwner : TComponent);
begin
inherited Create(AOwner);
FIcon := NIIF_NONE;
end;
procedure TNotifyBalloon.NotifyIcon;
begin
FillChar(Data,Sizeof(Data),0);
with Data do
begin
cbSize:= Sizeof(Data);
Wnd:= ClientHandle;
uID:= 100;
uFlags:= NIF_ICON;
hIcon:= IconHandle;
end;

Shell_NotifyIcon(NIM_ADD,@Data);

end;

procedure TNotifyBalloon.DeleteIcon;
begin
FillChar(Data,Sizeof(Data),0);
with Data do
begin
cbSize:= Sizeof(Data);
Wnd:= ClientHandle;
uID:= 100;
hIcon:= IconHandle;
end;
Shell_NotifyIcon(NIM_DELETE, @Data);

end;

procedure TNotifyBalloon.SetIcon ;
begin
if FIcon = NIIF_NONE then NIcon := $0;
if FIcon = NIIF_INFO then NIcon := $1;
if FIcon = NIIF_WARNING then NIcon := $2;
if FIcon = NIIF_ERROR then NIcon := $3;
if FIcon = NIIF_USER then NIcon := $4;

end;

procedure TNotifyBalloon.ShowNotifyBalloon;
begin
FillChar(Data,Sizeof(Data),0);
with Data do
begin
cbSize:= Sizeof(Data);
Wnd:= ClientHandle;
uID:= 100;
uFlags := NIF_ICON or NIF_INFO;
hIcon:= Application.Icon.Handle;
StrLCopy(szInfoTitle,PChar(FTitle),Sizeof(szInfoTitle)-1);
StrLCopy(szInfo,PChar(FText),Sizeof(szInfo)-1);
SetIcon;
dwInfoFlags := NIcon;
end;

Shell_NotifyIcon(NIM_MODIFY,@data);

end;
procedure Register;
begin
RegisterComponents('Win32', [TNotifyBalloon]);
end;


end.


//---------------------------------------------------------

//Instalar el componente.

//Un ejemplo de llamada


procedure TForm1.FormCreate(Sender: TObject);
begin

with NotifyBalloon do
begin
IconHandle := Application.Icon.Handle;
ClientHandle := Handle;
NotifyIcon;
end;

end;

procedure TForm1.FormDestroy(Sender: TObject);
begin

NotifyBalloon.DeleteIcon;

end;

procedure TForm1.Button1Click(Sender: TObject);
begin

with NotifyBalloon do
begin
Icon := NIIF_INFO;
Title := 'Sugerencia';
Text := 'Visite http://www.clubdelphi.com para que aprenda el arte de la programación en Delphi.' + #13 +
'Exponga dudas y sugerencias a todos los foreros del sitio.';
ShowNotifyBalloon;
end;

end;


//Si tiene algo que se pueda mejorar díganselo a Roman o a Seoane

Lepe
18-01-2007, 11:53:04
]Ha, importante. Si alguien sabe como hacer que el baloncito se pueda notificar también sobre cualquier control del formulario nos lo puede comunicar a mi y a todos los de este foro para mejorar el componente.

Lo dicho, aunque el balón sea idéntico, en forma, tamaño y color, se usa técnicas distintas. El balón que has construido solo es para el TrayIcon.

Saludos

fide
20-01-2007, 01:53:36
Si lepe, fue solo para el tray. Yo dije que queria aprender a notificarlo sobre los controles, además tambien dije que se podia mejorar si me enviaban sugerencias.

gtellezv
13-02-2007, 00:58:17
Hola, use tu codigo instalando el componente y pegando la llamada en un formulario y no me funciona, estoy con delphi 7 y winxp. Te habra faltado algo por ahi?. Gracias y salu2

FENIXadr
31-03-2014, 05:15:08
Hola gente estoy utilizando los globos con unos procedimientos que encontré dando vueltas en la red que básicamente son muy parecidos a los que mostró seoane y el inconveniente que tengo es que no puedo hacer que estén "encendidos" indefinidamente, tiene una variable rara con un "TimeOut" pero por mas que le pongas "Infinite" o algún numero grande, el globo se desvanece igual de rápido.. alguna idea??, uso delphi 7

Este es el código...
Está en crudo así que hay constantes que no se usan.. pero no las quité..

desde ya muchas gracias.




const
WM_MYMEMO_ENTER = WM_USER + 500;
WM_ICONTRAY = WM_USER + 1;

NIF_INFO = $10;
NIF_MESSAGE = 1;
NIF_ICON = 2;
NOTIFYICON_VERSION = 3;
NIF_TIP = 4;
NIM_SETVERSION = $00000004;
NIM_SETFOCUS = $00000003;
NIIF_INFO = $00000001;
NIIF_WARNING = $00000002;
NIIF_ERROR = $00000003;

NIN_BALLOONSHOW = WM_USER + 2;
NIN_BALLOONHIDE = WM_USER + 3;
NIN_BALLOONTIMEOUT = WM_USER + 4;
NIN_BALLOONUSERCLICK = WM_USER + 5;
NIN_SELECT = WM_USER + 0;
NINF_KEY = $1;
NIN_KEYSELECT = NIN_SELECT or NINF_KEY;



TNewNotifyIconData = record
cbSize: DWORD;
Wnd: HWND;
uID: UINT;
uFlags: UINT;
uCallbackMessage: UINT;
hIcon: HICON;
//Version 5.0 is 128 chars, old ver is 64 chars
szTip: array [0..127] of Char;
dwState: DWORD; //Version 5.0
dwStateMask: DWORD; //Version 5.0
szInfo: array [0..255] of Char; //Version 5.0
DUMMYUNIONNAME: TDUMMYUNIONNAME;
szInfoTitle: array [0..63] of Char; //Version 5.0
dwInfoFlags: DWORD; //Version 5.0
end;


{ShowBalloonTips procedure carry out the new feature: Balloon Tips}
procedure TForm1.ShowBalloonTips;
var
TipInfo, TipTitle: string;
begin
IconData.cbSize := SizeOf(IconData);
IconData.uFlags := NIF_INFO;
TipInfo := 'Esto es una prueba del texto que se puede poner en el globo emergente: http://www.ajpdsoft.com';
strPLCopy(IconData.szInfo, TipInfo, SizeOf(IconData.szInfo) - 1);
IconData.DUMMYUNIONNAME.uTimeout := 30000;
TipTitle := 'Este sería el título del globo';
strPLCopy(IconData.szInfoTitle, TipTitle, SizeOf(IconData.szInfoTitle) - 1);
IconData.dwInfoFlags := NIIF_INFO; //NIIF_ERROR; //NIIF_WARNING;
Shell_NotifyIcon(NIM_MODIFY, @IconData);
{in my testing, the following code has no use}
IconData.DUMMYUNIONNAME.uVersion := NOTIFYICON_VERSION;
if not Shell_NotifyIcon(NIM_SETVERSION, @IconData) then
ShowMessage('Ha fallado la creación del icono en la barra de notificación.');
end;

Lepe
04-04-2014, 14:24:33
No tengo la respuesta, pero si haces ese programa, yo seré uno de los que te maldiga eternamente :D. ¿Por qué quieres que sea indefinido? Ese es el área de notificación y su forma de funcionar es exactamente esa (que se oculte pasado un tiempo). Si necesitas que el usuario pulse para dar conformidad a algo, pon un diálogo ShowModal.

Saludos

FENIXadr
04-04-2014, 21:48:35
:eek::eek::eek:.... no me odies Lepe.. :o.. no... la cosa es la siguiente.. me hice una pequeña herramienta que me avisa de los cambios en el registro y me parecio muy prolijo y esteticamente agradable el hecho de mostrar en los globos de la barra de tareas los cambios que se produzcan en el registro de windows, el inconveniente es que si en ese momento no estas presente o por algun motivo no ves el globo, se desvanecera y no te daras cuenta del cambio hasta que decidas ver por tu cuenta la herramienta.. aunque parezca molesto me parece justificado el hecho de mostrar un globo y que hasta que no lo cierres este alertandote del problema.. por el momento voy a implementar un Timer que te avise cada 5 o 10 minutos (no se bien el tiempo aun) de alguna alerta que no hayas corroborado...

saludos.

Lepe
05-04-2014, 18:59:32
¿Ves? Eso ya me gusta más ;)

También podrías mostrar una pila de avisos (si el usuario no lo ha cerrado o pulsado un botón como que se ha enterado), pones varios avisos unos sobre otros y un botón "leído todos los avisos" o algo así.

De todas formas creo ese programa debe tener un log con todos los avisos que ha detectado. Aunque supongo ya has pensado en ello también.

Saludos

FENIXadr
05-04-2014, 19:48:11
si si ... en realidad el globo sería para el último aviso detectado porque va quedando justamente un log con todo el historial de cambios, además el icono de la barra de tareas cambia de color segun el estado..

Saludos.