Copiar Objeto, não componente
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...
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
Curtidas 0
Respostas
Massuda
13/01/2006
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´.
GOSTEI 0
Tiagops
13/01/2006
Umm
resumindo, teria que copiar atributo por atributo...
é nao era o que eu imaginava, mas da pra fazer tranquilo! Valeu!
resumindo, teria que copiar atributo por atributo...
é nao era o que eu imaginava, mas da pra fazer tranquilo! Valeu!
GOSTEI 0
Bruno Belchior
13/01/2006
essa é a idéia do [b:6c272dea32]Assign[/b:6c272dea32], que existe a partir da classe [b:6c272dea32]TPersistent[/b:6c272dea32]...
GOSTEI 0
Tiagops
13/01/2006
Umm
mas vou perder meu polimorfismo... :(
Teria que ser algo utilizando reflection...
mas vou perder meu polimorfismo... :(
Teria que ser algo utilizando reflection...
GOSTEI 0
Massuda
13/01/2006
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).
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).
GOSTEI 0
Tiagops
13/01/2006
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
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]
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]
GOSTEI 0
Massuda
13/01/2006
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 :(
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.
GOSTEI 0
Tiagops
13/01/2006
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á?
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á?
GOSTEI 0
Massuda
13/01/2006
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?
GOSTEI 0
Tiagops
13/01/2006
Verdade.
Vou pensar mais um pouco aqui na melhor forma de resolver isso.
Valeu!
Vou pensar mais um pouco aqui na melhor forma de resolver isso.
Valeu!
GOSTEI 0