我有一個奇怪的和持久的問題...(我還右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;
問題不是格式化本身。沒關係。這就是CalcField簡單地跳過了第一條記錄。 – Cyprus106 2010-12-10 20:09:19