PDA

Ver la Versión Completa : Puntero procedimiento a evento


jlrbotella
22-05-2007, 19:59:23
Hola Amigos:

¿cómo puedo convertir el procedimiento

procedure AppMessage(var Msg: tagMSG; var Handled: Boolean);

a Evento Application.OnMessage?.

Cuando lo asigno de esta manera, el compilador me genera el siguiente error:

Application.OnMessage := AppMesage;

[Pascal Error] consumos_main.pas(178): E2009 Incompatible types: 'method pointer and regular procedure'

Muchas Gracias,
JL

jhonny
22-05-2007, 20:05:08
El Msg no debería ser de tipo TMsg en lugar de tagMSG?

seoane
22-05-2007, 20:23:22
El error te lo dice todo:

Incompatible types: 'method pointer and regular procedure'

Tu le estas asignando un procedure normal y lo que tienes que asignarle es un metodo de un objeto. Asi que declara ese procedure dentro de un objeto y entonces te dejara.

Por ejemplo:

type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
procedure AppMessage(var Msg: TMsg; var Handled: Boolean);
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.AppMessage(var Msg: TMsg; var Handled: Boolean);
begin
//
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnMessage:= AppMessage;
end;

jlrbotella
23-05-2007, 09:22:18
Hola:

Pero si el procedure esta en otro unit y no pertenece a ninguna clase como lo convierto.

Saludos,
JL

seoane
23-05-2007, 11:45:00
No entiendo tu empeño, es como si quisieras pasarle un texto a una imagen, si ya lo dice el mensaje, son incompatibles :D

¿Que te cuesta meter el procedure dentro de una clase? Por ejemplo:

unit Unit2;

interface

uses Windows, Sysutils, Classes, Forms;

type
TDummy = class
public
procedure AppMessage(var Msg: TMsg; var Handled: Boolean);
end;

implementation

{ TDummy }

procedure TDummy.AppMessage(var Msg: TMsg; var Handled: Boolean);
begin
// Aqui lo que quieras
end;

var
Dummy: TDummy;

initialization
Dummy:= TDummy.Create;
Application.OnMessage:= Dummy.AppMessage;
finalization
Application.OnMessage:= nil;
Dummy.Free;
end.

Lepe
23-05-2007, 14:45:13
a ver, yo creo que el pollo es más pequeño, no hay que engordarlo.

Usa un componente ApplicationsEvents en la ventana que quieras, en el inspector de objetos da doble clic al evento OnMessage y dentro de él llamas a tu rutina.


procedure TFormXXX.AplicationsEvents1Message(var Msg: TMsg; var Handled: Boolean);
begin
AppMessage( Msg, Handled);
end;

Saludos