GARANTIR DESCONTO

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

Polo

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:

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

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

Aceitar