PDA

Ver la Versión Completa : Manejo de Msnpopup


Choclito
08-02-2011, 15:35:55
Buenos dias amigos del foro, la consulta que tengo es la siguiente:
Antes les comento que hice un sistema para una clinica,en la que tengo varios modulos (caja.laboratorio,enfermeria,etc)por cada modulo tiene su propio menu
Trabajo con delphi 7,firebird 2.1,componentes MDO, es un sistema cliente servidor.
Ahora les comento el problema que tengo, mi cliente me dijo que quiere que cuando hagan el registro de los resultados de un paciente en el modulo de laboratorio aparesca un mensaje tipo messenger en el modulo de caja para que de esa manera la cajera sin necesidad de acceder a un formulario ya sepa que se tiene que cobrar al paciente.
Vi en el foro que para eso hay el componente tmsnpopup, no pude encontrar ejemplos sobre el componente.
Agradeceria a los amigos del foro sus comentarios o ejemplos sobre el componente, mil gracias amigos foreros.

rgstuamigo
08-02-2011, 17:02:49
Bueno básicamente al MSNPopUp debes ponerle un título(Propiedad Title),un texto(Propiedad texto) y el tiempo (en segundos) que permanecerá en pantalla(Propiedad TimeOut), desde luego tiene muchas otras propiedades, es solo ir haciendo la prueba con cada una de ellas y ver que sucede...;):D
Para mostrar el MSNPopUp en pantalla se hace así:

MSNPopUp1.ShowPopUp;

Espero te sirva de ayuda...:)
Saludos...:)

Choclito
08-02-2011, 18:53:59
Muchas gracia por responder amigo forero
Pero para aclarar la duda les explico lo siguiente, cuando ejecuto el sistema me muestra una venta de validacion de acceso que dependiendo del area de registro el usuario ingresa al menu del modulo(caja,enfermeria,etc)
Mi duda es que evento de que formulario es llamar al componente pues, la enfermera tiene su propio modulo de trabajo en el cual realiza un registro que simultaneamente la cajera esta con su modulo y en el cual quiero que le aparesca el mensaje tipo messenger del registro que se hizo en el modulo de enfermeria, ya lo he visto el componente pero no me ubico en que formulario o en que evento tendria que llamar al componente.
Gracias por responder y si no se me entendio volvere a consultares, mil gracias

rgstuamigo
08-02-2011, 19:35:57
Bueno... segun entiendo..lo que tratas de hacer es una especie de mensajería entre dos host(PC) clientes, cuando uno de ellos inserte un nuevo registro en la Base de dato.
Pues básicamente la idea es que despues que se inserte el registro nuevo, la aplicacion detecte eso desde la base de dato, y eso se puede lograr por ejmplo:
1.-Usando Trigger o procedimiento almacenado en la BD que notifique a un componente identico al TIBEvents de la paleta "InterBase" de delphi;que a ocurrido una insercion nueva ;) ;personalmente no conosco los componentes MDO que mencionas, pero verifica o averigua si tiene algo similar al TIBEvents.;)
2.-Otra opcion es que te crees una miniaplicacion usando Socket para comunicarte entre las diferentes PC de tu red.;)

Pueda que hayas otras opciones... pero creo que por ahí va la cosa...;):D
Saludos...:)

Choclito
11-02-2011, 21:30:42
Muchas gracias por tu comentario y ayuda,justamente es eso lo que quisiera lograr tipo mensajeria entre pcs, te comento que los componentes MDO cuentan con el componente MDOEvent, pero la verdad no tengo idea de como utilizarlo , te pido porfavor que si tuvieras un ejemplo me puedas indicar. mil gracias por todo

rgstuamigo
12-02-2011, 15:01:43
Has un a búsqueda (http://www.clubdelphi.com/foros/search.php) con palabras clave como "IBEvents" de de seguro encontrarás muchos hilos(Temas) que hablan de su uso.;)
Saludos...:)

AzidRain
12-02-2011, 22:30:17
Otra forma un poco mas sencilla que no te requerirá mucha programacion:

1.- Creamos una tabla que llamaremos "mensajes" y ahi defines como va a ser el mensaje (de quien para quien, fecha y hora, etc.)
2.- En los módulos donde quieras "mandar un mensaje" simplemente haces una inserción en la tabla anterior y llenas con los datos necesarios.
3.- En los módulos coloca un timer que cada x segundos vaya y con un select vea si hay mensajes sin leer en la tabla "mensajes", si es así mandas el aviso y das oportunidad de leerlo. Una vez leído, marcas el registro para que la próxima vez que se dispare el timer ya no vuelva a "avisar".

