1

我正在尝试编写一个从 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;
4

3 回答 3

4

Try creating your field using its fieldtype. For example, TIntegerField.

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

That should work.

It will be available to controls but not the Fields Editor.

于 2009-11-17T22:15:40.487 回答
1

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

您是否考虑过另一种方法?(编写一个具有公共属性的组件,允许它连接到数据集或数据源,并将所有框架逻辑放入该组件中)。不理会数据集类。

您是否真的需要在 OOP 术语中建立“IS A”关系,或者如果您考虑“有一个到数据集的链接”,您的代码实际上会更干净吗?

于 2009-11-18T14:08:18.973 回答
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;
于 2009-11-17T21:53:15.277 回答