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;

     

    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