Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Ventana emergente residente (https://www.clubdelphi.com/foros/showthread.php?t=90338)

mblascog 20-05-2016 08:32:13

Ventana emergente residente
 
Buenas, necesito crear un programa residente que dada una codición, visualize un aviso cada cierto tiempo.
La condición y el cierto tiempo está almacenado en una base de datos. Hace muchos años existía un componente en las RxLib. Pero ahora no tengo ni idea de por donde empezar.
Si alguien puede tirarme un cable?

Gracias

Casimiro Notevi 20-05-2016 09:22:03

Pero exactamente qué es lo que necesitas.

Neftali [Germán.Estévez] 20-05-2016 10:08:24

Y con qué versión estás trabajando.
Las nuevas versiones de Delphi ya traen los componentes que necesitas tanto para mostrar algo en la zona System Tray, como para mostrar notificaciones del sistema a partir de Windows 8/10.

Pero tampoco tengo claro que sea lo que necesitas.

mblascog 20-05-2016 10:22:18

Hola neftali, uso Delphi 7. De momento los pc's tienen W7 pero estamos migrando a W10.
Lo que quiero es que se abra una ventana tipo recordatorio, cuando se cumpla una condición.

Gracias

Casimiro Notevi 20-05-2016 11:44:56

Cita:

Empezado por Casimiro Notevi (Mensaje 505357)
Pero exactamente qué es lo que necesitas.

Pero cómo, dónde, cuándo, por qué...

mblascog 20-05-2016 12:16:13

Buenas Casemiro, el cuando? un programa residente que se dé una condición en base de datos, po ejemplo, que falta menos de un día, ....
Donde? Podría ser una ventana emergente en la parte inferior derecha de la pantalla, al igual que aparecen ventanas emergentes para actualizar un programa.
Por qué? es un recordatorio de tareas que hay que realizar, para que no se les pase.
Gracias

Casimiro Notevi 20-05-2016 12:18:05

¿Por qué no sigues usando las RXlib?

Neftali [Germán.Estévez] 20-05-2016 12:32:09

Alguna vez hemos hablado de este componente:
http://torry.net/quicksearchd.php?St....5.0&Title=Yes

En este hilo antiguo ya comentaron algo sobre él:
http://www.clubdelphi.com/foros/showthread.php?t=15263

Y aquí también; Incluso puedes ver alguna imagen de cómo quedaría.
http://www.clubdelphi.com/foros/showthread.php?t=64225

Por último, aquí se habla también de uno que tienen las JVCL, llamado JvDesktopAlert:
http://stackoverflow.com/questions/2...active-display

mblascog 20-05-2016 12:33:20

Pero las RxLib ya están absoletas no? No han sido reemplazadas por las Jedi?

Neftali [Germán.Estévez] 20-05-2016 12:51:54

Cita:

Empezado por mblascog (Mensaje 505369)
Pero las RxLib ya están absoletas no? No han sido reemplazadas por las Jedi?

Se incluyeron en alguna versión de la JVCL, pero si no quieres instalar todos los componentes de las JVCL y quieres sólo utilizar las RxLib, puedes encontrar versiones que están funcionales con las últimas versiones de Delphi (Seatle 10 y Berlin 10.1).

Yo he probado y compilado las que puedes encontrar aquí:
http://neftali.clubdelphi.com/?p=545

Y las últimas (que no he probado personalmente) las puedes encontrar en esta página:
http://www.micrel.cz/RxLib/dfiles.htm

escafandra 21-05-2016 00:56:43

Te muestro un ejemplo de como colocar una notificación en el SysTray con la API, el ejemplo viene de aquí:
Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ShellAPI;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  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;

// Ampliaciones para Vista
const NIIF_INFO    = $00000001;
const NIF_INFO     = $00000010;
const NIF_REALTIME = $00000040;
const NIF_SHOWTIP  = $00000080;
const NIIF_USER    = $00000004;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure ShowBalloon(Handle: THANDLE; Titulo, Texto: String);
var
  Data: TNotifyIconData;
begin
  ZeroMemory(@Data, sizeof(TNotifyIconData));
  Data.cbSize:= sizeof(TNotifyIconData);
  Data.uFlags:= NIF_ICON or NIF_INFO or NIF_REALTIME;
  Data.dwInfoFlags:= NIIF_INFO;
  lstrcpyn(Data.szInfoTitle, PCHAR(Titulo), 64-1);
  lstrcpyn(Data.szInfo, PCHAR(Texto), 256-1);
  Data.uTimeOut:= 1000;
  Data.Wnd:=  Handle;
  Shell_NotifyIcon(NIM_ADD, @Data);
  Shell_NotifyIcon(NIM_MODIFY, @Data);
  Shell_NotifyIcon(NIM_DELETE, @Data);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  ShowBalloon(Handle, Edit1.Text, Edit2.Text);
end;

end.
Muestro una imagen del diseño del formulario utilizado para este ejemplo.

También puedes definir tu propia ventana, como en este otro ejemplo donde uso una ventana desplegable translúcida de un color y posición definidos a voluntad para notificaciones.

Saludos.

ecfisa 21-05-2016 19:13:25

Hola.

Como para sumar otro ejemplo, me acorde de este: ...Show Balloon Tips for the Tray Icon?

Saludos :)

