Fórum Copiar Objeto, não componente #309081

13/01/2006

0

Pessoal,

Alguem pode me dar uma luz de como copiar objeto?

Assign é só pra TComponent certo?

Eu tenho um Objeto que extens TObject.
Se eu faco

A = 1;
B := A;
FreeAndNil(A);

O B se perde.
Parece que ele esta apontando pro mesmo endereco de A, mas nao copiando...

Valeu...


Tiagops

Tiagops

Responder

Posts

13/01/2006

Massuda

Parece que ele esta apontando pro mesmo endereco de A, mas nao copiando...
Exato. Quando você atribui a B o valor de A você está ´criando´ duas referências ao mesmo objeto.

Para copiar um objeto de uma classe sua derivada de TObject, você precisa prever na sua classe algum construtor de cópia (um construtor que inicializa o objeto sendo contruído com os dados de um objeto passado como parametro) ou algume método de ´clonagem´.


Responder

Gostei + 0

13/01/2006

Tiagops

Umm

resumindo, teria que copiar atributo por atributo...

é nao era o que eu imaginava, mas da pra fazer tranquilo! Valeu!


Responder

Gostei + 0

13/01/2006

Bruno Belchior

essa é a idéia do [b:6c272dea32]Assign[/b:6c272dea32], que existe a partir da classe [b:6c272dea32]TPersistent[/b:6c272dea32]...


Responder

Gostei + 0

13/01/2006

Tiagops

Umm

mas vou perder meu polimorfismo... :(

Teria que ser algo utilizando reflection...


Responder

Gostei + 0

13/01/2006

Massuda

Talvez [url=http://forum.clubedelphi.net/viewtopic.php?t=57120]este tópico[/url] seja útil para você.

Com relação ao polimorfismo, se eu entendi direito, o problema é que você tem que implementar o método de clonagem (ou o construtor de cópia) na classe base e ir acrescentando mais detalhes nas classes derivadas (isso costuma dar trabalho).


Responder

Gostei + 0

13/01/2006

Tiagops

O que estava querendo fazer é o seguinte :

imagina que tenho um ListItem que tem a propriedade Items que possui text e tag por exemplo.

Eu preciso colocar mais dados nos itens do ListItem.

Entao eu coloquei um atributo chamado Object do tipo TObject;

Dai eu criei o meu Value Object. Por exemplo:

Nome : string;
idade : integer;

Dai eu faco

meuObjeto := TmeuObjeto.Create();
meuObjeto.nome := ´aa´;
meuObjeto.idade := 2;

ListItem.Item.add();
ListItem.Item.items[count-1].object := meuObjeto;

FreeAndNil(meuObjeto) // aqui esta o problema da copia  :( 

e assim vai.

Quando for ler o ListItem eu faco o cast.

Dessa forma, se eu colocar mais atributos no objeto meuObjeto nao precio mexer mais no objeto ListItem.

Mas acho que nao vai dar certo pq tenho que copiar o objeto... :(

[/code]


Responder

Gostei + 0

13/01/2006

Massuda

meuObjeto := TmeuObjeto.Create();
meuObjeto.nome := ´aa´;
meuObjeto.idade := 2;

ListItem.Item.add();
ListItem.Item.items[count-1].object := meuObjeto;

FreeAndNil(meuObjeto) // aqui esta o problema da copia  :( 
Nesse caso você não precisa clonar o objeto; basta não destruí-lo após atribuí-lo ao ListItem.

Você destrói os objetos associados aos ListItem´s quando não precisar mais dos ListItem´s. Uma alternativa é usar um TObjectList que também recebe os objetos atribuídos aos ListItem´s e destruir esse TObjectList quando não precisar mais dos ListItem´s.


Responder

Gostei + 0

13/01/2006

Tiagops

Entao, mas o problema é que o objeto que estou usando/alterando é o TJvImageListBox da JVCL.

Agora vem a duvida.

Quando eu fechar o formulario aonde esta o TJvImageListBox, ele vai destruir todos os objetos que estao dentro dos itens?

Pelo que sei, o delphi nao destroi os objetos sozinho né? Nao tem um garbageColector. Por isso temos que dar o FreeAndNil né?

Acho que no destructor deste objeto eu teria que fazer um for até Itens.count dando um freeAndNil nos objetos... será?


Responder

Gostei + 0

13/01/2006

Massuda

Quando eu fechar o formulario aonde esta o TJvImageListBox, ele vai destruir todos os objetos que estao dentro dos itens?
Exato, o list box não tem a mínima idéia de que ele tem referências a objetos.

Acho que no destructor deste objeto eu teria que fazer um for até Itens.count dando um freeAndNil nos objetos... será?
Sim. A alternativa seria usar uma list TObjectList para guardar as referencias aos mesmos objetos que estão no listbox e destruir essa lista no destrutor do form.

Note que esse problema de não destruir os itens que estão no listbox ocorreria mesmo se você resolvesse a questão da cópia/clonagem dos objetos. Quem iria destruir as cópias/clones dos objetos?


Responder

Gostei + 0

13/01/2006

Tiagops

Verdade.

Vou pensar mais um pouco aqui na melhor forma de resolver isso.

Valeu!


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar