Scroll Grid Font Size
Eu uso a toda hora Ctrl+Scroll do mouse para alterar o tamanho da fonte de uma página no browser. Daí eu fiquei com vontade de implementar isso no Delphi. Por que não um TDBGrid com a mesma funcionalidade?

No exemplo da imagem anterior, se você deixar o mouse sobre o grid e girar o botão de rolagem para baixo enquanto mantém a tecla Control pressionada a fonte será aumentada até ficar como a imagem abaixo.

Semelhante ao que fizemos anteriormente para implementar a rolagem pelo mouse em um TScrollBox, tudo que é preciso é sobrescrever os eventos OnMouseWheelDown e OnMouseWheelUp com o tratamento adequado para aumentar ou diminuir o tamanho da fonte do grid, respectivamente.
O código principal é este:
procedure TMainForm.DBGrid1MouseWheelDown(Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean); begin if ControlKeyPressed then begin ChangeGridFontSize(DBGrid1, +1); Handled := True; end; end; procedure TMainForm.DBGrid1MouseWheelUp(Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean); begin if ControlKeyPressed then begin ChangeGridFontSize(DBGrid1, -1); Handled := True; end; end;
Se a tecla Control não estiver pressionada, o valor de Handled continua False e o funcionamento normal da classe prossegue, rolando as linhas do grid. Se o resultado da função ControlKeyPressed (veja abaixo) é True, o botão Control está pressionado e devemos modificar o tamanho da fonte.
function ControlKeyPressed: Boolean; begin Result := Boolean(GetKeyState(VK_LCONTROL) shr 31) or Boolean(GetKeyState(VK_RCONTROL) shr 31); end;
GetKeyState é uma função da API do Windows e a forma (bizarra) de interpretar seu resultado é verificar se o bit mais significante do resultado é 1. Na função eu verifico se o botão esquerdo ou o direito está pressionado naquele momento.
A mudança de tamanho da fonte em si é realizada pela rotina ChangeGridFontSize:
type TDBGridHack = class(TDBGrid); procedure ChangeGridFontSize(Grid: TDBGrid; Delta: Integer); var Size: Integer; begin Size := Grid.Font.Size + Delta; if (6 <= Size) and (Size <= 32) then begin Grid.Font.Size := Size; TDBGridHack(Grid).LayoutChanged; end; end;
Primeiro note que a procedure recebe um parâmetro Delta que pode ser positivo ou negativo. Se positivo, aumenta a fonte. Se negativo, diminui. A rotina limita o novo tamanho de fonte à faixa 6..32 por segurança.
E o que é esse TDBGridHack? Err… bem… digamos que é um “código de flexibilização”. :-)
LayoutChanged é um método protegido de TDBGrid. Para poder usá-lo, precisamos declarar no escopo da unit uma classe descendente de TDBGrid. Dessa forma a nova classe será nossa “amiga” e poderemos usar seus métodos protegidos (mas não conte isso pra ninguém!). LayoutChanged é chamado para corrigir o número de linhas exibidas no grid quando a fonte é diminuida.
Você pode fazer o download desse projeto de exemplo e experimentar a mesma técnica com outros tipos de componente.
Comments
7 Responses to “Scroll Grid Font Size”
Deixe uma Resposta

Adorei conhecer esta função no browser usando o mouse, pois eu usava as teclas de atalho + e + para estas funções.
Abraço
Wilson Ventura
As teclas de atalho que me referi acima são: [CTRL]+[sinal de mais] e [CTRL]+[sinal de menos].
Abraço.
Wilson Ventura
Gosto de me preocupar com a usabilidade, no caso do ZOOM, pra quem tem deficiencia visual é de extrema utilidade.
Há um ano criei um sistema de plugins q adicionava o recurso de Zoom, muito semelhante ao que vc fez, direto nos forms, ai ele fazia o zoom de todos os componentes.
Abraço.
Neste caso não seria melhor o estender a classe do dbgrid usando classe helper.
Não gosto de TMyGrid = class(DbGrid).
O que acha Malta ?
Wagner, você tem razão de não gostar do “hack”! Acontece que nesse caso um class helper não funcionaria, porque não nos permitiria redeclarar um método para aumentar a sua visibilidade. Nesse caso seria melhor fazer uma nova classe descendente de TDBGrid.
Você sabia que o próprio código da VCL utiliza alguns poucos “hacks” como esse? DesignEditors.pas e ADOReg.pas, por exemplo.
Verdade que não funciona com helpers.´
É que não parei para pensar a fundo no problema
Justifico, acho hack , código sujo !
Por isso que não gosto. Mas não tem jeito
Creio que VCL deveria ser atualizada com os recursos novos, porque que temos que colocar na mão muita coisa.
Eu uso a DevExpress por exemplo, e são componentes que tem recursos novos qdo foi criado e creio que deveria atualizada tambem, porque a VCL de uma certa forma esta desatualizada no que diz respeito a aspecto de recursos do mundo atual.
Graças a Deus que temos herança e o fonte da maioria da coisas.
Quem não se lembra antigamente que por exemplo vc vê um recurso em uma aplicação e vc vai colocar em sua aplicação
Tem que reescrever tudo pegando código(copy/paste) de outro lugar e enxertando no seu sistema.
o que acha ?
Alguem sabe como posso fazer esse exemplo em Delphi7? Obrigado