GARANTIR DESCONTO

Fórum TList #368815

05/03/2009

0

Alguém sabe me dar um exemplo para implementar uma Lista no meu projeto, mas usando uma classe ao invés de record.
Assim
eu tenho uma classe chamada itens e uma classe chamada venda,
eu instancio um objeto venda e preciso vender os itens, porém náo tem como saber quantos itens vai ser vendido então não possu usar um array dinamico do tipo item, já podendo criar um lista do tipo item, eu poderia ir adicioando objeto item conforme necessário e remover tb.
num sei se expliquei direito.
Mas se alguem tiver uma idéia ficaria muito grato


Erick.rocha

Erick.rocha

Responder

Posts

05/03/2009

Rodc

Usa a classe TList mesmo. Nela você tem esta opção de incluir e excluir os itens sem problema.
O único problema é que ela só guarda ponteiro para TComponent. Ou seja, você tem que ficar fazendo TypeCast para usar as informações utilizadas. Dá uma olhada no help da classe TList e vê se te serve.


Responder

Gostei + 0

05/03/2009

Marco Salles

Geralmente se usa Indexação ..

Vc tem que definir os outros métodos

Type
 Titem = class
end;

Type
 TVenda = class
 private
  Flista:TList;
    function GetItem(Index: integer): TItem;
    procedure SetItems(Index: integer; const Value: TItem);
 public
  property Items[Index:integer]:TItem read GetItem Write SetItems;
  constructor Create;
  DesTructor Destroy;override;
 end;


implementation

.........

{ TVenda }

constructor TVenda.Create;
begin
  inherited Create;
  FLista:=Tlist.Create;
end;

destructor TVenda.Destroy;
var
i:integer;
begin
 for i:= count-1 downto 0
   begin
    TItem(Flista[i]).Free;
    Flista[i]:=nil
   end;
  Flista.Free;
  inherited;
end;

function TVenda.GetItem(Index: integer): TItem;
begin
  if Index <= Flista.Count - 1 then
    result:=TItem(Flista[Index])
  else
    result:=nil;
end;

procedure TVenda.SetItems(Index: integer; const Value: TItem);
begin

 if Index <= Flista.Count - 1 then
    Flista[Index]:=Value
end;



Responder

Gostei + 0

06/03/2009

Erick.rocha

Ok entendi mais ou menos.
Mas eu não terei que instanciar o Objeto TItem em algum momento, ou não precisa, na classe venda devo declarar uma propriedade do tipo TItem


Responder

Gostei + 0

06/03/2009

Marco Salles

Ok entendi mais ou menos. Mas eu não terei que instanciar o Objeto TItem em algum momento, ou não precisa, na classe venda devo declarar uma propriedade do tipo TItem


Mas eu não terei que instanciar o Objeto TItem em algum momento, ou não precisa,


Precisa sim ... Na hora de Adicionar os Items , vc deve criar um Objeto
do Tipo TItem e adiona-lo ao TVenda

Var
Venda:TVenda; //visibilidade fora do Método


var
obj:TTitem;
begin
Obj:=TItem.Create;
//faça as Atribuiçoes do Objeto TItem
Venda.addObject(obj);
//não destrua nada
end;


na classe venda devo declarar uma propriedade do tipo TItem


Não precisa.. Tudo se faz usando Ponteiros

TItem(Venda[i]).Propriedade de TItem



Responder

Gostei + 0

06/03/2009

Marco Salles

Não posso Editar , esqueci de seguir as definiçoes do Primeiro Post...

Type 
 Titem = class 
end; 


Type 
 TVenda = class 
 private 
  Flista:TList; 
    function GetItem(Index: integer): TItem; 
    procedure SetItems(Index: integer; const Value: TItem); 
 public 
  property Items[Index:integer]:TItem read GetItem Write SetItems; 
  constructor Create; 
  DesTructor Destroy;override; 
 end;


Ok entendi mais ou menos. Mas eu não terei que instanciar o Objeto TItem em algum momento, ou não precisa, na classe venda devo declarar uma propriedade do tipo TItem


Mas eu não terei que instanciar o Objeto TItem em algum momento, ou não precisa,


Precisa sim ... Na hora de Adicionar os Items , vc deve criar um Objeto
do Tipo TItem e adiona-lo ao TVenda

Var 
Venda:TVenda; //visibilidade fora do Método


var 
obj:TTitem; 
begin 
Obj:=TItem.Create; 
//faça as Atribuiçoes do Objeto TItem 
Venda.Items.addObject(obj); 
//não destrua nada 
end; 


na classe venda devo declarar uma propriedade do tipo TItem


Não precisa.. Tudo se faz usando Ponteiros


[b:b6be5cd882][u:b6be5cd882]Venda.Items[i] é um Objecto do Tipo TItems[/u:b6be5cd882][/b:b6be5cd882]

Mas Atenção

(Venda.Items[i] as TItem) por se usar Ponteiros não compila 

Devemos pois fazer um TypeCast

TItem(Venda.Items[i]).PropriedadesDeTIem



Por não permitir EDITAR tive que reescreve a mensagem TODA :evil: :evil: :evil:


Responder

Gostei + 0

27/03/2009

Ibotirama

Seguinte até aí tudo bem, mas eu fiz segundo o que está escrito anteriormente, mas quando eu tento varrer os itens de um List do tipo

Type
 TVenda = class
 private
  Flista:TList;
    function GetItem(Index: integer): TItem;
    procedure SetItems(Index: integer; const Value: TItem);
 public
  property Items[Index:integer]:TItem read GetItem Write SetItems;
  constructor Create;
  DesTructor Destroy;override;
 end;


tentando fazer:

 for i:=0 to Venda.Items.Count -1 do


dá erro, como fazer ???


Responder

Gostei + 0

27/03/2009

Marco Salles

tentando fazer: Código: for i:=0 to Venda.Items.Count -1 do dá erro, como fazer ???


é foi apenas uma pequena introdução ...Vc pode fazer assim :

Inclua uma Procedure Add ..[b:afa59b9e0a] Na classe TVenda[/b:afa59b9e0a]


Type
TVenda = class
private
Flista:TList;
ftotal:integer; //Total de Items...
function GetItem(Index: integer): TItem;
procedure SetItems(Index: integer; const Value: TItem);
procedure Add(item:TItem);
public
property Items[Index:integer]:TItem read GetItem Write SetItems;
property total:integer read getFtotal;
constructor Create;
DesTructor Destroy;override;
end;

...

procedure TVenda.Add(item: TItem);
begin
Flista.Add(item);
fTotal:=Ftotal+1;
end;


Alterer tb O constrtutor para Inicializar A FTotal ( Total de Items)

constructor TVenda.Create;
begin
  inherited Create;
  FLista:=Tlist.Create;
  Ftotal:=0;
end;


Agora é so fazer :

Var
Venda:TVenda; //visibilidade fora do Método


procedure TForm1.Button1Click(Sender: TObject);
var
obj:TItem;
idx:integer;
begin
Obj:=TItem.Create;
//faça as Atribuiçoes do Objeto TItem

Venda.Add(obj);  //Aqui vc Adiciona os Objetos.....
//não destrua nada

for idx:=0 to venda.total do //Aqui vc Percorre  <varre >
TItem(venda.Items[idx]).suaPropriedade;



Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar