2014-10-01 27 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 := '';