Fórum Criar uma classe do tipo List para objeto especifico #376187
22/10/2009
0
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
Curtir tópico
+ 0
Responder
Posts
22/10/2009
Marco Salles
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
Responder
Gostei + 0
22/10/2009
Afarias
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+
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)