DropDownList em um DBGrid - Parte I

Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Para efetuar o download você precisa estar logado. Clique aqui para efetuar o login
Confirmar voto
0
 (4)  (0)

Veja a primeira parte do artigo que mostra como adicionar um DropDownList em um componente DBGrid. Acesso exclusivo para Assinantes.

DropDownList em um DBGrid - Parte I

Três modos de montar um drop down list em um DBGrid.

 A seguir, mostraremos como colocar um drop down list em um DBGrid. Crie interfaces de usuário visualmente mais atraentes para editar campos lookup em um DBGrid - usando a propriedade PickList de uma coluna de DBGrid.

 

Este é o segundo artigo da série de artigos chamada "Adding components to a DBGrid" ("Acrescentando componentes a um DBGrid"). A idéia aqui, é mostrar como colocar quase qualquer controle Delphi (componente visual), em uma célula de um DGBrid. Se você não estiver familiarizado com a idéia, por favor, leia antes o artigo acima mencionado.

Colocar um drop down list em um DBGrid?

Como vimos no artigo anterior, há muitos modos (e razões) para personalizarmos a saída de um DBGrid: suponha você tem um campo lookup em um dataset. Um modo de explicar um campo lookup de banco de dados é dizer que campos lookup são campos que podem aceitar *somente* valores de uma lista fixa de valores ("static" ou de um dataset). Vejamos um exemplo: se você tem uma tabela Products com um campo que contém o nome do provedor, quando for editar este campo, seria bom permitir ao usuário a escolha do nome do provedor de uma lista de provedores (contida na tabela Providers)

Criando uma aplicação exemplo

Para começar, inicie o Delphi e, no formulário padrão vazio, coloque um TDBGrid, um TADOTable, um TADOConnection e um TDataSource. Deixe todos os nomes de componente como o Delphi os chamou quando colocados no formulário (DBGrid1, ADOQuery1, AdoTable1,...). Use o Object Inspector para configurar a propriedade ConnectionString do componente ADOConnection1 (TADOConnection), para apontar para o banco de dados de exemplo QuickiesContest.mdb do MS Access. Conecte o DBGrid1 ao DataSource1, o DataSource1 ao ADOTable1 e finalmente o ADOTable1 ao ADOConnection1. A propriedade TableName de ADOTable1, deverá apontar para a tabela Articles (fazendo com que o DBGrid exiba os registros da tabela Articles).

Nota: Nada o impede de usar os qualquer outro componente dataset do Delphi, tais como TTable, TQuery,...

 

Se você configurou todas as propriedades corretamente, quando rodar a aplicação (desde que a propriedade Active do componente ADOTable1 seja True), você deverá obter a seguinte saída:

 

Figura 1.

Note que o campo Subject pode aceitar só valores da tabela Subjects (definida via integridade referencial). O que você precisa “observar" na figura anterior é que, ao editar esta campo sem uma lista, se tentássemos substituir um valor com outro valor não encontrado na tabela Subjects (tabela “master”), receberíamos a mensagem de erro "You cannot add or change a record because a related record is required in table Subjects" (Você não pode adicionar ou alterar um registro, porque um registro relacionado é requerido na tabela Subjects”).

O que iremos ver neste artigo, é como fazer com que a figura anterior tenha o seguinte aspecto:

 

Figura 2.

Existem três modos de configurar um campo lookup em Delphi

Se você tem um formulário de dados onde todas as edições são realizadas em um DBGrid, o melhor é criar um novo campo (lookup) para o dataset.

Se um formulário é hospedeiro de um conjunto de controles de dados (DBEdit, DBComboBox, etc.), faz sentido usar apenas o DBLookupComboBox sem criar um campo novo.

O último modo, é usar colunas de um DBGrid com sua propriedade PickList, novamente sem criar um campo novo. Esta abordagem não representa um verdadeiro lookup, mas você verá que pode agir como um. A PickList exibe a lista de valores que o usuário pode selecionar para o valor do campo – tal qual um DBComboBox padrão - mas dentro de um DBGrid.

Analisaremos cada um dos modos, começando pelo último

Mais adiante, você descobrirá como fazer a exibição de célula de uma coluna DBGrid, com um drop-down list de valores.

A seguir, veremos como colocar uma drop-down list em um DBGrid. Crie interfaces do usuário visualmente mais atraentes para editar campos lookup dentro de um DBGrid - usando a propriedade PickList de uma coluna de DBGrid.

Agora, que você sabe o que é um campo lookup e quais são as opções para exibir um campo lookup no DBGrid do Delphi, está na hora de ver como usar a propriedade PickList de uma coluna de DGBrid, para permitir a um usuário a escolha de um valor para um campo lookup de uma drop-down list.

Uma informação rápida sobre a propriedade Columns do DBGrid

