2011-12-15 66 views
3

數據集鉤到一個網格有:使用TField.DisplayFormat格式化字符串不是在數據集中

TField.DisplayFormat := '$######.00' 

我想建立的是在我的網格與特定列字符串列表:

while NOT DataSet.EOF do 
    StringList.Add(TField.DisplayText); 

我所希望的速度要做到:

DataSet.DisableControls; 

但這也禁止DisplayFormat的應用。

沒有禁用的控制,意味着這將運行相當緩慢

所以,我的問題(在古代,過時,「你應該放棄它現在」 -Paradox/BDE):

有格式化函數(比如DFFormat)使用與TField.DisplayFormat相同的表示法?

然後,我可以這樣做:

DataSet.DisableControls; 
while NOT DataSet.EOF do 
    StringList.Add(DFFormat(TField.Value)); 

或者,因爲只有有幾個數據類型,所以我可以做下面的代碼,並找出方法來創建一個格式字符串,工作原理:

DataSet.DisableControls; 
while NOT DataSet.EOF do 
    begin 
    if TField.FieldType = ftString 
     StringList.Add(AsString)  
    else if TField.FieldType = ftFloat then 
     StringList.Add(Format(TField.Value, ...) 
    else... 

上面的代碼不會比所示的長得多,但我希望有一個使用TField的DisplayFormat的格式化函數。還是我問太多?

+0

即使在D2006中使用DisableControls,DisplayText也能正常工作。 – 2011-12-15 06:00:52

回答

3

DisplayFormat僅適用於4個TField後代(TAggregateFieldTDateTimeFieldTNumericField,和TSQLTimeStampField)。在我看來,這對三個人來說很容易實現:

function TFieldToDisplayFormat(const Fld: TField): string; 
begin 
    Result := Fld.AsString; 
    if (Fld is TDateTimeField) then 
    Result := FormatDateTime(TDateTimeField(Fld).DisplayFormat, 
     TDateTimeField(Fld).AsDateTime) 
    else if (Fld is TNumericField) then 
    Result := FormatFloat(TNumericField(Fld).DisplayFormat, 
     TNumericField(Fld).AsFloat) 
    else if (Fld is TSQLTimeStampField) then 
    Result := SQLTimeStampToString(TSQLTimeStampField(Fld).DisplayFormat, 
     TSQLTimeStampField(Fld).AsSQLTimeStamp); 
end; 

// Sample use 
while not DataSet.Eof do 
    SL.Add(TFieldToDisplayFormat(WhatEverField)); 
+0

偉大的解決方案,像往常一樣從你。謝謝,肯。問題:我需要使用它的一個地方是DataSet.OnAcceptRecord中的計算字段。不幸的是,我剛剛發現OnCalculate尚未被調用,也不能被調用。關於如何在上下文中使用上述方法的任何建議?我可以創建一個TField,填充它,然後把它交給上面?我需要在TField中放置什麼才能使代碼正常工作。 (如果這應該是另一個問題,請告訴我,我會重新發布它...) – RobertFrank 2011-12-15 17:23:27

3

它使用TField取決於字段的類型,你的情況(爲TNumericField後代),您必須使用FormatFloat傳遞作爲參數字段的值和DisplayFormat屬性的格式功能。

FormatFloat(Field.DisplayFormat, Field.Value)