escafandra 21-05-2016 20:17:26

Cita:

Empezado por ecfisa (Mensaje 505411)
Hola.

Como para sumar otro ejemplo, me acorde de este: ...Show Balloon Tips for the Tray Icon?

Saludos :)

Eso es lo que hace el ejemplo que puse. Muestra una notificación en Systray acorde con el S.O. usado :).

Para completar, un componente para manejar el SysTray con notificaciones, control del tiempo de notificación, iconos animados y minimización de la app en el Systray que ya se comentó en clubdelphi otras veces.: TSysTrayIcon


Saludos.

mblascog 23-05-2016 13:17:01

Estoy mirando el ejemplo colgado por escafandra, pero no acaba de funcionarme. Tengo que pulsar bastantes veces el botón para que aparezca un instante el balloon.
En principio me gustaría que apareciera el balloon y ofrecer la posibilidad de hacer algo o cerrar

Gracias

escafandra 23-05-2016 14:36:01

1 Archivos Adjunto(s)
Te subo un proyecto y ejecutable.


Saludos.

mblascog 23-05-2016 15:00:44

Vale!!! genial. Muchas gracias

mblascog 23-05-2016 17:54:29

escafandra, pasa exactamente lo mismo. En el código, aunque no lo entiendo, hay unas constantes definidas para Vista, no será que en Windows 7 o posteriores no funciona?

En realidad lo que yo estoy buscando es un mensaje tipo el de java por ejemplo, que aparece el mensaje informando que hay una nueva actualización y tienes dos posibilidades. Eliminar el mensaje o descargar la actualización.

Es posible hacerlo?

Gracias

escafandra 23-05-2016 19:20:40

La función está probada en WinXP, Win8.1 y Win10.
Mira a ver la configuración de tu SO. Panel de control -> opciones de accesibilidad->-> Tiempo de Notificaciones

Saludos.

escafandra 23-05-2016 19:34:23

Una cosa más, Para Windows 8 en adelante , y posiblemente Vista, comenta la siguiente línea:
Código Delphi [-]
Shell_NotifyIcon(NIM_DELETE, @Data);

Saludos.

mblascog 23-05-2016 20:33:25

He visto el componente JvTrayIcon en las Jedi, que hace justo lo lo que busco.
Gracias por la colaboración.

mblascog 23-05-2016 23:03:16

Algo relacionado con el tema. Sabe alguien si hay manera de forzar que el icono aparezca fijo al lado del reloj y no oculto, de manera que se tenga que pulsar la tecla para visualizarlo?

Gracias.

mblascog 24-05-2016 09:07:24

Me contesto yo misma, no sé si existe alguna forma desde Delphi, pero he visto que se puede personalizar la lista de iconos ocultos. Pues aquí le indico al programa que muestre el icono y las notiificaciones así aparece fijo.