Um controle DBGrid tem uma propriedade Columns - uma coleção de objetos TColumn que representam todas as colunas em um controle grid. As colunas podem ser configuradas em tempo de projeto via o Columns editor ou programaticamente em tempo de execução. Você normalmente adicionará Columns a um DBGird, quando quiser definir a aparência de uma coluna, como os dados na coluna serão exibidos e para acessar as propriedades, eventos e métodos de TDBGridColumns em tempo de execução.

 

Um grid personalizado permite configurar colunas múltiplas para apresentar visões diferentes do mesmo dataset (diferentes ordens de colunas, escolhas de campo diferentes e diferentes cores e fontes de colunas, por exemplo). Cada Column em um grid é “vinculado" a um campo em um dataset exibido no grid. Ainda mais, cada coluna tem uma propriedade PickList. A propriedade PickList, lista os valores que o usuário pode selecionar para o valor do campo vinculado à coluna.

Preenchendo o PickList

O que você verá aqui é como preencher a String List com valores de outro dataset em tempo de execução. Lembre-se que estamos editando a tabela Articles - e que um campo Subject pode aceitar só valores da tabela Subjects: situação ideal para o PickList!

A seguir, mostramos como configurar a propriedade PickList. Primeiro, adicionamos uma chamada ao procedimento SetupGridPickList no manipulador de evento OnCreate do Formulário.

 

procedure TForm1.FormCreate(Sender: TObject);

begin

  SetupGridPickList('Subject', 'SELECT Name FROM Subjects');

end;

 

O modo mais fácil de criar a procedure SetupGridPickList, é adicioná-la na declaração da parte privada do formulário, e teclar a combinação CTRL + SHIF + C. O code completion do Delphi fará o resto:

 

...

type

  TForm1 = class(TForm)

...

  private

    procedure SetupGridPickList(

        const FieldName : string;

        const sql : string);

  public

...

 

Nota: a procedure SetupGridPickList tem dois parâmetros. O primeiro parâmetro, FieldName, é o nome do campo que queremos que se comporte como um campo lookup; o segundo parâmetro, sql, é a expressão SQL que usaremos para povoar o PickList com os valores possíveis - em geral a expressão SQL deveria devolver um datataset com um só campo.

 

Vejamos o aspecto do SetupGridPickList:

 

procedure TForm1.SetupGridPickList(const FieldName, sql: string);

var

  slPickList:TStringList;

  Query : TADOQuery;

  i : integer;

begin

  slPickList:=TStringList.Create;

  Query := TADOQuery.Create(self);

  try

    Query.Connection := ADOConnection1;

    Query.SQL.Text := sql;

    Query.Open;

    //Preencher o string list

    while not Query.EOF do

    begin

      slPickList.Add(Query.Fields[0].AsString);

      Query.Next;

    end; //while

 

    //colocar a lista na coluna correta

    for i:=0 to DBGrid1.Columns.Count-1 do

      if DBGrid1.Columns[i].FieldName = FieldName then

      begin

        DBGrid1.Columns[i].PickList:=slPickList;

        Break;

      end;

  finally

    slPickList.Free;

    Query.Free;

  end;

end; (*SetupGridPickList*)

 

Isso é tudo. Agora, quando você clica na coluna Subject (para entrar no modo de edição), obteremos o seguinte:

 

Figura 3.

Nota 1: por padrão, o drop-down list exibe 7 valores. Você pode mudar o tamanho desta lista configurando a propriedade DropDownRows.

 

Nota 2: nada o impede de povoar o PickList de uma lista de valores que não provenha de uma tabela de banco de dados. Por exemplo, se você tem um campo que só aceita nomes de dias da semana ('segunda-feira',..., 'Domingo'), poderá construir um "PickList hard-coded".

"Ih, preciso clicar o PickList 4 vezes..”.

Note que quando você quiser editar o campo que exibe um drop-down list, precisará clicar 4 vezes na célula para de fato escolher um valor. O próximo trecho de código, adicionado ao manipulador de evento OnCellClick do DBGrid, simula o pressionar das teclas F2, seguido por Alt + DownArrow.

 

procedure TForm1.DBGrid1CellClick(Column: TColumn);

begin

  //Fazer o drop-down pick list apareça masi rapidamente

  if Column.PickList.Count > 0 then

  begin

    keybd_event(VK_F2,0,0,0);

    keybd_event(VK_F2,0,KEYEVENTF_KEYUP,0);

    keybd_event(VK_MENU,0,0,0);

    keybd_event(VK_DOWN,0,0,0);

    keybd_event(VK_DOWN,0,KEYEVENTF_KEYUP,0);

    keybd_event(VK_MENU,0,KEYEVENTF_KEYUP,0);

  end;

end;

 
Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Receba nossas novidades
Ficou com alguma dúvida?