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;