Bom saber destas coisas...

Aí fica ao critério do programador decidir qual é a melhor forma pra ele
mesmo!

Vlw =)

2010/1/22 Júlio César Ködel <jcko...@gmail.com>

> Então... como diria Didi Mocó, "vareia" =)
>
> O que o copy faz é serializar o objeto inteiro para um ByteArray e então
> desserializar o objeto em um novo objeto.
>
> Funciona? Em termos... Devemos lembrar que o AS é uma linguagem dinâmica,
> ou seja, você pode ter uma classe dinâmica (public dynamic class) que cria
> automaticamente as propriedades caso estas não existam.
>
> O fato é que a desserialização opera com objetos dinâmicos, portanto, a
> cópia seria um DynamicObject ao invés de um TipoDaClasse.
>
> Pro contexto do DataGrid, sem muitos problemas, já que o DataGrid não se
> importaria com isso... Mas para outros casos, isso poderia gerar alguns
> problemas (ter que registrar, etc.), além do impacto de performance da cópia
> feita desta forma.
>
> Um outro problema que pode gerar MUITA dor de cabeça é a recursão: a
> serialização serializa o objeto inteiro (deep copy), então se houver uma
> referência circular, o que é comum para hierarquia, stack overflow na veia
> =)
>
> Eu diria que, para poucas iterações na cópia (como é o caso aqui),
> funcionaria de boa... Já pra clonar vários objetos eu não botaria muita fé
> não... iria impactar na já frágil performance do Flex.
>
> Aí fica à escolha do programador, mas sem dúvida teu comentário facilitaria
> bastante neste caso =)
>
>
> 2010/1/22 José Alexandre D'Abruzzo Pereira <jose...@gmail.com>
>
>> Será que neste caso ele não poderia usar o ObjectUtil.copy(itemADuplicar)
>> ???
>> Júlio, vc sabe se este método tem algum problema de performance? Pq parece
>> uma solução mais simples...
>>
>> Acho que o único problema seria o que está explicado neste post:
>> http://www.darronschall.com/weblog/2007/08/on-transient-objectutilcopy-and-casting.cfm
>> Talvez seja necessário registrar a classe antes de copiar o objeto.
>>
>>
>> []'s
>> Zé Alexandre
>>
>> 2010/1/22 Júlio César Ködel <jcko...@gmail.com>
>>
>>> Só remendando um erro meu:
>>>
>>> Infelizmente o Flex não possue a interface ICloneable, então a função
>>> clone é específica da sua classe.
>>>
>>> Confundi com .net onde tenho a interface ICloneable =)
>>>
>>> A única desvantagem disso é que você não conseguiria automatizar a
>>> clonagem de objetos em uma função genérica (mas também nada impede do seu
>>> aplicativo definir a interface ICloneable... é apenas um facilitador e nem
>>> importa muito para o teu caso).
>>>
>>> 2010/1/22 Lorenzi <mlorenz...@gmail.com>
>>>
>>>> Valeu Julio obrigado pela resposta vou testar isso..
>>>>
>>>>
>>>> On 22 jan, 19:09, Júlio César Ködel <jcko...@gmail.com> wrote:
>>>> > Uma coisa que vocês tem que ter noção é que o grid, ou qualquer outro
>>>> > componente de lista do Flex NÃO POSSUEM ITENS NEM LINHAS!
>>>> >
>>>> > Ele simplesmente apresenta os dados providos na propriedade
>>>> dataProvider.
>>>> >
>>>> > Portanto, o que você quer fazer é simplesmente copiar um elemento do
>>>> array
>>>> > para outra posição.
>>>> >
>>>> > Mas aí temos as pegadinhas. Rá! =)
>>>> >
>>>> > Arrays, por padrão, são imutáveis, ou seja, não é nada bom adicionar
>>>> itens
>>>> > neles (já que eles alocam um espaço em memória com apenas um ponteiro
>>>> e
>>>> > adicionar um item nestes caras implica, implicita ou explicitamente,
>>>> em
>>>> > copiar todo o array antigo para uma nova localização na memória + o
>>>> item a
>>>> > ser inserido).
>>>> >
>>>> > Por isso a grande maioria das operações feitas em listas no Flex são
>>>> através
>>>> > do ArrayCollection, que são listas de dados onde novos dados podem ser
>>>> > adicionados mais facilmente (e há mecanismos internos para prover
>>>> > performance a esta operação).
>>>> >
>>>> > O grande problema é que cada item do ArrayCollection é um objeto. E o
>>>> que é
>>>> > um objeto? Apenas um inteiro apontando para uma estrutura da memória.
>>>> Então
>>>> > copiar o objeto para outra posição do array na verdade não o copia,
>>>> apenas
>>>> > copia sua referência (o que implica que uma alteração no item original
>>>> seja
>>>> > imediatamente replicada para os itens copiados já que eles são a mesma
>>>> > coisa, a mesma estrutura em memória).
>>>> >
>>>> > Para isso o ActionScript define uma interface para adicionar o método
>>>> Clone
>>>> > em um objeto. Cabe a você, programador, implementar o mecanismo de
>>>> clone na
>>>> > sua classe que implica, basicamente, em criar uma nova instância do
>>>> tipo
>>>> > desejado e copiar cada uma das propriedades para esta nova instância,
>>>> > gerando assim uma cópia real do objeto.
>>>> >
>>>> > Então, vamos supor sua classe:
>>>> >
>>>> > public class MinhaClasse
>>>> > {
>>>> >   public var nome:String;
>>>> >   public var idade:int;
>>>> >
>>>> > }
>>>> >
>>>> > Ficaria assim:
>>>> >
>>>> > public class MinhaClasse
>>>> > {
>>>> >   public var nome:String;
>>>> >   public var idade:int;
>>>> >
>>>> >   public function clone():MinhaClasse
>>>> >   {
>>>> >     var copia:MinhaClasse = new MinhaClasse();
>>>> >
>>>> >     copia.nome = this.nome;
>>>> >     copia.idade = this.idade;
>>>> >     return copia;
>>>> >   }
>>>> >
>>>> > }
>>>> >
>>>> > Aí no teu grid, você poderia fazer:
>>>> >
>>>> > (grid.dataProvider as ArrayCollection).addItem(itemADuplicar.clone());
>>>> >
>>>> > E, pronto, você tem um item duplicado na sua estrutura de dados.
>>>> >
>>>> > Note, obviamente, que se sua classe tiver um atributo/propriedade que
>>>> seja
>>>> > não primitivo, você deverá clonar este elemento também, ou seja,
>>>> supondo que
>>>> > NOME seja uma classe sua composta pelos campos nome e sobrenome. Não
>>>> > adiantaria fazer copia.nome = this.nome porque, novamente, você
>>>> estaria
>>>> > apenas duplicando o ponteiro. Neste caso o mesmo esquema deveria ser
>>>> > adotado: copia.nome = this.nome.clone();
>>>> >
>>>> > 2010/1/22 Lorenzi <mlorenz...@gmail.com>
>>>> >
>>>> >
>>>> >
>>>> >
>>>> >
>>>> > > Boa tarde.
>>>> >
>>>> > > Seguinte minha duvida é essa tenho um  datagrid com tres colunas
>>>> nome,
>>>> > > idade, duplicar(este sera um botao para o cara clicar) . Minha
>>>> duvida
>>>> > > é como eu faço para clicar no duplicar e ele criar uma nova linha no
>>>> > > grid, copiando a linha clicada.
>>>> >
>>>> > > /*normal*/
>>>> > > Nome            idade      Duplicar
>>>> > > Marcelo           23            +
>>>> >
>>>> > > /*duplicado*/
>>>> > > Nome            idade      Duplicar
>>>> > > Marcelo           23            +
>>>> > > Marcelo           23            +
>>>> >
>>>> > > /*duplicado*/
>>>> > > Nome            idade      Duplicar
>>>> > > Marcelo           23            +
>>>> > > Marcelo           23            +
>>>> > > Marcelo           23            +
>>>> >
>>>> > > desta maneira.
>>>> >
>>>> > > Grato.
>>>> >
>>>> > > --
>>>> > > Você recebeu esta mensagem porque está inscrito na lista "flexdev"
>>>> > > Para enviar uma mensagem, envie um e-mail para
>>>> flexdev@googlegroups.com
>>>> > > Para sair da lista, envie um email em branco para
>>>> > > flexdev-unsubscr...@googlegroups.com
>>>> > > Mais opções estão disponíveis emhttp://
>>>> groups.google.com/group/flexdev
>>>> >
>>>> > --
>>>> > []
>>>> > Júlio César Ködel G.
>>>>
>>>> --
>>>> Você recebeu esta mensagem porque está inscrito na lista "flexdev"
>>>> Para enviar uma mensagem, envie um e-mail para flexdev@googlegroups.com
>>>> Para sair da lista, envie um email em branco para
>>>> flexdev-unsubscr...@googlegroups.com
>>>> Mais opções estão disponíveis em http://groups.google.com/group/flexdev
>>>>
>>>
>>>
>>>
>>> --
>>> []
>>> Júlio César Ködel G.
>>>
>>> --
>>> Você recebeu esta mensagem porque está inscrito na lista "flexdev"
>>> Para enviar uma mensagem, envie um e-mail para flexdev@googlegroups.com
>>> Para sair da lista, envie um email em branco para
>>> flexdev-unsubscr...@googlegroups.com
>>> Mais opções estão disponíveis em http://groups.google.com/group/flexdev
>>>
>>
>>
>>  --
>> Você recebeu esta mensagem porque está inscrito na lista "flexdev"
>> Para enviar uma mensagem, envie um e-mail para flexdev@googlegroups.com
>> Para sair da lista, envie um email em branco para
>> flexdev-unsubscr...@googlegroups.com
>> Mais opções estão disponíveis em http://groups.google.com/group/flexdev
>>
>
>
>
> --
> []
> Júlio César Ködel G.
>
> --
> Você recebeu esta mensagem porque está inscrito na lista "flexdev"
> Para enviar uma mensagem, envie um e-mail para flexdev@googlegroups.com
> Para sair da lista, envie um email em branco para
> flexdev-unsubscr...@googlegroups.com
> Mais opções estão disponíveis em http://groups.google.com/group/flexdev
>



-- 
José Alexandre D'Abruzzo Pereira

-- 
Você recebeu esta mensagem porque está inscrito na lista "flexdev"
Para enviar uma mensagem, envie um e-mail para flexdev@googlegroups.com
Para sair da lista, envie um email em branco para 
flexdev-unsubscr...@googlegroups.com
Mais opções estão disponíveis em http://groups.google.com/group/flexdev

Responder a