Es un método muy sencillo pero funciona bien, además de que adicionalmente puedes mantener un historial de mensajes si así lo quieres. Y como "enviar" un mensaje es una mera inserción de un registro, puedes colocar esta rutina en cualquier parte de tu sistema donde lo requieras.

Choclito
14-02-2011, 14:54:18
Muchas gracias amigo AzidRain del foro por la sugerencia, lo pruebo y luego comento como me va.
Antes indicarle que gracias a las anteriores sugerencias y ejemplos de ibevent en el foro pude hacerlo, el problema era que podia mostrar el mensaje con un showmessage, mi intencion era mostrar con un tmsnpopup el nombre del paciente registrado en el otro modulo, pero cuando colocaba el codigo de popup.showpopup no mostraba nada, lo cambie por un showmessage y funciono, el problema era que cuando queria cerrar el otro modulo me daba un error con codigo 1400 y no sabia que hacer.
Esta ultima opcion la probare y luego les comento amigos del foro, mil gracias

rgstuamigo
14-02-2011, 17:14:24
...
3.- En los módulos coloca un timer que cada x segundos vaya y con un select vea si hay mensajes sin leer en la tabla "mensajes", si es así mandas el aviso y das oportunidad de leerlo. Una vez leído, marcas el registro para que la próxima vez que se dispare el timer ya no vuelva a "avisar".

Bueno es una alternativa más la que nos comentas el amigo AzidRain y no quiero menospreciarla, al intentar de dar el siguiente comentario, de ninguna manera ;):
Bueno algo que le veo en contra es el hecho de estar cada "x" segundo haciendo un "SELECT" al base de dato, ésto me no me parece acertado, ya que estariamos saturando la red y el servidor demasiado, y peor aun si existen muchos usuarios conectados, si bien los servidores de BD de hoy en día son muy eficientes y potentes, pero no podemos (en mi opinion) darlos el lujo de lanzar cada x segundo una consulta nada más para hacer eso;), pues no me perece muy óptimo, lo ideal para mí sería que cuando se inserte o edite un registro en la BD, el servidor de BD notifique de dicho cambio a la aplicación desde donde se ha hecho la insercion o Modificacion y es exactamente lo que logra el componente "IBEvents" atraves de algun Triggers;)
Es solo mi opinion personal...;)
Nuestro amigo Choclito es quien toma la decision de la manera que lo va a hacer?;):D
Saludos...:)

Choclito
14-02-2011, 20:10:37
Gracias amigos del foro comentarles lo siguiente:
aplicando mdoevent les cuento que tengo los siguientes problemas:
Antes nuevamente decirles que lo que quiero es que en enfermeria registran a un paciente y quiero que en el modulo de caja me muestre un mensaje
Con los ejemplos de manejo de ibevent lo adecue a mi aplicacion pero tengo los siguientes problemas:
1.- En principio queria que el mensaje que se muestre en el modulo de caja sea con un msnpopup pero no daba nada, el codigo es el siguiente:



procedure TF_Menu_Caja.EventoEventAlert(Sender: TObject;
EventName: String; EventCount: Integer; var CancelAlerts: Boolean);
begin
If EventName = 'ALTA' then
BEGIN
popup.Text:='Paciente dado de alta';
popup.ShowPopUp;
//showmessage('paciene dado de alta');
//MsgBox ('Sistema S&S','Paciente dado de alta',MB_OK + MB_ICONINFORMATION);

END;
end;



, luego para verificar si realmente trabaja el componente probe con un showmessage y dio el mensaje, pero luego como tengo una unidad para personalizar mis mensajes(esto gracias al foro tambien) entonces lo que hice es llamar al form del mensaje para mostrar el mensaje,el problema esta es que tengo varios botones que llaman al form del mensaje , el sistema me da error de debuger exception notification "el identificador de la ventana no es valido", donde esta el error
,el codigo es este:

procedure TF_Menu_Caja.EventoEventAlert(Sender: TObject;
EventName: String; EventCount: Integer; var CancelAlerts: Boolean);
begin
If EventName = 'ALTA' then
BEGIN

//showmessage('paciene dado de alta');
MsgBox ('Sistema S&S','Paciente dado de alta',MB_OK + MB_ICONINFORMATION);

END;
end;

Cual seria el error? o que soluciones le doy? Muchas gracias amigos por el aporte brindado, y sobre el anterior post lo probe sobre crear una tabla de mensajes y por ultimo creo q utilizare esa opcion, pero me gustaria explotar las ventajas de firebird, mil gracias

