Criação de campos em runtime - AV ao atribuir dados

Delphi

14/01/2005

Olá

Tenho um ClientDataSet no qual estou criando campos em tempo de execução:

     with cds do
     begin
          Fields.Add(TStringField.Create(cds));
          Fields[0].FieldName := ´CAMPO1´;

          Fields.Add(TIntegerField.Create(cds));
          Fields[1].FieldKind := fkCalculated;
          Fields[1].FieldName := ´CAMPO2´;
          Fields[1].Calculated := True;
     end;

Tenho um método em que eu vou atribuir os valores do ClientDataSet via OLE, mas isso não deve dar problema.
cds.FieldByName(´CAMPO1´).AsString := oleDados.Item[i].ChildNodes.Item[j].Text

O que acontece eh que quando vou atribuir, ele dá um Access Violation...
Debugando, descobri que o AV acontece por causa do AsString! No Inspector, soh o cds.FieldByName(´CAMPO1´) ainda é um objeto, mas o AsString dá erro!

Quando faço isso em tempo de desenv. ele não dá erro... alguém sabe se eu estou criando os campos erradamente?
PS. O erro não deve ser por causa do campo calculado, pois ele acontece no primeiro campo

Obrigado
Até+


Paulo_amorim

Paulo_amorim

Curtidas 0

Respostas

Vinicius2k

Vinicius2k

14/01/2005

Olá Amorim !

Eu não posso garantir que a sua forma esteja incorreta, mas, se ajuda, esta é a forma como eu faço isto :
with cds do
begin
  Close;
  { Criando os campos}
  with FieldDefs do
  begin
    Clear;
    Add(´CAMPO1´, ftString, 40, False);
    //Outros...
  end;
  // Aqui um possível laço alterando propriedades dos TFields recem criados.
  CreateDataSet;
  // Aqui a atribuição dos valores.
end;

Acho que se vc adicionar os TFields pelo método Add de FieldDefs e depois de adicioná-los, atribuir suas propriedades e dar-lhes valores, vc não terá problemas.

Não tive como testar. Se isto não resolver, poste novamente... :wink:

T+


GOSTEI 0
Paulo_amorim

Paulo_amorim

14/01/2005

Olá

Creio que omiti certos fatos que talvez tenham mascarado o real problema, afinal.

Tenho um componente herdado de TClientDataSet que transforma um XML em DataSet... e num método ele faz toda essa parte de limpar e adicionar os FieldDefs, fazendo o Parsing no XML. Meu grande problema é exatamente esse: eu quero um campo que não está no XML!
Por isso, se eu adicionar um FieldDef, ele será eliminado nessa rotina...

Eu tentei a criação de TFields em tempo de Design e voilá! ele funciona normal... fica vazio, claro, mas funciona
Assim, parti para tempo de execução (já que pretendo fazer algo mais genérico, mais tarde) mas me deparei com esse problema.

Segunda feira volto a pensar nisso. Por enquanto faço testes em design.
Qualquer ajuda será bem vinda

Obrigado 2k, você já me deu certas idéias.

Até+


GOSTEI 0
POSTAR