GARANTIR DESCONTO

Fórum Sobre função NewInstance... #277445

15/04/2005

0

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


Bruno Belchior

Bruno Belchior

Responder

Posts

15/04/2005

Massuda

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?


Responder

Gostei + 0

15/04/2005

Marioguedes

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


Responder

Gostei + 0

15/04/2005

Beppe

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.


Responder

Gostei + 0

15/04/2005

Bruno Belchior

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


Responder

Gostei + 0

15/04/2005

Beppe

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.


Responder

Gostei + 0

15/04/2005

Massuda

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.


Responder

Gostei + 0

15/04/2005

Marioguedes

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.


Responder

Gostei + 0

15/04/2005

Bruno Belchior

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


Responder

Gostei + 0

15/04/2005

Massuda

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:


Responder

Gostei + 0

15/04/2005

Beppe

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.


Responder

Gostei + 0

16/04/2005

Bruno Belchior

[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...


Responder

Gostei + 0

17/04/2005

Bon Jovi

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;



Responder

Gostei + 0

17/04/2005

Bon Jovi

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;



Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar