PDA

Ver la Versión Completa : Capturar Raise Notice y enviarlo al formulario activo


martinartaza
24-12-2010, 15:09:57
Hola que tal, estoy usando los componentes PostgresDac 2.5.5 y quiero capturar los (eventos o mensajes) del postgres el 'Raise Notice' y enviarlo al formulario activo de la aplicación, una vez echo eso, que en cada formulario activo se programe lo que se quiera.

Resumen de lo que tengo:
1 - Modulo de datos con un PSQLDatabase, llamado DB.
2 - Un formulario llamado form1, que tiene un query1, tedit1, tbutton1.
3 - Un formulario llamado form2, que tiene otras cosas.

En la base de datos tengo la siguiente funcion

CREATE OR REPLACE FUNCTION probando(idprueba integer)
RETURNS integer AS
$BODY$
DECLARE
BEGIN
raise notice 'Prueba nº %', idprueba;
RETURN idprueba;
END;
$BODY$
LANGUAGE plpgsql VOLATILE;
ALTER FUNCTION probando(integer) OWNER TO postgres;


En el formulario 1 tengo.
El query1 tiene la siguiente instrucción.

select probando(:idprueba)

El codigo del button1 es:

PSProbando.Close;
PSProbando.ParamByName('idprueba').AsString:= EProbando.Text;
PSProbando.Open;

--------------------------------

Ahora lo que quiero es programar el evento, onnotice del componente DB del modulo de datos para que, envié un mensaje al formulario activo y este lo capte y se produzca un evento que se pueda programar en el formulario.

Bueno espero que halla sido claro, estuve tratando de usar el componente application events, pero no se como enviarle un mensaje o string al formulario activo y que este al recibir el mensaje produzca el evento, además no quiero programar al formulario en modo de escucha, quiero que sea por evento.

Desde ya muchas gracias.

rgstuamigo
24-12-2010, 16:39:20
Si te estoy entendiendo :rolleyes: bien, pues creo que lo que necesita es crearte tu propio mensaje de ventana y enviarlo con la Api SendMessage (http://msdn.microsoft.com/en-us/library/ms644950%28v=vs.85%29.aspx) a la ventana activa;;)
Para Obtener la ventana activa puedes usar la API GetActiveWindow (http://msdn.microsoft.com/en-us/library/ms646292%28v=vs.85%29.aspx) que te devuelve el handle de la ventana activa.;)
Pero para que cualquier Formulario pueda capturar tu "mensaje de ventana personalizado" debes crearte en cada uno, el procedure correspondiente de capturamiento.;)
Resumiendo y ejemplificando todo lo anterior tenemos :

Primero debemos declararnos un mensaje de ventana propio, eso lo podemos hacer en cualquier unidad, solo hay que tener en cuenta que dicha unidad va ser usada por todos los formularios de la aplicacion.
Const
WM_MyMENSAJE=WM_USER+30; // mi mensaje tiene como Identificador WM_MyMENSAJE
// se puede poner cualquier nombre de identificador
Segundo en el evento Onnotice del componente DB del modulo de datos, debes enviar el mensaje de ventana que hemos creado, a la ventana activa de la aplicacion más o menos así:

...
var h:THandle;
begin
h:=GetActiveWindow;// obtengo el handle de la aventana Activa
SendMessage(h,WM_MyMENSAJE,0,0);// mando mi mensaje a la ventana Activa
...
end;
Finalmente para que en cualquier ventana nos demos cuenta que ha llegado el mensaje WM_MyMENSAJE pues debemos crearnos el procedimiento(Procedure) que capture el momento de recibir nuestro mensaje de ventana( en nuestro caso es WM_MyMENSAJE), entonces nos nos queda de otra que crearnos dicho procedimiento en todos y cada uno los formularios de la siguiente manera:
....
private
{ Private declarations }
Procedure Capturar_Mensaje(Var msg:TMessage); message WM_MyMENSAJE;// voy a capturar el mensaje WM_MyMENSAJE ;)
public
{ Public declarations }
end;
Y la implementacion asi:
procedure TForm1.Capturar_Mensaje(var msg: TMessage);
begin
ShowMessage('Ha llegado un mensaje');
{Código para hacer algo cuando recibamos el mensaje}
...
...
end;

Quizás algunos dirán: "Pero es muy laborioso crear éste procedimiento cuando son muchos formulario", pues en ese caso se podría crear un formulario Padre que implemente dicho procedure y todos los otros heredar de él. Eso debería funcionar ya que los formulario hijos ya heredan la implementacion del capturamiento de nuestro mensaje.;)
Espero haberte podido ayudar.;)
Saludos...:)

martinartaza
27-12-2010, 13:24:05
Hola, recién leo el mensaje, creo que me entendiste a la perfección, es más estoy por implementar herencia visual, y la idea es usar un formulario padre como dices, en general el mensaje del raise notice, es para escribir es un archivo que sirva de auditoria, en caso de que alguna ventana no funcione, sirve mucho en la etapa de desarrollo de nuevas funcionalidades que pide el cliente. Y como va haber distintos tipos de formularios padres por ahí se va a necesitar polimorfismo por eso necesito que el mensaje llegue al formulario activo en caso que se quiera hacer otra cosa con el raise notice.

Desde ya muchas gracias voy a ver si hoy en el horario de trabajo me queda tiempo libre para implementar lo que me dijiste.