Mostrar Lista de objetos no grid

Delphi

01/02/2013

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.
Carla Batista

Carla Batista

Curtidas 0

Respostas

Thiago Jesus

Thiago Jesus

01/02/2013

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;
GOSTEI 0
Carla Batista

Carla Batista

01/02/2013

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.
GOSTEI 0
José

José

01/02/2013

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.
GOSTEI 0
Thiago Jesus

Thiago Jesus

01/02/2013

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.
GOSTEI 0
José

José

01/02/2013

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.
GOSTEI 0
Marco Salles

Marco Salles

01/02/2013

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
GOSTEI 0
Thiago Jesus

Thiago Jesus

01/02/2013

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.

GOSTEI 0
José

José

01/02/2013

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.
GOSTEI 0
Carla Batista

Carla Batista

01/02/2013

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.
GOSTEI 0
Daniel Santos

Daniel Santos

01/02/2013

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!

GOSTEI 0
Carla Batista

Carla Batista

01/02/2013

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.
GOSTEI 0
Daniel Santos

Daniel Santos

01/02/2013

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

tipo

ClientDataSet1.Load<TCliente>(Lista);
GOSTEI 0
Carla Batista

Carla Batista

01/02/2013

Olha, me parece interessante. Como eu faço isso, Daniel?
GOSTEI 0
Daniel Santos

Daniel Santos

01/02/2013

Estude um pouco sobre RTTI!
GOSTEI 0
Carla Batista

Carla Batista

01/02/2013

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