2010-11-30 44 views
0

我有一個奇怪的和持久的問題...(我還右shift鍵剛剛停止工作,所以請忍受我可能奇帽&符號;試圖讓我的手指被訓練使用左移鍵是一種痛苦)。ClientDataSet的CalcFields'奇麻煩

我在ClientDataSet打開時運行CalcFields事件&通過記錄(即AutoCalcFields爲true)。這需要每一個記錄,並做了少許修改它,如在現場與「88」,它改變爲「$ 88.00」,並把它在一個新的領域,等等,它們的目的用武之地。這很好,唯一的問題是CalcFields似乎完全忽略了集合中的第一條記錄。它顯示了DBGrid中的記錄,並且第一條記錄在那裏,但是沒有任何格式化。因此,我單步執行代碼,並且CalcField從不觸及第一條記錄。那麼,實際上,它會觸及第一條記錄,(我假設)。當我遍歷代碼時,CalcField會用兩個完全空白的信息發射兩次。我知道CalcFields是在數據集打開並執行時執行的,這是第一個空白輸入來自哪裏,這很好。第二個空白輸入在每個記錄進入時首先進入。同樣,第一條記錄在DBGrid中顯示完全完好,但在Calcfield上完全空白。

有誰知道爲什麼發生這種情況的任何想法?這是推動我瘋狂,我已經跟蹤它上下無法弄清楚究竟發生了什麼事。

這裏的CalcField代碼,它的價值:

void __fastcall TDataModule1::sdsSEARCHCalcFields(TDataSet *DataSet) 
{ 
     // to view for debugging.... 
     DataSet->FieldByName("MISBN")->AsString; 

     AnsiString formattedField; 
     String field; 
     double dInputPower; 

     dInputPower = DataSet->FieldByName("MBILL$")->AsFloat; 
     formattedField = FormatFloat("#,##0.00", dInputPower); 
     DataSet->FieldByName("BILL")->Text = formattedField; 

     dInputPower = DataSet->FieldByName("MTGUID")->AsFloat; 
     formattedField = FormatFloat("#,##0.00", dInputPower); 
     DataSet->FieldByName("GUID")->Text = formattedField; 

     field = DataSet->FieldByName("MISBN")->AsString;  
     int lght = field.Length(); 
     String str = field.SubString(14, 1); 
     if (field.Length() > 13 && field.SubString(14, 1) == ".") 
     { 
      DataSet->FieldByName("ISBN")->Text = field.SetLength(13); 
     } 

} 
//--------------------------------------------------------------------------- 

和這裏的執行它的代碼。注意這是一個ctQuery ...

DataModule1->sdsSEARCH->Active = false; 
DataModule1->cdsSEARCH->Active = false; 
DataModule1->dsSEARCH->Enabled = false; 
DataModule1->sdsSEARCH->CommandType = ctQuery; 
DataModule1->sdsSEARCH->CommandText = queryStr; 
DataModule1->sdsSEARCH->Active = true; 
DataModule1->cdsSEARCH->Active = true; 
DataModule1->dsSEARCH->Enabled = true; 

回答

0

爲什麼不使用DisplayFormat屬性?例如,在TClientDataSet.AfterOpen事件中執行如下操作:

dynamic_cast<TNumericField*>(DataSet->FieldByName("quantity_to_date_adjustment"))->DisplayFormat = "#,##0.00;(-#,##0.00)"; 
+0

問題不是格式化本身。沒關係。這就是CalcField簡單地跳過了第一條記錄。 – Cyprus106 2010-12-10 20:09:19