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