darth_ivan Postado Novembro 29, 2007 Denunciar Share Postado Novembro 29, 2007 Pessoal, vocês sabem como posso passar um objeto por copia e não por ponteiro. Ou ainda, existe algum construtor de copias no delphi????? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Churc Postado Novembro 29, 2007 Denunciar Share Postado Novembro 29, 2007 Que?ahahuahua ivan tem coisas fera que só você entende da maneira que escreve...porque as outras pessoas nem sequer imaginam o que você está fazendo rsDa pra entender mais ou menos mas o ideal é você explicar o que você quer fazer...abraços Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 darth_ivan Postado Novembro 29, 2007 Autor Denunciar Share Postado Novembro 29, 2007 Meu problema é o seguinte:Estou passando um ponteiro de um objeto para uma thread. Porém o valor desse ponteiro está inacessível dentro da thread. Acho que isso acontece porque a thread não tem acesso aos endereos de mémoria da minha applicação. Por isso quero copiar esse objeto para a thread e não passá-lo como ponteiro.vocês me entenderam??? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Novembro 29, 2007 Denunciar Share Postado Novembro 29, 2007 vamos ver...Imaginemos q você tem uma variável global... e você passa ela como parâmetro em uma função. Se você passar por valor, ele vai criar uma cópia dessa variável na memoria, e tudo que você mexer nela, você vai estar alterando essa cópia, e não a variavel original... Se você passar por referência, a função sempre vai apontar para posição original da variavel na memória, e tudo que você fizer com aquela variável dentro da função, vai alterar sua variável original... Toda a passagem de objetos como parâmetros para métodos é feita por referênciaSe a passagem for feita por referência, passamos apenas o endereço de memória do objeto, assim continuamos tendo apenas 1 objeto alocado. Uma alteração em qualquer característica do objeto é refletida em qualquer local do código onde este objeto seja utilizado. Passagem por valor (ou cópia) : Cria-se uma cópia do tipo passado. você terá duas variáveis na memória, do mesmo tipo e com os mesmos valores.Um parametro passado por valor atua como uma variavel local à procedure ou função na qual foi declarado. Uma particularidade é que ele já recebe um valor inicial, que é o valor colocado na chamada da procedure ou função.As mudanças de valor feitas um parametro deste tipo não refletem no parametro original.exemplo: Prodecure ABC( Arg1: integer); begin Arg1 := Arg1 * 2; end; var I : integer; begin I := 2; ABC(I); ChamaOutraProdecure(I); end;OBS: o valor de I n a linha ChamaOutraProdecure(I) é 2.O valor da variavel original não se alterou, porque a procedure trabalhou apenas com uma copia do valor que I possuia.Este tipo de parametro pode receber qualquer expressão que possua um valor unico como resultado finalexemplo:ABC( (3+6) * 3-1);ABC( ArcTan(6) div 3);ABC( inc(I));deu pra entender ?abraço Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Micheus Postado Novembro 30, 2007 Denunciar Share Postado Novembro 30, 2007 Muito boa explicação Jhonas.Toda a passagem de objetos como parâmetros para métodos é feita por referênciaÉ exatamente isto.Mas vamos tentar apresentar uma opção ao questionamento do colega darth_ivan:Estou passando um ponteiro de um objeto para uma thread. Porém o valor desse ponteiro está inacessível dentro da thread. Acho que isso acontece porque a thread não tem acesso aos endereos de mémoria da minha applicação. Por isso quero copiar esse objeto para a thread e não passá-lo como ponteiro.Faça o seguinte:- crie sua classe descendente da classe TThread:--> declare na sua classe a variável da classe de objeto que você pretende manipular;--> redeclare o constructor (Create) para inicializar (setar Nil) esta variável;--> redeclare o destructor (Destroy) para garantir a finalização desta variável (chamar Free se não for nil);--> crie um método onde você passa o seu objeto a ser copiado para a variável local à sua thread. Eventualmente você pode utilizar o próprio create para isto - fica a seu critério. No método, você deve "instânciar" sua variável e inicializá-la como o conteúdo do seu parâmetro (copiar). A classe TObject e seus descendentes, possui o método que supri esta necessidade - chama-se Assign. Vecê deve chamar este método a partir da sua variável, passando como parâmetro o objeto que você quer copiar. Se por algum motivo, não for possível utilizá-lo, então você terá que copiar as propriedades de um objeto em outro "na mão".- tenha sempre o cuidado de não reinstanciar sua variável, sem que antes ela seja desalocada;- sempre que a variável for desalocada em qualquer ponto da thread que não seja na sua destruição, é conveniente que você a inicialize com Nil, para que ao ser executado o Destroy, não ocorra uma exceção.É mais ou menos isto. Tente implementar neste conceito - deve funcionar.Abraços Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Roberto N Postado Março 27, 2015 Denunciar Share Postado Março 27, 2015 Para você fazer copy de um Objeto no delphi, se a classe do objeto derivar de TPersistent então faça: teuObjeto := TTeuObjeto.Create; teuObjeto.Assign(objetoOrigem); //não esqueça de fazer free depois de teuObjeto se necessário, pois agora você tem duas instâncias de TTeuObjeto... //Atenção para o caso de teu objeto ter em alguma de suas propriedades também objetos, entende ? objeto que possui objeto que possui objeto ... Se o objeto não derivar de TPersistent, então você terá que fazer teu próprio código de cópia, ou então se puder colocar a herança de TPersistent. Várias classes no Delphi de listas e streams já derivam de TPersistent, objetos destas classes possuem o método assign. Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
darth_ivan
Pessoal, vocês sabem como posso passar um objeto por copia e não por ponteiro. Ou ainda, existe algum construtor de copias no delphi?????
Link para o comentário
Compartilhar em outros sites
5 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.