Mostrar Lista de objetos no grid

01/02/2013

35

Olá a todos.
Estou estudando a parte de POO no Delphi e cheguei em um ponto aqui em que eu tenho um array de objetos do tipo TCliente, uma classe feita por mim.
Só que eu preciso mostrar esses objetos em um grid, tipo como fazemos com uma query, ligando a um datasource. Mas não dá pra ligar um array a um datasource, então como eu faria?
Grata.
Responder

Posts

01/02/2013

Thiago Jesus

Carlinha, eu utilizo Orientação a Objetos no Delphi da seguinte forma:


procedure TClienteDAO.ListarDados;
 var
  conexao : TDBXConnetion;
  command : TDBXCommand;
  reader : TDBXReader;
begin
 try
  
  // Fabrico uma conexao
  conexao := TDBXConnectionFactory.GetConnectionFactory.GetConnection('SISTEMA','sysdba','masterkey');
  
  // Crio uma instrução SQL
  command := conexao.CreateCommand; 
  
  // Passo a instrução SQL para o objeto command
  command.Text := ' Select * From CLIENTES ';

  
  command.Prepare; // Preparo a instrução para ser executada no banco
  reader := command.ExecuteQuery; // o objeto Reader irá armazenar o resultado da instrução SQL

    if Assigned(reader) then
      begin
        // Utilize TDBXDataSetReader para copiar os dados do objeto reader para o seu ClientDataSet
        TDbxDataSetReader.CopyReaderToClientDataSet(reader, dm_dados.cds_clientes);
      end;

 finally
  // libera os objetos da memória
  FreeAndNil(conexao);
  FreeAndNil(command);
  FreeAndNil(reader);
 end;
end;



Utilizando os métodos do DBX 4, podemos utilizar POO de uma maneira muito elegante.
Esse método está apenas Listando os dados. Se quiser algo específico, é só passar uma Classe Model como parâmetro, como:
procedure Insert(cliente : TClienteModel);

Não esqueça de dar uses Units DBXCommon e DBXDBReaders.


Espero que possa ajudar;
Responder

02/02/2013

Carla Batista

Nossa, você foi longe, hein? rsrs
Na verdade acho que meu problema é mais simples. Eu tenho um array of TCliente com alguns itens e queria apenas listá-los num grid. Nem estou usando banco de dados ainda.
Eu "ouvi falar" de uma classe TList, não sei se é mais adequado que o array e se daria pra ligar a um grid.
Mas obrigada pela resposta, assim que puder darei uma olhada nesse DBX4.
Responder

02/02/2013

José

Carlinha, o que você está tentando fazer.
seria um exemplo de aplicação que usaria tipo um banco de dados temporário ?

Se você usar o delphi xe2 e xe3.

Pode criar uma base de dados temporária através do LiveBindings Wizard.
Responder

02/02/2013

Thiago Jesus

Bom dia Carlinha,

Para você listar dados em um DBGrid por exemplo, você iria precisar de um DataSource (Eu pelo menos nunca vi DBGrid sem ele).

Uma dica para você é, no formulário adicione:
- 01 Memo
- 02 Edits (Nome e Idade)
- 01 Button

Crie uma uma classe TCliente (pode ser no próprio formulário mesmo)


  TCliente = class
    FNome: string;
    FIdade: string;
  end;



No evento onClick do botão, digite o seguinte:
procedure TForm1.btnListarClick(Sender: TObject);
 var 
  i       : Integer;
  lista   : TList;
  cliente : TCliente;
begin
 try 

  // cria os objetos na Memória
  cliente := TCliente.Create;
  lista := TList.Create;
  
  // Passa os dados dos edits para o objeto cliente
  cliente.FNome := Edit1.Text;
  cliente.FIdade := Edit2.Text;
  
  //adiciona no objeto lista
  lista.Add(cliente);

  // loop para listar os dados no Memo
  for i := 0 to lista.Count -1 do
  begin
    Memo1.Lines.Add('Nome: ' + TCliente(lista.Items[I]).FNome);
    Memo1.Lines.Add('Idade: ' + TCliente(lista.Items[I]).FIdade);
  end;
 finally
   // libera os objetos da memória
   FreeAndNil(lista);
   FreeAndNil(cliente);
 end;



Essa é uma maneira simples de listar dados em um Memo.

Você pode pesquisar também sobre o StringGrid.
Responder

02/02/2013

José

Concordo com o amigo Thiago, já procurei várias vezes e nunca encontrei uma maneira de listar
dados em um dbgrid sem um datasource.

Mais como mencionei anteriormente se for para fazer testes
utilize a ferramente LiveBindings disponíveis nas versões XE2 e XE3 do delphi

para prototipagem é um modo muito interessante.
Responder

02/02/2013

Marco Salles

Utilize o StringGrid e passe esta coleção a ele ... De maneira semelhante a o exemplo do amigo anterior . Varrendo o Array
e inserindo na Gride
Responder

02/02/2013

Thiago Jesus

Concordo com o amigo Thiago, já procurei várias vezes e nunca encontrei uma maneira de listar
dados em um dbgrid sem um datasource.

Mais como mencionei anteriormente se for para fazer testes
utilize a ferramente LiveBindings disponíveis nas versões XE2 e XE3 do delphi

para prototipagem é um modo muito interessante.


Por falar em LiveBindings, gostei do seu artigo mostrando a utilização com Firemonkey, parabéns.

Responder

02/02/2013

José

Concordo com o amigo Thiago, já procurei várias vezes e nunca encontrei uma maneira de listar
dados em um dbgrid sem um datasource.

Mais como mencionei anteriormente se for para fazer testes
utilize a ferramente LiveBindings disponíveis nas versões XE2 e XE3 do delphi

para prototipagem é um modo muito interessante.


Por falar em LiveBindings, gostei do seu artigo mostrando a utilização com Firemonkey, parabéns.



Obrigado! Fico muito feliz que tenha gostado.
Responder

03/02/2013

Carla Batista

Nossa, tá parecendo complicado, hein. Eu imaginei que tivesse alguma forma de ligar a lista diretamente a um grid, seja qual for, mas pelo jeito não tem, né?
Nesse caso vou ter de fazer um laço e ir listando item por item, como o exemplo do Memo?
Daria pra fazer isso com o StringGrid, não é, Marco? Mas nunca trabalhei com esse controle. Alguém poderia me ajudar com ele?
Grata.
Responder

04/02/2013

Daniel Santos

Isso que voce quer fazer o delphi não faz! É comum no java onde ele aceita uma coleção de objetos, o Delphi ainda não trabalha desta forma!

Responder

04/02/2013

Carla Batista

Nossa, Daniel, agora desencantei =( rsrs
Que coisa, não? Quer dizer que a única forma de listar uma coleção de registros em um grid de forma "automática" é usando um DataSource ligado a um DataSet? Agora fiquei decepcionada.
Responder

04/02/2013

Daniel Santos

Voce pode fazer como eu fiz e modificar o ClientDataSet para aceitar uma lista de Objetos

tipo

ClientDataSet1.Load<TCliente>(Lista);
Responder

04/02/2013

Carla Batista

Olha, me parece interessante. Como eu faço isso, Daniel?
Responder

06/02/2013

Daniel Santos

Estude um pouco sobre RTTI!
Responder

06/02/2013

Carla Batista

Obrigada, Daniel. Vou pesquisar sobre isso.
Nesse caso, podem fechar esse tópico, por favor.
Obrigada a todos.
Responder