ClientDataSet CalcFields的奇怪之处

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

要回复问题请先登录注册