Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > API de Windows
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 07-10-2007
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
Compartir Variable entre dos aplicaciones

Hola de nuevo !

Al margen de este hilo me gustaría pedir vuestro consejo acerca de la mejor y más eficiente manera de hacer lo siguiente :

Tengo una aplicación corriendo en 'BackGround' que analiza una tabla de datos (Horarios / llamadas de despertador en mi aplicación de hotel). Esta aplicación se encuentra visible o no (segun los datos correspondientes) con un TrayIcon.

Por otro lado tengo una aplicación principal (de gestión hotelera) que cuando se carga solicita el código de usuario.

En la aplicación de llamadas de despertador se debe confirmar si el cliente ha contestado a la llamada, si no ha contestado, o si comunica. Para ello grabo registros en otra tabla que (... y aquí está la clave del asunto) necesitan además un campo de identificador de usuario.

La aplicación de despertador se activará automáticamente cuando existen llamadas de despertador a realizar. Pero puede en ese momento estar o no activo el programa principal de hotel. Por lo tanto puede haber un usuario identificado o no.

Lo que quiero es poder saber en el programa de llamadas de despertador si el programa principal está activo y existe un usuario identificado. Si es así, quiero obtener el código de dicho usuario y si no hay ninguno, entonces tendría que pedir el código de usuario en el programa de llamadas de despertador.

Había pensado varias opciones. La mejor de todas el utilizar CreateFileMapping para compartir la variable de usuario definida en el programa principal de hotel. Con ello cada vez que se activara el programa de llamadas de depsertador y se realizara una operación de confirmación se buscaría si existe la zona de memoria compartida y de ahí leería la variable de código de usuario.

Otra opción que había pensado es utilizar WM_COPYDATA. Me encuentro algunos problemas. WM_COPYDATA tendría que ser 'activado' por el programa principal para enviar el código de usuario a la aplicación de despertador. Pero podría o no estar activa dicha aplicación de despertador.

Por el contrario, si no estuviera activa, y la aplicación de despertador de ejecutara después de haberse ejecutado la aplicación principal de hotel, no sabría como averiguar el código de usuario previamente introducido en el programa principal.

Había pensado incluso utilizar el Registro de Windows, pero si cualquier aplicación (por ejemplo la principal de hotel) se cae, la anotación en el registro quedaría y no sería coherente con saber que realmente hay un usuario activo y con el programa principal de hotel abierto.

Por tanto, después de todo este rollo de explicación, solicito de vuestros consejos y ayudas para solventar este problema.

Un saludo !!
__________________
Piensa siempre en positivo !
Responder Con Cita
  #2  
Antiguo 07-10-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Si he entendido bien tu explicación, en un momento determinado la aplicación despertador necesita saber que usuario, si hay alguno, esta autentificado en la aplicación principal. No se de que tipo es el "identificador de usuario" pero si es de tipo integer se me ocurre una solución bastante sencilla.

La función SendMessage, como cualquier función, devuelve un valor. Este valor es de tipo integer, así que si el identificador del usuario es de tipo integer solo tendríamos que enviar como resultado del mensaje el valor del identificador.

Algo así (en la aplicación principal):
Código Delphi [-]
const
  WM_GETUSERID = WM_USER + 101;

type
  TForm1 = class(TForm)
  private
    { Private declarations }
    procedure GetUserId(var Msg: TMessage); message WM_GETUSERID;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.GetUserId(var Msg: TMessage);
begin
  // UserId es el identificador del usuario
  Msg.Result:= UserId; 
end;

Y en el despertador:
Código Delphi [-]
  // Handle es el manejador de la ventana principal
  UserID:= SendMessage(Handle,WM_GETUSERID,0,0);
Responder Con Cita
  #3  
Antiguo 07-10-2007
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
Domingo !! Gracias !!

No era consciente de que un mensaje devolvía un valor. En efectivo el número de usuario es un integer. Lo he implementado ya y funciona perfectamente.

De nuevo, mil gracias !
__________________
Piensa siempre en positivo !
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Compartir variables entre forms tenporal Varios 4 19-07-2007 21:31:56
Compartir conexion entre dos PC chico_bds Internet 3 02-07-2007 06:21:27
Compartir BD access entre varias maquinas de una LAN hks Conexión con bases de datos 5 30-03-2007 18:11:36
Compatibilidad entre aplicaciones ASP.NET entre Delphi 8 .Net y Visual Studio.Net kenyamg .NET 0 21-02-2007 07:30:33
Compartir AciveX entre formulario Coco_jac Varios 2 03-10-2005 22:28:04


La franja horaria es GMT +2. Ahora son las 14:55:58.


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
Copyright 1996-2007 Club Delphi