Manipulando uma TStringGrid - Delphi XE2 & Firemonkey

Neste artigo veremos como trabalhar com uma Grid vinculada a um banco de dados e alteraremos suas propriedades visando oferecer uma grade de informações de forma organizada e legível.

<wordtidy></wordtidy><wordtidy></wordtidy><wordtidy>

<wordtidy> </wordtidy>

<wordtidy>
    Neste artigo veremos como trabalhar com uma Grid vinculada a um banco de dados e alteraremos suas propriedades visando oferecer uma grade de informações de forma organizada e legível.

    Em nosso exemplo temos um Data Módulo DM e nele consta um componente da classe TClientDataSet denominado CDSAGENDA:




Esse componente está associado a um arquivo XML e possui os seguintes Fields:



     Em nosso formulário principal adicionaremos dois componentes importantes para a ligação do LiveBindings:

                 ·TDataSource:

   ØName: DSAGENDA;

   ØDataset: DM.CDSAGENDA; (Declare em Uses: uDM).

                 ·TBindScopeDB:

   ØName: BSDBAGENDA;

   ØData Source: DSAGENDA;

</wordtidy>

     

    Agora, vamos montar nosso Grid em base de nosso banco de dados.  Adicione um componente da classe TStringGrid e altere as seguintes propriedades:

   ØName: SGAGENDA;

   ØAlign: alBottom;

   ØHeight: 180;

   ØLiveBindings > Link to DBDataSource: BSDBAGENDA;

   ØDisableFocusEffect: False;

   ØMouseTracking: True;

   ØShowSelectedCell: False;

     Para escolher quais Fields irão aparecer no SGAGENDA, vá até a propriedade Livebindings do SGAGENDA e clique em cima do DBLINKAGENDA1 criado:

      Dê um duplo clique na propriedade Columns e no editor clique com o botão direito e Add All Fields:


      Todos os Fields serão adicionados:


     Selecione o Field IDAGENDA e o apague.

    Obs.: Apenas colocar a propriedade Visible: False criará uma confusão no Grid, pois este Field não deixará de ser visível.

     Sua StringGrid ficará com a seguinte aparência:

     Diferente da VCL, a TStringGrid do Firemonkey ainda necessita de vários códigos para que possa ser organizada e para que fique de forma apresentável.

      Sendo assim, para que possamos fazer o alinhamento de cada Header (Título) teremos de programar a seguinte procedure. Declare no campo private do formulário:


procedure Alinhamento_dos_Cabecalhos;

       Clique na linha declarada acima e aperte em seu teclado Ctrl + Shift + C:

procedure TFmkPrincipal.Alinhamento_dos_Cabecalhos; var i: Integer; header: THeader; headeritem: THeaderItem; begin header := THeader(SGAGENDA.FindStyleResource('header')); for i := 0 to header.ChildrenCount - 1 do begin headeritem := THeaderItem(header.Children[i]); headeritem.TextAlign := TTextAlign(0); headeritem.Font.Style := [TFontStyle.fsBold]; end; end;

      Assim, em tempo de execução a SGAGENDA estará com os títulos centralizados e em negrito.

     Para que possamos realizar a configuração das células da SGAGENDA iremos criar a seguinte procedure no campo private do FmkPrincipal:

procedure GridCellApplyStyleLookup( Sender: TObject );

      Clique na linha declarada acima e aperte em seu teclado Ctrl + Shift + C:

procedure TFmkPrincipal.GridCellApplyStyleLookup( Sender: TObject ); var TC: TTextCell; begin if ( Sender <> nil ) and ( Sender is TTextCell ) then begin TC := TTextCell( Sender ); TC.FontFill.Color := claBlack; TC.Font.Family := 'Times New Roman'; //TC.Font.Style := [ TFontStyle.fsBold]; TC.Font.Size := 12; TC.TextAlign := TTextAlign(0); end; end;

     Desta forma nós determinamos as características das células, indicando a fonte e o alinhamento.

     Agora, vamos implantar a procedure que chamará à execução as características das células. No campo Public do FmkPrincipal:

procedure Mudando_as_Células;

     Clique na linha declarada acima e aperte em seu teclado Ctrl + Shift + C:

Obs.: Podemos notar um pequeno detalhe que é novidade no Delphi. A possibilidade de se colocar acentos e cedilhas nos nomes de procedures e functions. Ex: procedure Mudando_as_Células;

procedure TFmkPrincipal.Mudando_as_Células; var Col, Row: Integer; CellCtrl: TStyledControl; begin for Col := 0 to SGAGENDA.ColumnCount - 1 do begin for Row := 0 to SGAGENDA.RowCount - 1 do begin CellCtrl := SGAGENDA.Columns[ Col ].CellControlByRow( Row ); if ( CellCtrl <> nil ) and ( CellCtrl is TTextCell ) then begin TTextCell( CellCtrl ).OnApplyStyleLookup := GridCellApplyStyleLookup; end; end; end; end;

     Esta procedure tem por objetivo passar nossas determinações para cada célula do SGAGENDA.

    Agora, para que em tempo de execução a StringGrid adquira as características, vamos chamar no evento OnCreate do FmkPrincipal o seguinte comando:

procedure TFmkPrincipal.FormCreate(Sender: TObject); begin SGAGENDA.ReadOnly := True; Mudando_as_Células; Alinhamento_dos_Cabecalhos; end;

     Como meu objetivo na StringGrid SGAGENDA é somente de fornecer leitura dos dados, eu passei o comando de que SGAGENDA.ReadOnly := True (Verificar Evento OnCreate do formulário).

     Obs1: Ao acessar o Object Inspector da SGAGENDA perceberemos que existe a propriedade ReadOnly e que ela está marcada como True, entretanto, ao compilar os dados o Delphi XE2 pode não reconhecer esse código e a StringGrid continuará em modo de edição.

     Obs2: Após o evento AfterInsert do CDSAGENDA (TClientDataSet) é preciso adicionar  a linha de comando chamando a procedure Mudando_as_Células. Isso deve ser feito para que toda a organização realizada na Grid seja mantida. Caso Contrário, a Grid ficaria assim ao inserir um novo registro:

  Bom trabalho e até o próximo artigo!
Rafael Marins Ribeiro
Engenheiro de Softwares



</wordtidy><wordtidy> </wordtidy>

Artigos relacionados