为什么ClientDataSet后代的字段在设计时不出现?

时间:2009-11-17 21:06:59

标签: delphi components tclientdataset

我正在尝试编写一个继承自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 个答案:

答案 0 :(得分:4)

尝试使用其fieldtype创建字段。例如,TIntegerField。

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

这应该有效。

它可用于控件但不适用于字段编辑器。

答案 1 :(得分:1)

完全 未经测试,但您可能应该添加到FieldDefs:

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

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

添加FieldDef后,您可能还需要添加对CreateDataSet的调用:

// After above code...
inherited CreateDataSet;

答案 2 :(得分:1)

我有一种感觉,在这种情况下,您可能会违反VCL组件设计时的设计意图。字段通常由将表对象放在数据模块上的人定义,然后将数据集属性设置为特定的SQL或其他表,并从该表中选择字段,而不是具有固定字段集的组件,这可能是当前架构支持的问题,即使你有一个修复,你确定这种方法没有问题吗?

你有没有想过另一种方法? (编写具有公共属性的组件,允许它连接到数据集或数据源,并将所有框架逻辑放在该组件中)。保留数据集类。

你真的需要在OOP术语中建立一个“IS A”关系,或者如果你考虑“有一个指向数据集的链接”,你的代码实际上会更清晰吗?