Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Puntero procedimiento a evento (https://www.clubdelphi.com/foros/showthread.php?t=43856)

jlrbotella 22-05-2007 19:59:23

Puntero procedimiento a evento
 
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:
Cita:

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:
Código Delphi [-]
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:
Código Delphi [-]
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.

Código Delphi [-]
procedure TFormXXX.AplicationsEvents1Message(var Msg: TMsg; var Handled: Boolean);
begin 
   AppMessage( Msg, Handled);
end;

Saludos


La franja horaria es GMT +2. Ahora son las 04:50:30.

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