Pergunta

Eu estou tentando escrever um componente que herda TClientDataset.Na criação do componente em tempo de design que eu quero para instanciar uma lista de campos comuns que são usados dentro do meu quadro.O código abaixo irá executar sem erros e o campo será apresentado em tempo de execução, mas não a tempo de design.Alguém pode me ajudar?Eu tenho certeza que é algo trivial!

{ InheritedClientDataset }

constructor InheritedClientDataset.Create(AOwner: TComponent);
var
  Field : TField;
begin
  inherited;

  Field := TField.Create(self);
  Field.Name := 'ATestField';
  Field.FieldName := 'Test';
  Field.SetFieldType(ftInteger);
  //Field.DataType := ftInteger;
  Field.Size := 0;
  Field.FieldKind := fkData;

  self.Fields.Add(Field);
end;
Foi útil?

Solução

Tente criar o seu campo usando sua fieldtype.Por exemplo, TIntegerField.

  MyField := TIntegerField.Create(Self);
  MyField.FieldName := 'MyFieldName';
  MyField.DataSet := Self;
  MyField.Name := Self.Name + '_' + MyField.FieldName;

Que deve funcionar.

Ele vai estar disponível para controles, mas não os Campos de Editor.

Outras dicas

Totalmente não testado, mas você, provavelmente, deve ser a adição de FieldDefs em vez disso:

with FieldDefs.AddFieldDef do
begin
  DataType := ftInteger;
  Name := 'Field1';
end;

with FieldDefs.AddFieldDef do
begin
  DataType := ftString;
  Size := 25;
  Name := 'Field2';
end;

Você pode também adicionar uma chamada para CreateDataSet após o FieldDefs são adicionados:

// After above code...
inherited CreateDataSet;

Tenho a sensação de que em casos como este, você pode estar indo contra o projeto intenção da VCL componente de tempo de estruturação.Os campos normalmente são definidas por alguém que coloca um objecto de tabela em um módulo de dados e, em seguida, defina as propriedades do conjunto de dados para um determinado SQL ou outra tabela e seleciona os campos dessa tabela, em vez de um componente com um conjunto fixo de campos, o que poderia ser algo problemático para a atual arquitetura para suportar, mesmo que você tenha uma correcção, tem a certeza de que não existem problemas com essa abordagem?

Você já pensou em uma abordagem alternativa?(Escrever um componente com uma propriedade pública que permite que ele seja ligado a um conjunto de dados ou fonte de dados e coloca toda a sua estrutura lógica, em que o componente).Deixe a classe dataset sozinho.

Você realmente PRECISA fazer um "É UMA" relação em termos OOP, ou seria o seu código, na verdade, ser limpo, se você considerados "TEM UM link para um conjunto de dados" em vez disso?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top