ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Tlist retornando informações repetidas!!!!

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
rosinha
Novato
Novato


Registrado: Domingo, 16 de Setembro de 2007
Mensagens: 7

MensagemEnviada: Qua Nov 14, 2007 9:06 pm    Assunto: Tlist retornando informações repetidas!!!! Responder com Citação

Moderadores Active-Delphi escreveu:

Tópico editado por: johnny-walker.
Motivo: Regras do Fórum.
Titulo Original:
Socorro: Tlist retornando informações repetidas!!!!




Boa noite, Mad
Já tentei de todas as formas e não consigo fazer a variável do tipo TList que recebe o resultado de consulta passar mais de um resultado encontrado.
O código da consulta é este:

function TdtmInsumo.cons_insumo_nome(strnome: string; oInsumo: TInsumos):TList;
var
linsumo:TList;
i:integer;
begin
//consulta de insumo
linsumo:=TList.Create;
with dtmInsumo.ADOqryInsumo do
begin
close;
sql.Clear;
sql.Add('SELECT cod_insumo, nome, qtde_tot, vlr_unit, qtde_min ');
sql.Add('FROM insumo ');
sql.Add('WHERE nome like :pnome ');
Parameters.ParamByName('pnome').Value:='%'+strnome+'%';
open;
first;
end;
while (not (ADOqryInsumo.Eof)) do
begin
oInsumo.codinsumo:=ADOqryInsumo.Fields[0].AsInteger;
oInsumo.nome:=ADOqryInsumo.Fields[1].AsString;
oInsumo.qtdetot:=ADOqryInsumo.Fields[2].AsInteger;
oInsumo.vlrunitario:=ADOqryInsumo.Fields[3].AsCurrency;
oInsumo.qtdemin:=ADOqryInsumo.Fields[4].AsInteger;
linsumo.Add(oinsumo);
ADOqryInsumo.next;
end;
result:=linsumo;
end;

O código para trazer para a tela(stringgrid) os resultados é este:

lInsumo:=objinsumo.cons_insumo_nome(edtconsulta.Text);
if linsumo.count > 0 then
begin
for j:=0 to linsumo.count-1 do
begin
encher_grid;
strgrConsulta.RowCount:=linsumo.count+j;
objInsumo:=linsumo.items[j];
strgrConsulta.Cells[0,j+1]:=inttostr(objInsumo.codinsumo);
strgrConsulta.Cells[1,j+1]:=objInsumo.nome;
strgrConsulta.Cells[2,j+1]:=inttostr(objInsumo.qtdetot);
strgrConsulta.Cells[3,j+1]:=inttostr(objInsumo.qtdemin);
strgrConsulta.Cells[4,j+1]:=floattostr(objInsumo.vlrunitario);
end;
end;

Sempre que na consulta é encontrado mais de um resultado ele repete no stringgrid o último resultado encontrado tantas vezes quantos forem os resultados da consulta.
Obs.: Código OO

Desde já agradeço a atenção de quem possa ajudar.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
levijr00
Membro Junior
Membro Junior


Registrado: Sexta-Feira, 16 de Setembro de 2005
Mensagens: 356
Localização: Rio Verde - GO

MensagemEnviada: Sex Nov 16, 2007 9:04 am    Assunto: Responder com Citação

velho tenta criar o objeto antes de passar pro grid e destruir depois...
Código:

lInsumo:=objinsumo.cons_insumo_nome(edtconsulta.Text);
//faz um teste pra verifica os objetos q tao na lista acima...
if linsumo.count > 0 then
begin
   strgrConsulta.RowCount:=linsumo.count+j;
   for j:=0 to linsumo.count-1 do
   begin
//pra que serve essa encher_grid??   
      encher_grid;
      objInsumo := TObject.Create(Self);
      objInsumo := linsumo.items[j];
      strgrConsulta.Cells[0,j+1]:=inttostr(objInsumo.codinsumo);
      strgrConsulta.Cells[1,j+1]:=objInsumo.nome;
      strgrConsulta.Cells[2,j+1]:=inttostr(objInsumo.qtdetot);
      strgrConsulta.Cells[3,j+1]:=inttostr(objInsumo.qtdemin);
      strgrConsulta.Cells[4,j+1]:=floattostr(objInsumo.vlrunitario);
      objInsumo.Free;
   end;
end;


espero ter ajudado...flwss
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
rosinha
Novato
Novato


Registrado: Domingo, 16 de Setembro de 2007
Mensagens: 7

MensagemEnviada: Seg Nov 19, 2007 7:25 pm    Assunto: Responder com Citação

