TList
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
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
Curtidas 0
Respostas
Rodc
05/03/2009
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.
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.
GOSTEI 0
Marco Salles
05/03/2009
Geralmente se usa Indexação ..
Vc tem que definir os outros métodos
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;GOSTEI 0
Erick.rocha
05/03/2009
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, na classe venda devo declarar uma propriedade do tipo TItem
GOSTEI 0
Marco Salles
05/03/2009
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
GOSTEI 0
Marco Salles
05/03/2009
Não posso Editar , esqueci de seguir as definiçoes do Primeiro Post...
Precisa sim ... Na hora de Adicionar os Items , vc deve criar um Objeto
do Tipo TItem e adiona-lo ao TVenda
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
Por não permitir EDITAR tive que reescreve a mensagem TODA :evil: :evil: :evil:
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:
GOSTEI 0
Ibotirama
05/03/2009
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
tentando fazer:
dá erro, como fazer ???
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 ???
GOSTEI 0
Marco Salles
05/03/2009
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;
GOSTEI 0