Criar uma classe do tipo List para objeto especifico

Delphi

22/10/2009

Pessoal, preciso criar uma classe que seja uma lista de um tipo especifico de um objeto criado.
Por exemplo, tenho uma classe TAddress e queria criar uma classe TAddressList com os metodos (Add, Remove) e um metodo Items[item: integer]: TAddress que retorne um TAddress.
Montei um exemplinho abaixo, alguem pode me ajudar ?

type
TAddress = class(TObject)

private

public
addressType: string;
customerAddress : string;
customerZIPCode : string;
customerCity : string;
customerState : string;
customerCountry : string;
constructor Create;
destructor Destroy; override;



-------------------------------------
Classe: TAddressList

type
TAddressList = class(TObject)

private
FList: AddressList;
FCount: Integer;

protected
function Get(Index: Integer): TAddress;
procedure Put(Index: Integer; Item: TAddress);
procedure SetCount(NewCount: Integer);

public
function Add(Item: TAddress): Integer;
procedure Delete(Index: Integer);
property Items[Index: Integer]: Pointer read Get write Put; default;


Gveggi

Gveggi

Curtidas 0

Respostas

Marco Salles

Marco Salles

22/10/2009

As versões mais recentes do Delphi tem suporte para isto.. A nivel de
designed Time
Porém em rum Time vc pode definir os tipos que deverão serem adicionados
a sua coleção usando a dupla TCollecyion e TCollectionItem

A restrição imposta pela TCollectionItem é de criar instancias da sua
coleção unicamente da classe que foi especificada em seu contructor
Isto garante a homogenidade da coleção

veja um exemplo Bobo...


type TForm1 = class(TForm) Button1: TButton; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; TProduto = class(TCollectionItem) private FCodigo:string; public property Codigo:String read FCodigo Write FCodigo; end; TClasseQualquer = class(TCollectionItem) private FCodigo:string; public property Codigo:String read FCodigo Write FCodigo; end; TMuitosProdutos = Class(TCollection) end; var Form1: TForm1; implementation {$R *.dfm} var produtos:TMuitosProdutos; procedure TForm1.Button1Click(Sender: TObject); var obj:TProduto; i:integer; begin obj:=TProduto.Create(produtos); obj.Codigo:=´Um Produto´; showmessage(TProduto(Produtos.GetItem(0)).codigo); for i := 0 to produtos.Count - 1 do TProduto(Produtos.GetItem(i)).Free; produtos.Free; end; procedure TForm1.FormCreate(Sender: TObject); begin produtos:=TMuitosProdutos.Create(TclasseQualquer); end;



para o exemplo funcionar vc deve mudar :


 produtos:=TMuitosProdutos.Create(TclasseQualquer);
Para
 produtos:=TMuitosProdutos.Create(TProduto);

ou

var
Obj:TProduto
para
Obj:TClasseQualquer


espero ter sido util e se isto te serviu em alguma coisa pesquise mais sobre
o assunto. Ok
Se nãolhe serviu volte a postar para que outros possam lhe ajudar


GOSTEI 0
Afarias

Afarias

22/10/2009

Eu gosto da abordagem mostrada pelo Marco Salles usando TCollection. Para evitar os TypeCasts eu torno a coleção mais específica, ex:


TAddress = class (TCollecttionItem)
private
  fAddressType: string;
  fAddressStreet: string;
  {...}
public
  property AddressType: string read fAddressType write fAddressType;
  property AddressStreet: string read fAddressStreet write fAddressStreet;
  {...}
end;

TAddressList = class (TCollection)
private
  function GetItem(Index: Integer): TAddress;
public
  constructor Create; reintroduce; overload;
  function Add: TAddress;
  procedure AddAddress(aAddress: TAddress); // opcional
  property Items[Index: Integer]: TAddress read GetItem; default;
end;


implementation


constructor TAddressList.Create;
begin
  inherited Create(TAddress);
end;

function TAddressList.GetItem(Index: Integer): TAddress;
begin
  Result := inherited Items[Index] as TAddress;
end;

function TAddressList.Add: TAddress;
begin
  Result := inherited Add as TAddress;
end;

procedure TAddressList.AddAddress(aAddress: TAddress);
begin
  aAddress.Collection := Self;
end;



Entretanto, se seus items não podem ou vc não deseja herdar de TCollectionItem, vc tem ainda outra opção de lista:


TAddress = class (TObject)
private
  fAddressType: string;
  fAddressStreet: string;
  {...}
public
  property AddressType: string read fAddressType write fAddressType;
  property AddressStreet: string read fAddressStreet write fAddressStreet;
  {...}
end;

TAddressList = class (TObject)
private
  fList: TObjectList; // unit Contnrs (no D7)
  function GetItem(Index: Integer): TAddress;
  function GetCount: Integer;
public
  constructor Create;
  destructor Destroy; override;
  function Add: TAddress; // opcional
  procedure AddAddress(aAddress: TAddress); // opcional
  property Items[Index: Integer]: TAddress read GetItem; default;
  property Count: Integer read GetCount;
end;

implementation

constructor TAddressList.Create;
begin
  inherited Create;
  fList := TObjectList.Create(True); // use FALSE se não quiser destruir os objetos junto com a lista
end;

destructor TAddressList.Destroy;
begin
  fList.Free;
  inherited;
end;

function TAddressList.GetItem(Index: Integer): TAddress;
begin
  Result := TAddress(fList.Items[Index]);
end;

function TAddressList.Add: TAddress;
begin
  Result := TAddress.Create;
  AddAdress(Result);
end;

procedure TAddressList.AddAddress(aAddress: TAddress);
begin
  fList.Add(aAddress);
end;

function TAddressList.GetCount: Integer;
begin
  Result := fList.Count;
end;



T+


GOSTEI 0
POSTAR