我有一个奇怪而持久的问题......(我的右移键也停止工作,所以请忍受我可能的奇数帽和符号;试图让我的手指训练使用左移键是痛苦。)
当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;
答案 0 :(得分:0)
为什么不使用DisplayFormat属性?例如,在TClientDataSet.AfterOpen事件中执行以下操作:
dynamic_cast<TNumericField*>(DataSet->FieldByName("quantity_to_date_adjustment"))->DisplayFormat = "#,##0.00;(-#,##0.00)";