質問

私には奇妙で永続的な問題があります...(また私の右シフトキーが機能しなくなったので、私のおそらく奇妙なキャップとシンボルに耐えてください;左シフトキーを使用するように指を訓練しようとすることは痛みです。)

ClientDatasetが開いてレコードを通過するときにCalcfieldsイベントを実行しています(つまり、Autocalcfieldsが真実です)。すべてのレコードが必要であり、フィールドに「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;
役に立ちましたか?

解決

DisplayFormatプロパティを使用してみませんか?たとえば、TclientDataset.afteropenイベントでは、次のようなことを行います。

dynamic_cast<TNumericField*>(DataSet->FieldByName("quantity_to_date_adjustment"))->DisplayFormat = "#,##0.00;(-#,##0.00)";
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top