rocksoft 24-05-2016 19:10:35

Hola mblascog,

usa el componene TTrayIcon
http://docwiki.embarcadero.com/CodeE...yIcon_(Delphi)

Tambien si tienes Jedi instalado tiene uno

mblascog 24-05-2016 19:58:06

Gracias rocksoft. Finalmente he usado el trayicon de las Jedi. Va fantástico.
Mi intención es que el programa que estoy desarrollando inicie con las Windows, hasta ahí ningún problema, pero me gustaría que se iniciara en segundo plano, es decir, que apareciera el icono a la barra de tareas y caso de querer acceder al problema, fuese con dobleclick.
Y la verdad, no sé como empezar. Tienes alguna idea?

Gracias

rocksoft 24-05-2016 21:58:34

Buenas,

disparando a ciegas, inicia la aplicacion minimizandola, creo que existe una propiedad del trayicon que permite las dos opciones, esconder y poner en la barra.

mblascog 24-05-2016 22:23:34

Gracias rocksoft, he estado buscando y no soy capaz de encontrar la opción que minimizar o esconder. Corrijo, existe la propiedad HideApplication, pero da error: Cannot change Visible in OnShow or OnHide

rocksoft 25-05-2016 04:09:29

Hola,

con

Código Delphi [-]
procedure Tu_Form.FormShow(Sender: TObject);
begin
self.WindowState:=wsMinimized;
end;


lo minimizas

mblascog 25-05-2016 08:26:55

Rocksoft, esto minimiza la aplicación, y yo la quisiera al systray, y yo quisiera sólo el icono al lado del reloj.
Gracias

mblascog 25-05-2016 09:01:49

És más, por las dudas, lo acabo de probar y con el tryicon se hace un lío. El programa se minimiza, cosa que no quiero, pero al maximizar. Intento maximizar y aparece una pequeña pantalla a la parte inferior izquierda de la pantalla, con los botones de restaurar, maximizar o cerrar. Restauro para abrir de nuevo el programa, se ve un momento y desaparece. En el systray aparece el icono.

Casimiro Notevi 25-05-2016 09:33:22

Y los ejemplos de escafandra y ecfisa, qué tal.

mblascog 25-05-2016 10:09:56

Casemiro, son dos cosas diferentes, colocar el icono en el systray ya lo he conseguido. Lo que busco ahora es iniciar el programa al iniciar Windows y que aparezca en segundo plano, es decir, tener que clicar el icono del systray para acceder al programa.
Iniciarlo con las Windows ningún problema, pero lo que no encuentro es la manera de iniciarlo sin que se vea, sólo el icono, tipo programa antivirus, ....
Gracias

Casimiro Notevi 25-05-2016 10:11:39

Lo que te ha indicado rocksoft

mblascog 25-05-2016 10:44:03

Lo que me ha indicado rocksoft minimiza la aplicación, que no es lo mismo que aparezca el icono en el systray. Lo que quiero es que aparezca al lado del reloz, sólo el icono, como el sonido, red, antivirus y pulsar click, dobleclick, botón derecho, .... lo que sea, para abrir el interface.

Gracias

mblascog 25-05-2016 11:58:41

He conseguido lo que buscaba siguiendo los pasos de un post de xEsk de 25 de junio de 2008. En lugar de usar las Jedi he usado las RxLib y me ha funcionado

Casimiro Notevi 25-05-2016 12:24:29

Cita:

Empezado por mblascog (Mensaje 505563)
Lo que me ha indicado rocksoft minimiza la aplicación, que no es lo mismo que aparezca el icono en el systray.

Es lo que preguntaste, minimizarla, lo del icono es distinto y eso lo controlas tú.
Cita:

Empezado por mblascog (Mensaje 505566)
He conseguido lo que buscaba siguiendo los pasos de un post de xEsk de 25 de junio de 2008. En lugar de usar las Jedi he usado las RxLib y me ha funcionado

Son las mismas, las RXlib están integradas en las Jedi.

mblascog 25-05-2016 17:41:11