Choclito
14-02-2011, 20:16:54
aclarando cuando se da de alta al paciente en el modulo de enfermeria , con el siguiente codigo:

procedure TF_Menu_Caja.EventoEventAlert(Sender: TObject;
EventName: String; EventCount: Integer; var CancelAlerts: Boolean);
begin
If EventName = 'ALTA' then
BEGIN

MsgBox ('S&S','Paciente dado de alta',MB_OK + MB_ICONINFORMATION);

END;
end;

Me muestra el mensaje en el modulo de caja, pero cuando hago click en varios botones que llaman al MsgBox me da el error que anteriormente ya les comente, la verdad nose como arreglarlo,estare agradecido por los comentarios, mil gracias

Choclito
14-02-2011, 20:49:15
Disculpen que nuevamente consulte,que es lo que me faltaria hacer (codigo) para que me muestre o se ejecute el popup.showpopup pues llamando al showmessage comprobe que el ibevent funciona
Ahora creo q utilizando el msnpopup seria mas visual los mensajes es por eso que hago la consulta, mil gracias por las sugerecias brindadas amigos foreros

rgstuamigo
15-02-2011, 14:18:17
Pues me parece bastante raro que no se te muestre el "MSNPopUp", a mi me funciona perfecto.;)
En todo caso puedes probar con otros componentes por ejemplo el componente"Alert WinPupUp (http://www.onix.it/delphi/)";) u otro similar.;)
Tambien en éste (http://www.clubdelphi.com/foros/showthread.php?t=64225) hilo hay una version modificada del componente "WinAlert" para ponerle sonido.;)
Desde luego tambien puedes crearte una Ventana(formulario) propia para mostrar tus mensaje.;)
Saludos...:)

Choclito
15-02-2011, 15:30:56
Muchas gracias por la respuesta amigo rgstuamigo comentarte lo siguiente:
1.-En mi aplicacion tengo una unidad donde personalizo mis mensajes entonces para llamar a los mensajes llamo a una funcion de la unidad unitshowmesage
2.- NO me habia percatado que cuando llamo al popup.showpopup lo primero es que no me muestra nada y lo segundo es que cuando hago click en un boton que llama a la unidad de mensajes me sale el siguiente mensaje:
Debuger Exception Notification
El identificador de la ventana no es valido,Process stoped Use step o run to continue
Donde esta el error ?? que estaria haciendo mal?? estare muy agradecido por la ayuda que me brinden,mil gracias
Sera por eso que no me muestra el popup???

rgstuamigo
15-02-2011, 19:52:47
Sin ver tú código no se puede hacer nada...:o:o tan solo especular..;)
Saludos...:)

Choclito
15-02-2011, 20:59:02
Tienes razon amigo, este es el codigo en firebird en el triger donde llamo al evento ALTA si cumple la condicion



CREATE OR ALTER trigger evento_reg_internacion for registro_internacion
active after update position 0
AS
begin
if ((new.diagnostico_egreso<>'TRASLADO A OTRA CAMA Y SALA')and(new.tipo_alta is not null)) then
post_event 'ALTA';
end


Tengo un componente evento (tmdoevent) y un popup(msnpopup) en el formulario menu_caja y en el evento onshow tengo este codigo:

procedure TF_Menu_Caja.FormShow(Sender: TObject);
begin
xpmenu1.Active:=true;
jvstatusbar1.Panels[1].Text:='Usuario: '+f_usuarios.loginn;
fd.UnLoad;
fd.AddFormClass(tf_pres_caja,true);
evento.Events.Add('ALTA');
evento.RegisterEvents;
end;


tambien probe en el evento oncreate pero tampoco pasaba nada, el siguiente codigo:

evento.Events.Add('ALTA');
evento.RegisterEvents;


luego en el evento onevent del componente evento tengo el siguiente codigo:

procedure TF_Menu_Caja.EventoEventAlert(Sender: TObject;
EventName: String; EventCount: Integer; var CancelAlerts: Boolean);
begin
If EventName = 'ALTA' then
BEGIN
//popup.Text:='Paciente dado de alta'; // MostrarCitas; // = refresh
popup.ShowPopUp;
//showmessage('paciene dado de alta');
//MsgBox ('Sistema S&S','Paciente dado de alta',MB_OK + MB_ICONEXCLAMATION);
{Application.MessageBox(
pchar( 'Paciente dado de alta'),
pchar(' Sistema S&S '),
MB_OK+MB_ICONWARNING+MB_SYSTEMMODAL); }
END;
end;


