0

我有一个奇怪而持久的问题......(我的右移键刚刚停止工作,所以请忍受我可能奇怪的大写和符号;试图让我的手指训练使用左移键是一种痛苦。)

当 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;
4

1 回答 1

0

为什么不使用 DisplayFormat 属性?例如,在 TClientDataSet.AfterOpen 事件中执行如下操作:

dynamic_cast<TNumericField*>(DataSet->FieldByName("quantity_to_date_adjustment"))->DisplayFormat = "#,##0.00;(-#,##0.00)";
于 2010-12-03T02:38:26.233 回答