Hola Casemiro, no quiero contradecirte pero el componente TRxTrayIcon no dispone de las mismas propiedades que JvTrayIcon. Quizá no lo implementé bien pero no lo conseguí.
En cuanto a lo de minimizar, quizás me he expresado mal, pero no quiero minimizar sinó ocultar, y visualizarla al pulsar sobre el icono

Gracias

Casimiro Notevi 25-05-2016 18:30:50

Cita:

Empezado por mblascog (Mensaje 505566)
He conseguido lo que buscaba ... ... he usado las RxLib y me ha funcionado

Eso es lo que te dije hace 5 días :)
Cita:

Empezado por Casimiro Notevi (Mensaje 505366)
¿Por qué no sigues usando las RXlib?


mblascog 25-05-2016 18:37:32

Llevas razón que me lo dijiste, pero cómo hago para que aparezca el mensaje emergente, el balloonhint del de las jedi?

escafandra 25-05-2016 20:27:33

Andas bastante perdido.
Todas las opciones que se te dieron sirven.

Para mis sugerencias, te dije que probaras
1.- TSysTrayIcon
2.- Ventana desplegable translúcida
3.- ShowBalloon.

En el último caso y si no usas Win8 o Win 10 (y posiblemente Win7 y Vista) úsalo así:
Código Delphi [-]
procedure ShowBalloon(Handle: THANDLE; Titulo, Texto: String);
var
  Data: TNotifyIconData;
begin
  ZeroMemory(@Data, sizeof(TNotifyIconData));
  Data.cbSize:= sizeof(TNotifyIconData);
  Data.uFlags:= NIF_ICON or NIF_INFO or NIF_REALTIME;
  Data.dwInfoFlags:= NIIF_INFO;
  lstrcpyn(Data.szInfoTitle, PCHAR(Titulo), 64-1);
  lstrcpyn(Data.szInfo, PCHAR(Texto), 256-1);
  Data.uTimeOut:= 1000;
  Data.Wnd:=  Handle;
  Shell_NotifyIcon(NIM_ADD, @Data);
  Shell_NotifyIcon(NIM_MODIFY, @Data);
  //Shell_NotifyIcon(NIM_DELETE, @Data);  // Para WinXp esta línea debe ser comentada. En el resto de S.O. también funciona con la línea comentada
end;

Saludos.

mblascog 26-05-2016 10:25:04

escafandra, perdida es poco. El último programa que escribí en Delphi hace muchos años, no sé 10, 15, y la verdad, a pesar de recordar mucho, me cuesta.
Suerte tengo de la ayuda de este foro, y la verdad, lo estoy pasando pipa.
Finalmente lo he conseguido siguiendo tus indicaciones, muchísimas gracias.
Pero me faltaría una cosa, interesa que no se pueda cerrar el programa, sinó esconderlo. Pensaba que sería fácil, en el onclose del formulario principal, pensaba en action := caHide, pero no funciona.
He buscado por el foro, y he encontrado esta explicación de Lepe, del año 2005, pero no la entiendo, no sé que és lo que tengo que hacer.
Para salir del paso, y la verdad me está bien, he eliminado los botones del form, y en la opción Salir del menú, he puesto Hide y funciona

De nuevo muchas gracias

Cita:

procedure TCustomForm.Close;
var
CloseAction: TCloseAction;
begin
if fsModal in FFormState then
ModalResult := mrCancel
else
if CloseQuery then
begin
if FormStyle = fsMDIChild then
if biMinimize in BorderIcons then
CloseAction := caMinimize else
CloseAction := caNone
else
CloseAction := caHide;
DoClose(CloseAction);

// Estas 2 comprobaciones son las que hace terminar la aplicación
// y por eso solo funciona con caNone, con los demás se cierra.
if CloseAction <> caNone then
if Application.MainForm = Self then Application.Terminate

else if CloseAction = caHide then Hide
else if CloseAction = caMinimize then WindowState := wsMinimized
else Release;
end;
end;


La franja horaria es GMT +2. Ahora son las 10:42:53.

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