我上周观察到我没有想到的,下面将会描述.我很好奇为什么会发生这种情况.它是TDataSet类内部的东西,TDBGrid的工件还是其他东西?
打开的ClientDataSet中的字段顺序发生变化.具体来说,我通过使用FieldDefs定义其结构后调用CreateDatatSet在代码中创建了一个ClientDataSet.此ClientDataSet结构中的第一个字段是名为StartOfWeek的Date字段.只有片刻之后,我还写过的代码,其中假设StartOfWeek字段处于零位置,ClientDataSet.Fields [0]失败,因为StartOfWeek字段不再是ClientDataSet中的第一个字段.
经过一番调查,我了解到,ClientDataSet中的每一个字段都可能在给定的时刻出现在创建ClientDataSet时与原始结构不同的位置.我不知道这可能会发生,谷歌搜索也没有提到这个效果.
发生了什么不是魔术这些字段本身并没有改变位置,也没有根据我在代码中所做的任何改变.导致这些字段在ClientDataSet中实际出现更改位置的原因是,用户已经更改了ClientDataSet所附加的DbGrid中的列(当然是通过DataSource组件)的顺序.我在Delphi 7,Delphi 2007和Delphi 2010中复制了这个效果.
我创建了一个非常简单的Delphi应用程序,演示了这种效果.它由单个表单与一个DBGrid,DataSource,两个ClientDataSet和两个按钮组成.此表单的OnCreate事件处理程序如下所示
procedure TForm1.FormCreate(Sender: TObject);
begin
with ClientDataSet1.FieldDefs do
begin
Clear;
Add('StartOfWeek',ftDate);
Add('Label',ftString,30);