gpt4 book ai didi

delphi - 在代码中设置 ADT 字段

转载 作者:行者123 更新时间:2023-12-02 03:05:10 25 4
gpt4 key购买 nike

我正在试验一个简单的 ClientDataSet 项目,该项目使用名为 Address 的 TADTField,其中包含两个子字段 Line1 和 City,这两个子字段都是字符串,大小为 20。CDS 连接到 DBGrid 和 DBNavigator。

如果我在对象检查器中使用 TFieldDefs 和 ADT 字段的 ChildDefs 属性设置 CDS,则该项目可以正常编译和执行。

但是,如果我尝试在代码中设置 ATD 字段及其子字段,则会遇到两个问题:

  • 与我使用 FieldDefs 方法时不同,ATD“单元格”不会出现在 DBGrid 中,因此 Line1 和 City 子字段不会显示在其中。相反,它们显示为普通字段并且是重复的。有一个“Line1”列,然后是一个“City”列,然后是另一个“Line1”列...

  • 当我关闭表单时,我在对 TFields.Destroy 的第二次(?)调用中得到“双重释放”AV。

显然我做错了什么,但我看不出它是什么。

这是我的代码:

procedure TForm1.FormCreate(Sender: TObject);
var
ADTField : TADTField;
Field : TField;
begin
// at this point, the clientDataSet has no TFields or TFieldDefs
Field := TIntegerField.Create(nil);
Field.FieldName := 'ID';
Field.DataSet := ClientDataset1;

ADTField := TADTField.Create(nil);
ADTField.FieldName := 'Address';
ADTField.DataSet := ClientDataset1;

Field := TStringField.Create(nil);
Field.FieldName := 'Line1';
Field.Size := 20;
Field.DataSet := ClientDataset1;
ADTField.Fields.Add(Field);

Field := TStringField.Create(nil);
Field.FieldName := 'City';
Field.Size := 20;
Field.DataSet := ClientDataset1;
ADTField.Fields.Add(Field);

ClientDataset1.CreateDataSet;
ClientDataset1.Insert;
ClientDataset1.FieldByName('ID').AsInteger := 1;
try
ADTField.Fields.FieldByName('Line1').AsString := '1, Railway Cuttings';
ADTField.Fields.FieldByName('City').AsString := 'London';
except
end;
ClientDataset1.Post;
end;

这就是该项目的全部代码。我正在使用 D7。

最佳答案

我记得当我第一次尝试 ADT 字段时,被类似的事情所困扰:虽然 IDE 中的 TFieldDefs 编辑器有一个明显的方法将子 FieldDef 添加到 TADTField,但 IDE 的 TFields 编辑器中没有对应的方法。

无论如何,我认为您没有完全正确地“养育”您希望成为 ADT 子级的两个字段。您需要通过字段本身来设置其 ParentField 属性,而不是调用 ADTField.Fields.Add:

  Field := TStringField.Create(ClientDataset1);
Field.FieldName := 'Line1';
Field.Size := 20;
Field.DataSet := ClientDataset1;
// ADTField.Fields.Add(Field);
Field.ParentField := ADTField;

顺便说一句,如果您要设置 TFields 而不是 TFieldDefs,那么您将在 IDE 中执行此操作。您可以使用 TFields 编辑器以普通方式创建 Line1City 字段,然后在 OI 上依次选择它们并设置它们的 ParentField 属性(property)。我想您会发现它们和地址字段将正确显示在您的网格中,并且关闭时的 AV 将消失。

关于delphi - 在代码中设置 ADT 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39934427/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com