SetTimer nao aceita funcao membro de objeto
Tenho um objeto derivado de um TWinControl com uma prcedure que gostaria que foce ativada com a funcao settimer, mais esta dando o seguinte erro: [Error] Principal.pas(803): Variable required
se eui tirar a funcao do objeto o codigo funciona, mais isso nao pe possivel, vou colocar abaixo um exemplo do meu codigo:
type MyClass = class(TWinControl)
constructor Create(AOwner: TComponent); override;
Procedure PintarIni( Handle: HWND; uMsg, idEvent, dwTime: DWORD ); stdcall;
end;
Procedure TCliente.PintarIni( Handle: HWND; uMsg, idEvent, dwTime: DWORD ); stdcall;
begin
end;
constructor TCliente.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
settimer( Handle, 0, 100, @PintarIni);
end;
Alguem pode me ajudar ?
se eui tirar a funcao do objeto o codigo funciona, mais isso nao pe possivel, vou colocar abaixo um exemplo do meu codigo:
type MyClass = class(TWinControl)
constructor Create(AOwner: TComponent); override;
Procedure PintarIni( Handle: HWND; uMsg, idEvent, dwTime: DWORD ); stdcall;
end;
Procedure TCliente.PintarIni( Handle: HWND; uMsg, idEvent, dwTime: DWORD ); stdcall;
begin
end;
constructor TCliente.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
settimer( Handle, 0, 100, @PintarIni);
end;
Alguem pode me ajudar ?
Emilio.cini
Curtidas 0
Respostas
Beppe
31/12/2003
Se você precisar transformar um método(com informação do objeto) em uma rotina simples, um [i:7658e6b148]thunk[/i:7658e6b148] pode ser criado:
Mas um TTimer ainda seria mais fácil...
type
TMyClass = class(TWinControl)
private
FTimerProc: Pointer;
procedure TimerProc(Handle: HWND; uMsg, idEvent, dwTime: DWORD); stdcall;
protected
procedure CreateWnd; override;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
end;
function CreateMethodThunk(const AMethod: TMethod): Pointer;
type
TCallbackThunk = packed record
POPEDX: Byte;
MOVEAX: Byte;
SelfPtr: Pointer;
PUSHEAX: Byte;
PUSHEDX: Byte;
JMP: Byte;
JmpOffset: Integer;
end;
var
Callback: ^TCallbackThunk;
begin
New(Callback);
Callback.POPEDX := $5A;
Callback.MOVEAX := $B8;
Callback.SelfPtr := AMethod.Data;
Callback.PUSHEAX := $50;
Callback.PUSHEDX := $52;
Callback.JMP := $E9;
Callback.JmpOffset := Integer(AMethod.Code) - Integer(@Callback.JMP) - 5;
Result := Callback;
end;
{ TMyClass }
constructor TMyClass.Create(AOwner: TComponent);
var
M: TMethod;
begin
inherited;
M.Code := @TMyClass.TimerProc;
M.Data := Self;
FTimerProc := CreateMethodThunk(M);
end;
procedure TMyClass.CreateWnd;
begin
inherited;
SetTimer(Handle, 0, 5000, FTimerProc);
end;
destructor TMyClass.Destroy;
begin
Dispose(FTimerProc);
inherited;
end;
procedure TMyClass.TimerProc(Handle: HWND; uMsg, idEvent, dwTime: DWORD);
begin
GetParentForm(Self).Caption := GetParentForm(Self).Caption + ´ - ´ + IntToStr(Random(123123));
end;Mas um TTimer ainda seria mais fácil...
GOSTEI 0
Emilio.cini
31/12/2003
Muito obrigado pela ajuda, usando este metodo que vc me indicou tbm é possivel criar um gosth code nao é ? Aonde eu acho mais exemplos de do uso de TMethod ?
GOSTEI 0
Emilio.cini
31/12/2003
Voce pode me dar uma explicacao rapida sobre os valores e como funciona a funcao CreateMethodThunk ? ou por favor me envie um comentario por email, icq ou msn.
GOSTEI 0