我正在尝试编写一个继承自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;
答案 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”关系,或者如果你考虑“有一个指向数据集的链接”,你的代码实际上会更清晰吗?