Acessando eventos, métodos e propriedades não publicadas

 

Suponhamos que desejássemos adicionar um handle de evento OnClick a um TrackBar. O Trackbar não tem um handle de evento OnClick, portanto teremos que fazer algo para ter-lo. Poderíamos criar um componente derivado do TTrackBar, publicar o evento OnClick, salvá-lo, instalá-lo no Delphi e usá-lo a seguir. Porém é um processo bastante incômodo, não acha?

A hierarquia de classes da qual TTrackBar descende é a seguinte:

 

TObject

TPersistent

TComponent

TControl

TWinControl

TTrackbar

 

Como podemos ver, o TTrackBar descende de TWinControl, a qual por sua vez, descende de um TControl que SIM, tem um handle de evento OnClick.

O que isto significa? Que em algum lugar, o criador do TrackBar decidiu não incorporar este evento ao componente.  Certamente imaginou (e com razão) que o evento OnChange seria o bastante.

Como poderíamos então usar este evento

Bem, poderíamos fazer um “hack” da classe e acessar assim a todas as propriedades, eventos e métodos do TrackBar. Por exemplo, criemos um handle de evento para o OnClick de TrackBar1:

 

Esta é a declaração na seção private na declaração do form:

 

private

  procedure Trackbar1Click(Sender: TObject);

  [...]

 

e sua implementação:

 

implementation

 

{$R *.dfm}

 

procedure TForm1.Trackbar1Click(Sender: TObject);

begin

  ShowMessage('TrackBar1 OnClick fired!');

end;

 

Agora, teríamos que designar em runtime, por exemplo, no OnCreate do formulário, algo como:

 

Trackbar1.OnClick := Trackbar1Click;

 

Mas, vemos que não temos disponível o handle de evento do OnClick, pois o mesmo não foi definido na seção public da definição do TrackBar. Para contornar esta limitação, usaremos um “hack” da classe. Declararemos na seção type do formulário:

 

type

  THackClass = class(TTrackBar);

 

  TForm1 = class(TForm)

  [...]

 

E então, poderemos designar o OnClick de nosso TrackBar1 com algo assim (no lugar do código anterior, no evento OnCreate do formulário):

 

THackClass(Trackbar1).OnClick := Trackbar1Click;