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”

  1. Wilson Ventura on May 30th, 2008 9:48 am

    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

  2. Wilson Ventura on May 30th, 2008 9:52 am

    As teclas de atalho que me referi acima são: [CTRL]+[sinal de mais] e [CTRL]+[sinal de menos].

    Abraço.
    Wilson Ventura

  3. Cesar Romero on May 30th, 2008 12:07 pm

    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.

  4. Wagner Freitas on June 2nd, 2008 1:31 am

    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 ?

  5. Malta on June 2nd, 2008 8:17 am

    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.

  6. Wagner Freitas on June 5th, 2008 12:32 pm

    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 ?

  7. Anderson on July 30th, 2008 12:51 pm

    Alguem sabe como posso fazer esse exemplo em Delphi7? Obrigado

Deixe uma Resposta




XHTML: Você pode usar essas tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="">