O encher_grid preenche o cabeçalho do stringgrid, se eu crio o objeto e destruo a cada loop do for ele dá access violation, se eu somente der o create ele continua repetindo o primeiro resultado no stringgrid que era o problema inicia.

SOCORRO!!!!!!!!!!
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
gilsonnrodrigues
Moderador
Moderador


Registrado: Quinta-Feira, 14 de Abril de 2005
Mensagens: 9009
Localização: Governador Valadares-MG

MensagemEnviada: Seg Nov 19, 2007 8:16 pm    Assunto: Responder com Citação

na realidade vai repetir mesmo!!
pelo menos foi o q vc fez?

se vc checar no seu List tods itens tem o mesmo endereço.
pq foi o q vc fez. vc adiciona o mesmo objeto, e muda sempre o valor do mesmo objeto
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
rosinha
Novato
Novato


Registrado: Domingo, 16 de Setembro de 2007
Mensagens: 7

MensagemEnviada: Seg Nov 19, 2007 8:31 pm    Assunto: Responder com Citação

Gilson, se você reparar estou dando um next no objeto para carregar o próximo da lista.
Será que tem outra forma de fazer???

SOCORRO!!!!!!!!!!!!!!!!!!!!!!!!!
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
gilsonnrodrigues
Moderador
Moderador


Registrado: Quinta-Feira, 14 de Abril de 2005
Mensagens: 9009
Localização: Governador Valadares-MG

MensagemEnviada: Seg Nov 19, 2007 8:35 pm    Assunto: Responder com Citação

qdo digo objeto, to falando do oInsumo.

entendeu?

vc teri q estar usando algo como
New(oInsumo).


mas vc tem q liberar memoria dps usando um Dispose pq esse tipo de coisa o delphi nao libera automaticamente.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
rosinha
Novato
Novato


Registrado: Domingo, 16 de Setembro de 2007
Mensagens: 7

MensagemEnviada: Ter Nov 20, 2007 8:53 am    Assunto: Responder com Citação

Compreendi que seria Insumo sim.
Tentei NEW e dispose porem não funciona e dá erro de compilação.

SOCORRO!!!!!!!!!!!!!!!!!!!!!!!
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
gilsonnrodrigues
Moderador
Moderador


Registrado: Quinta-Feira, 14 de Abril de 2005
Mensagens: 9009
Localização: Governador Valadares-MG

MensagemEnviada: Ter Nov 20, 2007 9:00 am    Assunto: Responder com Citação

como é a definição/estrtura de TInsumos?
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
rosinha
Novato
Novato


Registrado: Domingo, 16 de Setembro de 2007
Mensagens: 7

MensagemEnviada: Ter Nov 20, 2007 10:01 am    Assunto: Responder com Citação

Segue a estrutura.
type
TInsumos=class(TObject)

private
Fcodinsumo:integer;
Fnome:string;
Fqtdetot:integer;
Fvlrunitario:currency;
Fqtdemin:integer;

public
property codinsumo:integer read Fcodinsumo write Fcodinsumo;
property nome:string read Fnome write Fnome;
property qtdetot:integer read Fqtdetot write Fqtdetot;
property vlrunitario:currency read Fvlrunitario write Fvlrunitario;
property qtdemin:integer read Fqtdemin write Fqtdemin;
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
gilsonnrodrigues
Moderador
Moderador


Registrado: Quinta-Feira, 14 de Abril de 2005
Mensagens: 9009
Localização: Governador Valadares-MG

MensagemEnviada: Ter Nov 20, 2007 11:35 am    Assunto: Responder com Citação

blz

achei q era um tipo ponteiro de registro

mas é tipo classe.
vc teria q criar uma instancia pra cada item do tlist
porem nao esqucendo de destruí-los dps.

agora na minha opniao, vc ta complicando a coisa sem necessidade!!

existe maneira + simples e mais eficas de solucionar seu prob!
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
johnny-walker
Moderador
Moderador


Registrado: Sábado, 4 de Outubro de 2003
Mensagens: 10653
Localização: Contagem/MG - BRAZIL

MensagemEnviada: Ter Nov 20, 2007 12:02 pm    Assunto: Responder com Citação

bem rosinha, fiz este petit code para vc, espero que consiga resolver o seu caso... claro que nao usei uma classe comum e sim uma derivada de TCollectionItem, mas nada que te impeça de usar a sua...


Código:

type
  TProduto = Class(TCollectionItem)
  public
     Codigo: Integer;
     Descricao: String;
  end;

type
  TForm1 = class(TForm)
    Button1: TButton;
    StringGrid1: TStringGrid;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}



procedure TForm1.Button1Click(Sender: TObject);
Var
   Produto: TProduto;
   Colecao: TCollection;
   I: Integer;
