Ir para conteúdo
Fórum Script Brasil
  • 0

Passar objeto por copia e não como ponteiro


darth_ivan

Pergunta

5 respostass a esta questão

Posts Recomendados

  • 0

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 rs

Da pra entender mais ou menos mas o ideal é você explicar o que você quer fazer...

abraços

Link para o comentário
Compartilhar em outros sites

  • 0

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???

Link para o comentário
Compartilhar em outros sites

  • 0

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ência

Se 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 final

exemplo:

ABC( (3+6) * 3-1);

ABC( ArcTan(6) div 3);

ABC( inc(I));

deu pra entender ?

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

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

Link para o comentário
Compartilhar em outros sites

  • 0

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.

Link para o comentário
Compartilhar em outros sites

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.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      651,9k
×
×
  • Criar Novo...