Criar uma classe do tipo List para objeto especifico
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;
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
Curtidas 0
Respostas
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...
para o exemplo funcionar vc deve mudar :
ou
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
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
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:
Entretanto, se seus items não podem ou vc não deseja herdar de TCollectionItem, vc tem ainda outra opção de lista:
T+
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