Problema com TList

Delphi

02/06/2011

  Estou com um bug estranho usando uma TList. Estou fazendo um programa de frente de caixa. A parte que acontece esete bug é na hora de fazer o pedido. Há as opções adicionar e remover do carrinho. No adicionar, pego os dados do produto e adiciono numa lista TList do objeto Pedido que criei um objeto ItemPedido, e com isso atualizo subtotal... total... e a lista do carrinho. Até ai tudo bem. Mas quando vou retirar do carrinho e atualizar o valor do total, quando vou pegar da lista de itens, ele só me retorna o último que adicionei. Então se eu adicionar Bola e Carro, ele só vai me retornar Carro, mesmo que eu já tenha removido ele. Conferi a lista logo após que adiciono, e ele adiciona normalmente. Mas na hora de pegar na lista depois que removo o último da esse problema.

A seguir segue os trechos de código:


ADICIONA NO CARRINHO


procedure TOrcamentoForm.AdicionarButtonClick(Sender: TObject);
var
  nitens: Integer;
  subtotal: Double;
  desconto, acrescimo: Double;
  item: TItemPedido;
  n: integer;
begin
  desconto := 0; acrescimo := 0; subtotal := 0;
  nitens := CarrinhoListBox.Count - 2;

  CarrinhoListBox.Items.Add(IntToStr(nitens+1)+': '+produto.Nome+
    ' x'+QuantEdit.Text+' R$ '+FloatToStrF(produto.Valor, ffCurrency, 5, 2));
  item := TItemPedido.Create;
  item.produto := produto;
  item.qtd := StrToInt(QuantEdit.Text);
  pedido.itens.Add(TObject(item));

  if DescEdit.Text '' then desconto := StrToFloat(DescEdit.Text);
  if AcrescEdit.Text '' then acrescimo := StrToFloat(AcrescEdit.Text);

  subtotal := item.produto.Valor * item.qtd;
  subtotal := subtotal - (subtotal/100 * desconto);
  pedido.Valor := pedido.Valor + subtotal;
  TotalPanel.Caption := FloatToStrF(pedido.Valor, ffCurrency, 5, 2);

....

RETIRA DO CARRINHO

procedure TOrcamentoForm.RemoverButtonClick(Sender: TObject);
var
  subtotal: Double;
  item: TItemPedido;
  n: integer;
begin
  if CarrinhoListBox.Items.Count > 2 then
  begin
    subtotal := 0;
    CarrinhoListBox.Items.Delete(CarrinhoListBox.Count - 1);
    item := pedido.itens.Last;
    subtotal :=  item.produto.Valor * item.qtd;
    pedido.Valor := pedido.Valor - subtotal;
    pedido.itens.Remove(pedido.itens.Last);
    TotalPanel.Caption := FloatToStrF(pedido.Valor, ffCurrency, 5, 2);
    CodigoEdit.SetFocus;
{TODO: Bug de retirar do carrinho }
  end;


Fiz de tudo mas nada deu certo.
Jonathan Soares

Jonathan Soares

Curtidas 0

Respostas

Rafael Mattos

Rafael Mattos

02/06/2011

Não entendi muito bem, mas não se esqueça quando vc add ou remove, o ItemIndex dele muda
GOSTEI 0
Jonathan Soares

Jonathan Soares

02/06/2011

  Consegui resolver, não tinha nada haver com a List, mas sim com referencia a objeto
GOSTEI 0
POSTAR