我有一个奇怪而持久的问题......(我的右移键刚刚停止工作,所以请忍受我可能奇怪的大写和符号;试图让我的手指训练使用左移键是一种痛苦。)
当 ClientDataSet 打开并浏览记录时,我正在运行 CalcFields 事件(即 AutoCalcFields 为真)。它获取每条记录并对其进行一些修改,例如在字段中带有“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;