sexta-feira, 5 de dezembro de 2008

Adeus StringGrid, Olá ClientDataSet

Muitas vezes que precisei armazenar dados em memória e tinha que mostrar esses dados em uma grid, utilizava o componente do Delphi chamado StringGrid, que armazena dados em forma de array e joga para a grid.

Toda vez que eu tinha que fazer esse procedimento, já me dava uma preguiiiiiiça só de pensar q teria q montar a grid, de fazer os procedimentos para deletar itens, alterar, ou até mesmo para zebrar a stringgrid.

O ClientDataSet é um componente muito poderoso e nos permite gravar dados em memória e usar um DataSource para interagir com meus componentes, como DBGrid ou qualquer outro que se utiliza de um DataSource para capturar os dados.
Além disso, podemos gravar os dados em um arquivo XML para depois utilizar os dados registrados para outros fins. Ótimo não???!!!

Então vamos a mão na massa.
Arraste para seu formulário um ClientDataSet e um DataSource, ambos da paleta DataAccess.

Clique duas vezes no ClientDataSet. Isso abrirá o FieldEditor.
Clique com o botao direito do mouse nele e New Field(CTRL+N).
em Name, digite: ID
em Type, escolha a Opção AutoIc.











Essa opção funciona como uma chave primária e nos volta um valor incrementado(AutoIncrement).

em FieldType, marque a opção Data.
Clique em OK.
Nós faremos um exemplo bem simples, por isso, adicionaremos apenas mais 2 campos, chamados nome e endereco.
Faça o mesmo procedimento acima, apenas mudando a propriedade Name para nome e endereco e o Type desses 2 novos TFields para String e em Size, digite 50.

O FieldsEditor ficará assim:









Clique com o botao direito no ClientDataSet e escolha a opção Create DataSet.

Ligue a propriedade DataSet do DataSource1 ao ClientDataSet1.
Arraste uma DBGRID e um DBNavigator ao formulário e ligue a propriedade DataSet dos 2 componentes ao DataSource1.
Percebeu que os titulos da DBGrid já pegou o nome dos campos que você adicionou ao ClientDataSet?
Legal né.
No ClientDataSet1, marque a propriedade Active para TRUE e rode a aplicação.
Veja como você manipula os dados pelo DBNavigator.
Feche o programa e os dados não estarão mais la, pois o ClientDataSet gravou os dados em memória e assim que o aplicativo é encerrado, os dados são perdidos.
Você pode usar o mesmo procedimento para componentes de terceiros como Jedi, RXLib, etc.

GERANDO E REMOVENDO OS FIELDS EM EXECUÇÃO

É possível gerar os TFields em modo de execução.
Sempre que adicionamos um novo campo em um ClientDataSet, o que estamos fazendo na realidade é adicionando um item a propriedade FieldDefs do ClientDataSet.
Abra a propriedadede FieldDefs e note que todos os campos que acrescentamos como TField estarão lá com suas propriedades.
E como geramos esses campos em modo de execução?
Simples.
Nós referenciamos os objetos pelo tipo do dados. Por exemplo:
Para um campo String, teremos que criar um objeto proveniente da classe TStringField, para um Field do tipo Float, utilizamos a classe TFloatField e para um Field Auto Incremento, utilizamos a classe TAutoIncField.
Criação de um TStringField:
var
Campo: TStringField;
begin
with ClientDataSet1 do
begin
with FieldDefs do
begin
Campo := TFloatField.Create(Self);
with Campo do
begin
FieldName := 'novoCampo';
DisplayLabel := FieldName;
DataSet := cdsDemonstrativo;
Name := cdsDemonstrativo.Name+FieldName;
cdsDemonstrativo.FieldDefs.Add(Campo.Name, ftString, 1, False);
end;
Update;
end;
end;


Como falei anteriormente, utilizamos FieldDefs para a criação do novo Field.

Para liberar um TField da memória, podemos usar o seguinte código:


Campo :=TFloatField(Self.FindComponent('novocampo'));
if Assigned(Campo) then
Campo.Free;


Qualquer dúvida, podem comentar que eu respondo.
Abraços.

3 comentários:

Unknown disse...

Fala awe gatão...
Ta ficando show teu blog!
Mas o ClientDataSet vai além disso, utilizando o DataSetProvider vc pode pegar os dados baseados em um SELECT de uma Query, depois te explico como isso funciona.

Abraços.

Maurício Vinicius de O. Santos disse...

To ligado.
O tão chamado "Trio de componentes para acesso a dados com ClientDataSet".

O que mostrei é uma das funções que o ClientDataSet oferece.

Mais pra frente, vou explicar as propriedades Aggregates e Grouplevel do ClientDataSet ;)

Unknown disse...

Awee

Depois que aprendi a utilizar o ClientDataSet e o DataSetProvider, passei a ganhar mto mais temopo nas implementações, além de ter um código mto mais leve, limpo e enxuto ...

Abraçoo =]