ademas tengo una unidad donde personalizo mis mensajes en mi aplicacion el codigo es el siguiente:

unit UnitShowMessage;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, LMDControl, LMDBaseControl, LMDBaseGraphicButton,
LMDCustomSpeedButton, LMDSpeedButton,Buttons, ExtCtrls,
LMDCustomButton, LMDButton, ImgList, JvGradient;

type
TFrmMessageBox = class(TForm)
LTitulo: TLabel;
LMensaje: TLabel;
BAceptar: TLMDButton;
BCancelar: TLMDButton;
PBMovible: TPaintBox;
BReintentar: TLMDButton;
PBIcono: TPaintBox;
ILIcono: TImageList;
JvGradient1: TJvGradient;
procedure FormShow(Sender: TObject);
procedure PBMovibleMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure PBMovibleMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure PBMovibleMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure PBIconoPaint(Sender: TObject);


private
{ Private declarations }
RatonPulsado: Boolean;
Punto: TPoint;

public
{ Public declarations }
end;
function Maximo (a,b:integer):integer;
FUNCTION MsgBox (Titulo, Mensaje: String; Flags: DWord):integer;
var
FrmMessageBox: TFrmMessageBox;
IndiceImagen:integer;
implementation

{$R *.dfm}


procedure TFrmMessageBox.FormShow(Sender: TObject);
begin
RatonPulsado := False;
end;

procedure TFrmMessageBox.PBMovibleMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
IF Button = mbLeft THEN
BEGIN
RatonPulsado := True;
Punto.x := x;
Punto.y := y;
END;
end;
function Maximo(a,b:integer):integer;
begin
if a>b then
Maximo:=a
else
Maximo:=b;

end;

FUNCTION MsgBox (Titulo, Mensaje: String; Flags: DWord): Integer;
CONST
PosLeft = 112;
PosWidth = 320;
LeftBotones = 25;
SepBotones = 7;
VAR
Botones, Icono: Word;
AlineacionDerecha: Boolean;
ResModal: TModalResult;
IdBotonPulsado: Integer;

BEGIN
{ Comenzamos separando de la variable Flags los botones, el icono
así como si el texto del mensaje está alineado o no a la derecha }

Botones := Flags AND $F;
Icono := Flags AND $F0;
AlineacionDerecha := (Flags AND $F0000) = $80000;
IndiceImagen := 0; { Un valor inicial no perjudicial }

WITH FrmMessageBox DO
BEGIN
Caption := Titulo;
LTitulo.AutoSize := False;
LMensaje.AutoSize := False;
LTitulo.Caption := Titulo;
LTitulo.Left := LeftBotones;
LTitulo.Width := 2 *(PosWidth DIV 3);
LTitulo.AutoSize := True;
LMensaje.Caption := Mensaje;
LMensaje.Left := PosLeft-15;
LMensaje.Width := PosWidth;
LMensaje.Alignment := taLeftJustify;
LMensaje.AutoSize := True;
LMensaje.Top := LTitulo.Top + LTitulo.Height + 15;
BAceptar.Top := LMensaje.Top + Maximo(LMensaje.Height, PBIcono.Height);
BCancelar.Top := BAceptar.Top;
BReintentar.Top := BAceptar.Top;
ClientHeight := BAceptar.Top + BAceptar.Height + 20;

{ Ahora pasamos a arreglar los botones en función del que nos han pedido }

CASE Botones OF
MB_OK: { Sólo debe estar visible el de 'Aceptar' y centrado }
BEGIN
BAceptar.Visible := True;
BCancelar.Visible := False;
BReintentar.Visible := False;

// BAceptar.Kind := bkOK;
BAceptar.Caption := 'Aceptar';

BAceptar.Left := Width DIV 2 - BAceptar.Width DIV 3;
BAceptar.Width:=90;
END;

MB_OKCANCEL: { Visibles 'Aceptar' y 'Cancelar', centrados }
BEGIN
BAceptar.Visible := True;
BCancelar.Visible := True;
BReintentar.Visible := False;

// BAceptar.Kind := bkOK;
BAceptar.Caption := ' Aceptar';
// BCancelar.Kind := bkCancel;
BCancelar.Caption := ' Cancelar';

BAceptar.Left := Width DIV 3 - BAceptar.Width DIV 3;
BCancelar.Left := BAceptar.Left + BAceptar.Width + SepBotones;
END;

MB_RETRYCANCEL: { Visibles 'Reintentar' y 'Cancelar', centrados }
BEGIN
BAceptar.Visible := False;
BCancelar.Visible := True;
BReintentar.Visible := True;

