Sobre função NewInstance...

Delphi

15/04/2005

pessoal como se utiliza a função [b:89b0f1aa33]NewInstance[/b:89b0f1aa33]...


Bruno Belchior

Bruno Belchior

Curtidas 0

Respostas

Massuda

Massuda

15/04/2005

TObject.NewInstance está relacionado com alocação e inicialização da memória utilizada por um objeto, sendo utilizada internamente no processo de criação de um objeto. Que tipo de uso você tem em mente?


GOSTEI 0
Marioguedes

Marioguedes

15/04/2005

Olá, eu uso NewInstance em conjunto com uma referência de classe. Como a referência de classe não é a classe em si, não me é disponibilizado os parâmetros do constructor da mesma.

Confuso?

      _acao := TMCTAcao(ACOES[a].NewInstance);

     //onde:
     //_acao -> Variável
     //TMCTAcao -> Efetuando um TypeCast para a classe mãe
     //ACOES[a] -> array de classes (Graças a uma referência de classe, tipo TClass)
     //NewInstance -> conforme explicação do Massuda


Se você precisa de algo parecido podemos trocar mais idéias a respeito.

[]´s


GOSTEI 0
Beppe

Beppe

15/04/2005

marioguedes, prefira usar o construtor da classe.

NewInstance <> [b:c40dac4d29]constructor[/b:c40dac4d29]

Ao chamar NewInstance diretamente, código que consta nos construtores não são executados. Se por acaso o construtor tomar argumentos e necessite deles, pode deixar a classe em estado desconhecido.


GOSTEI 0
Bruno Belchior

Bruno Belchior

15/04/2005

na verdade eu precizo fazer uma cópia do meu objeto para um novo, mas realmente uma cópia e não uma referência a esse mesmo...


GOSTEI 0
Beppe

Beppe

15/04/2005

Uma cópia dita ´shallow´ pode ser feita assim:

Copia := Original.ClassType.Create;
Move(Pointer(Original)^, Pointer(Copia)^, Copia.InstanceSize);


Os objetos internos de Original não serão duplicados tb, aí seria bem complicado. O trecho que postei acima eu nunca usei, por falta de necessidade. Use com cautela.


GOSTEI 0
Massuda

Massuda

15/04/2005

na verdade eu precizo fazer uma cópia do meu objeto para um novo, mas realmente uma cópia e não uma referência a esse mesmo...
Talvez [url=http://forum.clubedelphi.net/viewtopic.php?t=57120]este tópico[/url] seja útil para você.

Lembro que recentemente você postou sobre copiar um TClientDataSet em um TCustomClientDataSet... como não testei, não respondi seu post, mas acho que existe um problema ao copiar uma classe filha para sua classe mãe, pois há risco de perder informação no processo; mas, como disse, não testei isso, portanto não tenho certeza.


GOSTEI 0
Marioguedes

Marioguedes

15/04/2005

Beep, obrigado pelo conselho, mas meu projeto possui caracteristicas tais que tenho que lançar mão deste artifício. Os riscos mencionados são calculados pois as classes envolvidas são criados por mim.


brunovicenteb, talvez o link abaixo seja exatamente o que procuras:

http://www.blong.com/Conferences/BorConUK98/DelphiRTTI/CB140.htm

Entre vários exemplos, mostra como copiar um objeto para outro.


GOSTEI 0
Bruno Belchior

Bruno Belchior

15/04/2005

massuda e se fosse no caso um TClientDataSet para um TClientDataSet ou seja classes iguais... seria possível? pois o que me interessa mesmo é o ResultSet do ClientDataSet...


GOSTEI 0
Massuda

Massuda

15/04/2005

se fosse no caso um TClientDataSet para um TClientDataSet ou seja classes iguais... seria possível?
Como eu escrevi, não testei. Sinto dizer isso, mas tá com jeito que é mais fácil você testar do que eu :wink:


GOSTEI 0
Beppe

Beppe

15/04/2005

massuda e se fosse no caso um TClientDataSet para um TClientDataSet ou seja classes iguais... seria possível? pois o que me interessa mesmo é o ResultSet do ClientDataSet...

Aquele código que eu passei terá problemas ao liberar os objetos da memória, a não ser que vc limpe as referências internas de um deles.

No caso do dataset cliente, é melhor vc especificar o que vc quer. É que o CDS tem um método que pode lhe ser útil, CloneCursor. Após chamr ele, ele compartilhará os dados de um CDS com o outro.


GOSTEI 0
Bruno Belchior

Bruno Belchior

15/04/2005

[quote:37ceeab588=´brunovicenteb´]massuda e se fosse no caso um TClientDataSet para um TClientDataSet ou seja classes iguais... seria possível? pois o que me interessa mesmo é o ResultSet do ClientDataSet...

Aquele código que eu passei terá problemas ao liberar os objetos da memória, a não ser que vc limpe as referências internas de um deles.

No caso do dataset cliente, é melhor vc especificar o que vc quer. É que o CDS tem um método que pode lhe ser útil, CloneCursor. Após chamr ele, ele compartilhará os dados de um CDS com o outro.[/quote:37ceeab588]tenho que receber alguns dados que estão no CDS e depois manipulá-los em outro lugar sem poder alterar o estado do CDS anterior entende, vou montar uma instrução Update com esse ´novo´ CDS mas sem poder alterar o valor do state do CDS original...


GOSTEI 0
Bon Jovi

Bon Jovi

15/04/2005

Nao sei o q quer exatamente na pratica pro usuario. Mas pra copiar um ClientDataSet:

procedure CopiaClientDataSet(Origem, Destino: TClientDataSet);
var
  Stream: TMemoryStream;
begin
  if (not Assigned(Destino)) or (not Assigned(Origem)) then
    Exit;

  Stream := TMemoryStream.Create;
  Origem.SaveToStream(Stream);
  Stream.Position := 0;
  Destino.LoadFromStream(Stream);

  FreeAndNil(Stream);
end;



GOSTEI 0
Bon Jovi

Bon Jovi

15/04/2005

procedure CopiaDataSet(Origem, Destino: TClientDataSet);
var
  Stream: TMemoryStream;
begin
  if (not Assigned(Destino)) or (not Assigned(Origem)) then
    Exit;

  Stream := TMemoryStream.Create;
  try
    Origem.SaveToStream(Stream);
    Stream.Position := 0;
    Destino.LoadFromStream(Stream);
  finally
    FreeAndNil(Stream);
  end;
end;



GOSTEI 0
POSTAR