GARANTIR DESCONTO

Fórum SetTimer nao aceita funcao membro de objeto #203702

31/12/2003

0

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

Responder

Posts

31/12/2003

Beppe

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...


Responder

Gostei + 0

31/12/2003

Emilio.cini

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 ?


Responder

Gostei + 0

31/12/2003

Emilio.cini

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.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar