Delphi: TScrollBox não tem eventos para tratamento de Scroll, e agora?

Publicado por Marcos Dell Antonio em 26/02/2007 | Delphi

Dias atrás precisei de um componente no estilo do TPanel mas que tivesse as barras de rolagem na vertical e horizontal. A princípio achei que o próprio TPanel teria isso, porém não encontrei nada.

Foi então que ao acaso descobri o componente TScrollBox. Ele é exatamente isto: um TPanel + TScrollBar (horizontal e vertical).

Com o componente em mãos, fiz alguns testes e já parti pra produção. No meio do caminho, após enviar uma demo ao supervisor do que estava sendo feito, recebi uma solicitação para que o cabeçalho (alguns botões) deste componente ficasse fixo.

Encontrei duas soluções para o problema:

1. Remover os botões do cabeçalho e colocá-los logo acima do TScrollBox. Desta forma, quando ele rolasse para baixo ou para cima, o cabeçalho permaneceria no mesmo lugar.

2. Manter os botões no topo do TScrollBox e tratar dinamicamente o Top deles (conforme o scroll) para que ficassem sempre no topo.

A primeira solução foi descartada, pois naquela situação teria que alterar várias outras coisas. Logo, parti para a segunda.

Quando fui procurar o evento que tratava a rolagem das barras (OnScroll ou algo do tipo), simplesmente descobri que não existia. Foi então que parti pro Google

Através do quarto site encontrado na pesquisa realizada acima, cheguei novamente à fonte de milagres para qualquer programador Delphi: Torry’s Delphi.

Com base no exemplo dele, elaborei a seguinte rotina usando a mensagem WM_VSCROOL:

1 procedure TfrmMeuForm.WMVScroll(var Msg: TMessage); 2 begin 3 FOldWindowProc(Msg); 4 5 if (Msg.Msg = WM_VSCROLL) then 6 button.Top := scrollBox.VertScrollBar.Position; 7 end;

Neste exemplo tratei o Top apenas de um botão para facilitar o entendimento.

Com esse método declarado e implementado, bastou fazer o seguinte:

- Declarar uma variável private do tipo TWndMethod:

1 private 2 FOldWindowProc: TWndMethod;

- Definir a propriedade WindowProc da TScrollBox para o método de tratamento e armazenar uma cópia de onde está o método atual:

1 FOldWindowProc := scrollBox.WindowProc; 2 scrollBox.WindowProc := WMVScroll;

Pronto. Desta forma, quando o método WMVScroll for executado, ele tratará todas as mensagens que tratava antes e também a WMV_SCROLL, só que agora de uma forma específica.

É isso ae. Espero que ajude.

Até + 

2 comentários

  1. 1
    Everson // June 27th, 2008 at 11:43 am

    Nota 10!!!

    Estava procurando este conteúdo.

  2. 2
    Yves // June 17th, 2011 at 9:11 am

    Muito bom!
    Com isso resolveu o problema de sincronizar scrollbars de dois (ou mais) componentes.

Deixe o seu comentário

Anúncios

Anúncio provido pelo BuscaPé