SetTimer nao aceita funcao membro de objeto

Delphi

31/12/2003

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 ?


Emilio.cini

Emilio.cini

Curtidas 0

Respostas

Beppe

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:

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

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

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
POSTAR