2014-10-01 29 views
2

我有一个TClientDataSet耦合到一个查询,在Fields编辑器中定义了所有的字段。如何销毁运行时定义的TClientDataSet TFields?

在运行时我添加三个fkInternalCalc字段:

class procedure TTaskIndexCalculator.Setup(AClientDataSet: TClientDataSet); 
var 
    lCalcIntField : TIntegerField; 
    lCalcStrField : TStringField; 
begin 
    CDS := AClientDataSet; 
    CDS.DisableControls; 
    CDS.Close; 
    lCalcIntField := TIntegerField.Create(CDS); 
    with lCalcIntField do 
    begin 
     Name := 'CalcFldLevel'; 
     FieldKind := fkInternalCalc; 
     FieldName := 'TT_LEVEL'; 
     DataSet := CDS; 
    end; 
    lCalcIntField := TIntegerField.Create(CDS); 
    with lCalcIntField do 
    begin 
     Name := 'CalcFldDateOrder'; 
     FieldKind := fkInternalCalc; 
     FieldName := 'TT_DATEORDER'; 
     DataSet := CDS; 
    end; 
    lCalcStrField := TStringField.Create(CDS); 
    with lCalcStrField do 
    begin 
     Name := 'CalcFldSortString'; 
     FieldKind := fkInternalCalc; 
     FieldName := 'TT_SORTSTRING'; 
     Size := 200; 
     DataSet := CDS; 
    end; 
    CDS.Open; 
end; 

我做一些计算使用这些附加字段,更新一个 '真实' 的字段,然后我做:

class procedure TTaskIndexCalculator.TearDown; 
begin 
    with CDS do 
    begin 
     Close; 
     Fields[CDS.FieldCount-1].Free; 
     Fields[CDS.FieldCount-1].Free; 
     Fields[CDS.FieldCount-1].Free; 
     Filter := ''; 
     Filtered := false; 
     Open; 
     EnableControls; 
    end; 
end; 

然而,在最后的'Open'声明中,我得到了TT_SORTSTRING字段的“not found”错误(可能其他两个错误也是错误的)。

TClientDataSet连接到TDBGrid。

我在删除三个字段(或更早)时做错了什么?

阅读the excellent Cary Jensen article没有帮助我;我的设计时间和运行时间字段混杂不清。

+0

我想你NEDD到'CDS.Fields.Remove(lCalcIntField)的调用;'等 – 2014-10-01 14:24:14

+0

@Hugh在这种情况下,我的设置与重用lCalcIntField会很错了;-)是吗? – 2014-10-01 14:30:45

+0

我明白你的意思了 - 这是有点错误,是的,但只在理论上,风格上......我的观点是你可能需要'删除()'字段。虽然我看到你有答案。 – 2014-10-01 14:33:57

回答

1

Awwww,一个这些东西;-)

我不仅在计算过程中与过滤器设置播放,而且还与物业IndexFieldNames。最后一个IndexFieldNames内容包含TT_SORTSTRING。
我TearDown中常规必须重置太:

IndexFieldNames := '';