//BCancelar.Kind := bkCancel;
BCancelar.Caption := ' Cancelar';
// BReintentar.Kind := bkRetry;
BReintentar.Caption := ' Reintentar';

BReintentar.Left := Width DIV 3 - BReintentar.Width DIV 3;
BCancelar.Left := BReintentar.Left + BReintentar.Width + SepBotones;
END;

MB_YESNO: { De nuevo visibles 'Aceptar' y 'Cancelar', centrados }
BEGIN
BAceptar.Visible := True;
BCancelar.Visible := True;
BReintentar.Visible := False;

// BAceptar.Kind := bkYes;
BAceptar.Caption := 'Si';
// BCancelar.Kind := bkNo;
BCancelar.Caption := 'No';

BAceptar.Left := 112;
BAceptar.Width:=49;
BCancelar.Left := 232;
END;

MB_YESNOCANCEL: { Todos los botones deben ser visibles }
BEGIN
BAceptar.Visible := True;
BCancelar.Visible := True;
BReintentar.Visible := True;

// BAceptar.Kind := bkYes;
BAceptar.Caption := ' Sí';
// BCancelar.Kind := bkNo;
BCancelar.Caption := ' No';
// BReintentar.Kind := bkCancel;
BReintentar.Caption := ' Cancelar';

BAceptar.Left := LeftBotones;
BCancelar.Left := BAceptar.Left + BAceptar.Width + SepBotones;
BReintentar.Left := BCancelar.Left + BCancelar.Width + SepBotones;
END;

END;

{ Ahora vamos a averiguar qué icono nos han pedido para dibujarlo }

CASE Icono OF
MB_ICONINFORMATION: { MB_ICONASTERISK }
IndiceImagen := 1;

MB_ICONERROR: { MB_ICONHAND, MB_ICONSTOP}
IndiceImagen := 2;

MB_ICONEXCLAMATION: { MB_ICONWARNING }
IndiceImagen := 3;

MB_ICONQUESTION:
IndiceImagen := 4;
END;

IF AlineacionDerecha THEN LMensaje.Alignment := taRightJustify;
END;

//MessageBeep(Icono);
{ Esto es un extra ;-) Llama a una función del
API que emite un sonido estándar de Windows,
con lo que lo hacemos más parecido al MessageBox
de verdad :-) }

ResModal := FrmMessageBox.ShowModal;
IdBotonPulsado := 0;

{ Por último, convertimos los valores de ModalResult a las constantes
definidas por Windows como respuesta de MessageBox }

CASE ResModal OF
mrOk: IdBotonPulsado := IDOK;
mrCancel: IdBotonPulsado := IDCANCEL;
mrAbort: IdBotonPulsado := IDABORT;
mrRetry: IdBotonPulsado := IDRETRY;
mrIgnore: IdBotonPulsado := IDIGNORE;
mrYes: IdBotonPulsado := IDYES;
mrNo : IdBotonPulsado := IDNO;
END;

MsgBox := IdBotonPulsado;
END;
procedure TFrmMessageBox.PBMovibleMouseMove(Sender: TObject;
Shift: TShiftState; X, Y: Integer);
begin
IF RatonPulsado THEN
SetBounds(x - Punto.x + Left, y - Punto.y + Top, Width, Height);
end;

procedure TFrmMessageBox.PBMovibleMouseUp(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
IF Button = mbLeft THEN RatonPulsado := False;
end;

procedure TFrmMessageBox.PBIconoPaint(Sender: TObject);
begin
ILIcono.Draw(PBIcono.Canvas, 0, 0, IndiceImagen);

end;

end.

que como veran solo llamo a la funcion MsgBox de esta unidad para mostrar mi mensaje personalizado.
El formulario asociado a esta unidad lo creo cuando se ejecuta la aplicacion,
Ahora me puse un boton en el formulario menu_caja para llamar al popup y me da bien.
El evento se genera en otro modulo(menu_enfermeria) que esta en otro ambiente que una vez que guarden los datos del paciente, quisiera que me muestre los datos de este paciente en el menu_caja con el popup pero no me muestra,probe con un showmessage y da bien , probe con la unidad q tengo para mis mensajes personalizados y da, pero como en el menu_caja tengo un boton para salir del sistema el cual llama a la funcion msgbox me da el error que anteriormente te comente.
Particularmente nose como hacer para que me muestre en el popup,creo q seria mas visual para el usuario,agradesco comentarios amigo o amigos