begin
     Colecao := TCollection.Create(TProduto);
     try
        Produto := TProduto(Colecao.Add);
        Produto.Codigo := 1;
        Produto.Descricao := 'Produto 1';
        Produto := TProduto(Colecao.Add);
        Produto.Codigo := 2;
        Produto.Descricao := 'Produto 2';
        Produto := TProduto(Colecao.Add);
        Produto.Codigo := 3;
        Produto.Descricao := 'Produto 3';
        With Colecao do
        begin
             StringGrid1.RowCount := Colecao.Count+1;
             StringGrid1.Cells[0, 0] := 'Código';
             StringGrid1.Cells[1, 0] := 'Descrição';
             for i := 0 to Colecao.Count -1 do
               with Colecao do
               begin
                 StringGrid1.Cells[0, I+1] := IntToStr(TProduto(Items[i]).Codigo);
                 StringGrid1.Cells[1, I+1] := TProduto(Items[i]).Descricao;
               end;
        end;
     finally
        Colecao.Free
     end;
end;




bye
_________________
P.O.W.E.R B.Y D.E.L.P.H.I
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
gilsonnrodrigues
Moderador
Moderador


Registrado: Quinta-Feira, 14 de Abril de 2005
Mensagens: 9009
Localização: Governador Valadares-MG

MensagemEnviada: Ter Nov 20, 2007 1:37 pm    Assunto: Responder com Citação

com akele seu codigo mesmo vc poderia fazer o seguinte:


modificar só o seguinte:

Código:
procedure TdtmInsumo.cons_insumo_nome(strnome: string; Lista : TList);
var
  oInsumo: TInsumos;
begin
 //consulta de insumo

  with dtmInsumo.ADOqryInsumo do
  begin
    close;
    sql.Clear;
    sql.Add('SELECT cod_insumo, nome, qtde_tot, vlr_unit, qtde_min ');
    sql.Add('FROM insumo ');
    sql.Add('WHERE nome like :pnome ');
    Parameters.ParamByName('pnome').Value:='%'+strnome+'%';
    open;
    first;

    while not Eof do
    begin
      oInsumo := TInsumos.Create;
      Lista.Add(oinsumo);
      oInsumo.codinsumo := Fields[0].AsInteger;
      oInsumo.nome := Fields[1].AsString;
      oInsumo.qtdetot := Fields[2].AsInteger;
      oInsumo.vlrunitario := Fields[3].AsCurrency;
      oInsumo.qtdemin := Fields[4].AsInteger;
      next;
    end;
    Close;
  end;
end;




O código para trazer para a tela(stringgrid) os resultados é este:

Código:
var
  objInsumo : TInsumos;
  J : Integer;
begin
   lInsumo := TList.Create;//pra q fique + seguro.
   try
     objinsumo.cons_insumo_nome(edtconsulta.Text, lInsumo);
     if linsumo.count > 0 then
     begin
        strgrConsulta.RowCount := linsumo.Count + 1;//creio q seria o correto
        for j:=0 to linsumo.count-1 do
        begin
           encher_grid;
           //strgrConsulta.RowCount := linsumo.count + j;//achei estranho           
           objInsumo := TInsumos(lInsumo.items[j]);
           strgrConsulta.Cells[0, j+1] := IntToStr(objInsumo.codinsumo);
           strgrConsulta.Cells[1, j+1] := objInsumo.nome;
           strgrConsulta.Cells[2, j+1] := inttostr(objInsumo.qtdetot);
           strgrConsulta.Cells[3, j+1]:= inttostr(objInsumo.qtdemin);
           strgrConsulta.Cells[4, j+1]:=FloatToStr(objInsumo.vlrunitario);
           lInsumo.items[j] := nil;//mt importante
           objInsumo.Free; //mt importante
        end;
     end;
   finally
     try
        //pra o caso de ter dado algum erro e tiver um infeliz na memoria.
        for j:=0 to linsumo.count-1 do
        begin
           if linsumo[J] <> nil then
           begin
              TInsumos(linsumo[J]).Free;
              linsumo[J] := nil;
           end;
     finally
       lInsumo.Free; //isso aki ja nem precisa comentar, né?
     end;
   end;
end;
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
johnny-walker
Moderador
Moderador


Registrado: Sábado, 4 de Outubro de 2003
Mensagens: 10653
Localização: Contagem/MG - BRAZIL

MensagemEnviada: Qua Nov 21, 2007 10:39 am    Assunto: Responder com Citação

isto esclarece um pouco sobre tlist, o que deve sanar algumas dúvidas...


http://www.delphibasics.co.uk/RTL.asp?Name=TList


bye
_________________
P.O.W.E.R B.Y D.E.L.P.H.I
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB