Fórum Instanciar objeto a partir de outro #337841
14/02/2007
0
Bom dia,
Estou precisando instanciar um DataSet(TZMySqlQuery) novo a partir de um DataSet(TZMySqlQuery) já existente e configurado que se encontra em um DM(Data Module).
Pra isso tentei o seguinte:
Na linha:
Estava querendo que todas as configurações (Propriedades e eventos) que estão no DataSet(TZMySqlQuery) que se encontra criado no Data Module, fossem copiadas para o novo DataSet(TZMySqlQuery) instanciado. Mas ao invés disso o novo DataSet(TZMySqlQuery) está apontando para o DataSet já existente (Ponteiro) e qualquer alteração que eu faça no DataSet instanciado atinge também o DataSet original...
Qual seria a forma correta de recuperar as informações do DataSet já existente e passar para o novo DataSet instanciado?
Obrigado!
[]´s
Estou precisando instanciar um DataSet(TZMySqlQuery) novo a partir de um DataSet(TZMySqlQuery) já existente e configurado que se encontra em um DM(Data Module).
Pra isso tentei o seguinte:
... var dDataSet : TZMySqlQuery; begin ... with dDataSet do begin dDataSet := TZMySqlQuery.Create(nil); dDataSet := DM.zQueryMaster; Close; ParamByName(´IDGRUPO´).AsInteger := 1; Open; end;
Na linha:
dDataSet := DM.zQueryMaster;
Estava querendo que todas as configurações (Propriedades e eventos) que estão no DataSet(TZMySqlQuery) que se encontra criado no Data Module, fossem copiadas para o novo DataSet(TZMySqlQuery) instanciado. Mas ao invés disso o novo DataSet(TZMySqlQuery) está apontando para o DataSet já existente (Ponteiro) e qualquer alteração que eu faça no DataSet instanciado atinge também o DataSet original...
Qual seria a forma correta de recuperar as informações do DataSet já existente e passar para o novo DataSet instanciado?
Obrigado!
[]´s
Polo
Curtir tópico
+ 0
Responder
Posts
15/02/2007
Marco Salles
Código:
dDataSet := DM.zQueryMaster;
...Mas ao invés disso o novo DataSet(TZMySqlQuery) está apontando para o DataSet já existente (Ponteiro) e qualquer alteração que eu faça no DataSet instanciado atinge também o DataSet original...
Na realidade , como voce mesmo deve ter notado , voce ao Fazer a Atribuição , voce perde a referencia ao Objeto criado , e em Lugar Disso , aponta para o mesmo Lugar na memoriá do Objeto DM.zQueryMaster
A maneira de se fazer isto é usando o Método Assign , desde que devidamente implementado pela classe descedente.. O problema é que Todas as Classes VCL que herdam da TPersistent tem o Método Assignd , porem a Maioria que Herdam Da TComponent não Há Implemetam , Fazendo Aparecer uma Exceção a Se Chamado..
Existe também , uma tecnica denominada SerializaçãoDe Objetos , que pode se utilizada entre outros Recursos para persistir Objetos.
Eu acho que o seu caminhop não deve fugir a essas Duas Linhas de Raciocineo , salvo método próprio do componente que eu particularmente desconheço por não utiliza-lo
Responder
Gostei + 0
15/02/2007
Polo
Consegui resolver o problema da seguinte maneira:
Recuperando todas as propriedades e métodos que estão no dDataSet2 e passando para o dDataSet1 tudo isso por referência e agora está tudo ok!
:D
procedure TfrmPrincipal.preenchePropriedades(var dDataSet1 : TZMySqlQuery; var dDataSet2 : TZMySqlQuery); var listaPropriedades : TPropList; qtd, n : Integer; begin try qtd := GetPropList(TypeInfo(TZMySqlQuery), tkAny, @listaPropriedades); for n := 0 to qtd - 2 do begin if (listaPropriedades[n]^.PropType^.Kind <> tkMethod) and (listaPropriedades[n]^.PropType^.Kind <> tkClass) then begin SetPropValue(dDataSet1, listaPropriedades[n]^.Name,GetPropValue(dDataSet2, listaPropriedades[n]^.Name)); end else if (listaPropriedades[n]^.PropType^.Kind = tkMethod) then begin SetMethodProp(dDataSet1, listaPropriedades[n]^.Name,GetMethodProp(dDataSet2, listaPropriedades[n]^.Name)); end else if (listaPropriedades[n]^.PropType^.Kind = tkClass) then begin SetOrdProp(dDataSet1, listaPropriedades[n]^.Name,GetOrdProp(dDataSet2, listaPropriedades[n]^.Name)); end; end; except on e: Exception do begin ShowMessage(IntToStr(n)); end; end; end;
Recuperando todas as propriedades e métodos que estão no dDataSet2 e passando para o dDataSet1 tudo isso por referência e agora está tudo ok!
:D
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)