奇妙で永続的な問題があります... (また、右のシフト キーが機能しなくなったので、変な大文字と記号の可能性がありますが、ご容赦ください。左のシフト キーを使用できるように指を訓練するのは大変です。)
ClientDataSet が開いてレコードを通過するときに CalcFields イベントを実行しています (つまり、AutoCalcFields が true です)。すべてのレコードを取得し、フィールドに「88」が含まれている場合は、それを「$88.00」に変更して新しいフィールドに配置するなど、書式設定のために少し変更を加えます。これはうまく機能しますが、唯一の問題は、CalcFields がセット内の最初のレコードを完全に無視しているように見えることです。DBGrid 内のレコードが表示され、最初のレコードがそこにありますが、この書式設定は行われていません。そのため、コードをステップ実行しても、CalcField は最初のレコードにアクセスしません。まあ、実際には、最初のレコードに触れています (私は推測しています)。コードをステップ実行すると、CalcField が 2 回起動し、2 つの完全に空白の情報セットが表示されます。データセットが開いているときに CalcFields が実行されることは知っていますが、ステップスルーすると、そこから最初の空白の入力が行われますが、これは問題ありません。2 番目の空白の入力は、各レコードを通過するときに最初に入力されます。繰り返しますが、最初のレコードは 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;