0

奇妙で永続的な問題があります... (また、右のシフト キーが機能しなくなったので、変な大文字と記号の可能性がありますが、ご容赦ください。左のシフト キーを使用できるように指を訓練するのは大変です。)

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;
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 に答える