Sobre função NewInstance...
pessoal como se utiliza a função [b:89b0f1aa33]NewInstance[/b:89b0f1aa33]...
Bruno Belchior
Curtidas 0
Respostas
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
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?
Se você precisa de algo parecido podemos trocar mais idéias a respeito.
[]´s
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
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.
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
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
15/04/2005
Uma cópia dita ´shallow´ pode ser feita assim:
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.
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
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
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.
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
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
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
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
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
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
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