【发布时间】:2020-09-17 03:39:34
【问题描述】:
德尔福 10.3
我正在尝试设置一个 TClientDataSet 以在我的测试中使用,但添加字段后,Name 和 DisplayText 属性为空,并且 DisplayLabel 属性具有 FieldName 属性。
class function TTestDataSetFactory.CreateTrainingCategoriesDataSet: TDataSet;
var
DS : TClientDataSet;
FMaxID : TAggregate;
begin
DS := TClientDataSet.Create(nil);
DS.Name := 'training_categories';
with DS.FieldDefs do
begin
Add('id', ftInteger, 0, True);
Add('category', ftString, 50, True);
Add('description', ftString, 50, False);
end;
//Create function adds the aggregate to the DataSet. No more action needed
FMaxID := TAggregate.Create(DS.Aggregates, DS);
FMaxID.Expression := 'Max(id)';
FMaxID.Active := True;
FMaxID.Visible := True;
FMaxID.DisplayName := 'MaxID';
FMaxID.AggregateName := 'max_id';
DS.CreateDataSet;
DS.StoreDefs := True;
DS.Open;
DS.Fields[0].Name := 'id';
DS.Fields[1].Name := 'category';
DS.Fields[2].Name := 'description';
DS.Fields[0].DisplayLabel := 'ID';
DS.Fields[1].DisplayLabel := 'Category';
DS.Fields[2].DisplayLabel := 'Description';
DS.AggregatesActive := True;
DS.Close;
//Setup AutoInc, performed in AfterInsert event, with ID field (0)
DS.AfterInsert := IncIdAtIndex0;
Result := DS;
end;
只是一个快速测试:
procedure TTestDataSetFactoryTest.CreateTrainingCategoriesDataSet_ReturnsCorrectDataSet;
var
DS : TDataset;
begin
DS := TTestDataSetFactory.CreateTrainingCategoriesDataSet;
DS.Open;
CodeSite.Send( Format('Field 0 DisplayLabel = %s',[DS.Fields[0].DisplayLabel]) );
CodeSite.Send( Format('Field 0 Name = %s',[DS.Fields[0].Name]) );
CodeSite.Send( Format('Field 0 DisplayText = %s',[DS.Fields[0].DisplayText]) );
Assert.AreEqual(3, DS.Fields.Count);
Assert.AreEqual('id', DS.Fields[0].Name);
Assert.AreEqual('category', DS.Fields[1].Name);
Assert.AreEqual('description', DS.Fields[2].Name);
Assert.AreEqual('ID', DS.Fields[0].DisplayName);
Assert.AreEqual('Category', DS.Fields[1].DisplayName);
Assert.AreEqual('Description', DS.Fields[2].DisplayName);
DS.Close;
end;
Assert.AreEqual(3, DS.Fields.Count);通过,但所有 Name 和 DisplayText 属性均失败。
Field[0] 记录这个
字段 0 DisplayLabel = id
字段 0 名称 =
字段 0 显示文本 =
将字段属性分配添加到测试中,一切都通过了,因此字段存在。
有谁知道为什么在创建数据集时没有设置字段属性?田野在那里。 DataSet 的指定名称也可以。
提前致谢
加里
【问题讨论】:
-
Close()DS 字段被销毁后。您必须在Open()之后定义DisplayLabel。 -
Fwiw,DS.AfterInsert 不是处理 autoinc 行为的正确方法 - OnNewRecord 事件是处理此问题的正确位置。
-
另外,afaik 从来不需要间接创建 FieldDef 来反过来创建 TField。您可以直接在代码中创建 TField,并给它们一个 TPersistent Owner 使它们也可以持久化。简单。
-
MartynA 感谢 OnNewRecord 提示。当我想在我的程序中实际使用 AfterInsert 时,我会遇到麻烦。
标签: delphi tclientdataset