05/12/2005

object list

alguém poderia me ajudar com object list?

tenho o seguinte objeto:

  TAssociaCampo = class(Tobject)
  public
    campoOri: string;
    CampoDes: string;
    constructor create(acampoOri, AcampoDes: string); overload; dynamic;
    constructor create; overload; dynamic;
  end;


quero criar um objeto do tipo TobjectList para criar uma lista desses meus objetos, mas estou em dúvida de como implementar o método add(): integer;

encontrei o seguinte exemplo:

function TAssociaCampoList.Add(avalor: TAssociaCampo): Integer;
var
   NovoObj : TAssociaCampo;
begin
   NovoObj := TAssociaCampo.Create(nil);
   NovoObj.Assign(AValor);
   Result := inherited Add(NovoObj);
end;


porem gostaria de saber se do jeito abaixo está mais correto:

function TAssociaCampoList.Add(avalor: TAssociaCampo): Integer;
begin
   Result := inherited Add(avalor);
end;


e se eu quiser setar as propriedades do meu objeto TAssociaCampo no momento de adicionar ele na lista, como eu faria?



Obrigado pela força!


Vitor^_^

Respostas

05/12/2005

Massuda

No primeiro caso você estará incluindo na lista uma cópia do objeto enquanto no outro caso você estará incluindo o próprio objeto na lista; qual dos dois está ´correto´ depende de como você está usando essa lista. Eu uso a segunda forma quando preciso ter uma lista centralizada de objetos; não uso a primeira forma, geralmente eu incluo uma função para clonar o objeto na própria classe do objeto.


Responder Citar

05/12/2005

Vitor^_^

no meu caso eu vou fazer assim:
cada objeto do tipo TassociaCampo eu vou criar durante um loop e adicionar
esses objetos na lista TassociaCampoList, que foi criada logo antes do loop.

Depois eu passo esse objeto TassociaCampoList como parâmetro de uma procedure que vai percorrer todos os itens e fazer o que tem que fazer com cada um dos objetos. Eu não preciso mais dos objetos isolados, apenas das listas.

O importante é que quando eu der free no TassociaCampoList, todos os objetos da lista deverão ser destruidos, e acho que para isso não seria certo clonar os objetos. A segunda maneira é a melhor no meu caso então?


Responder Citar

05/12/2005

Massuda

Pelo que entendi, no seu caso o melhor é usar a segunda forma que você mostrou. Apenas não dê Free nos objetos que você cria e adiciona na lista, pois isso ficará por conta da lista.


Responder Citar

05/12/2005

Vitor^_^

agora, pra implementar o método clear eu tenho que percorrer todos os itens dando free nos objetos e para implementar o método free, eu dou um clear antes do inherited?


Responder Citar

05/12/2005

Massuda

O TObjectList cuida disso.

Quando crio uma lista derivada de TObjectList para ser uma lista de (por exemplo) TMeuObjeto, eu geralmente faço...
type
  TListaDeMeuObjeto = class(TObjectList)
  private
    function GetItem(const Index: Integer): TMeuObjeto;
    procedure SetItem(const Index: Integer; MeuObjeto: TMeuObjeto);
  public
    function Add(MeuObjeto: TMeuObjeto): Integer;
    function IndexOf(MeuObjeto: TMeuObjeto): Integer;
    function Remove(MeuObjeto: TMeuObjeto): Integer;
    procedure Insert(Index: Integer; MeuObjeto: TMeuObjeto);
    property Items[const Index: Integer&93;: TMeuObjeto read GetItem write SetItem; default;
  end;
...mas tudo isso só é necessário porque eu não quero ter que fazer typecast de TMeuObjeto para TObject (e vice-versa) quando estiver usando essa lista.


Responder Citar

05/12/2005

Vitor^_^

Ahn, blz. Olhei o ancestrais e o Tlist tem os métodos clear e free. (se bem que eu não entendi lhufas de como eles funcionam).

Acho que agora vai ^^

Valeu Massuda!


Responder Citar