Почему поля потомка ClientDataSet не появляются во время разработки? - PullRequest
1 голос
/ 18 ноября 2009

Я пытаюсь написать компонент, который наследуется от TClientDataset. При создании компонента во время разработки я хочу создать список общих полей, которые используются в моей структуре. Приведенный ниже код будет выполнен без ошибок, и поле появится во время выполнения, но не во время разработки. Может кто-нибудь мне помочь? Я уверен, что это что-то тривиальное!

{ 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;

Ответы [ 3 ]

4 голосов
/ 18 ноября 2009

Попробуйте создать свое поле, используя его тип поля. Например, TIntegerField.

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

Это должно сработать.

Он будет доступен элементам управления, но не редактору полей.

1 голос
/ 18 ноября 2009

У меня такое ощущение, что в подобных случаях вы можете идти вразрез с замыслом разработки времени разработки компонента VCL. Поля обычно определяются кем-то, кто помещает табличный объект в модуль данных, затем устанавливает свойства набора данных для конкретной таблицы SQL или другой таблицы и выбирает поля из этой таблицы, а не компонент с фиксированным набором полей, который может быть что-то проблематичное для поддержки текущей архитектуры, даже если у вас есть исправление, вы уверены, что с этим подходом проблем нет?

Думали ли вы об альтернативном подходе? (Напишите компонент с открытым свойством, позволяющим подключать его к набору данных или источнику данных, и поместите всю логику своей инфраструктуры в этот компонент). Оставьте класс набора данных в покое.

Действительно ли вам НУЖНО установить отношения "ЕСТЬ A" в терминах ООП, или ваш код на самом деле будет чище, если вместо этого вы подумали "У ВАС есть ссылка на набор данных"?

1 голос
/ 18 ноября 2009

Всего не проверено , но вам, вероятно, следует добавить вместо FieldDefs:

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

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

Возможно, вам также придется добавить вызов CreateDataSet после добавления FieldDefs:

// After above code...
inherited CreateDataSet;
...