2012-02-27 21 views
12

私はTDatasetクラスとその文字列フィールドをDelphi XE2で調べており、AsWideStringがUnicodeStringの型を返すことに気付いています。ただし、関数TField.AsStringから値を取得します。文字列はTFIeld.AsAnsiString:AnsiStringを呼び出します。したがって、ユニコード文字は失われますか?また、TDataset.GetFieldDataに渡されるバッファは、AnsiCharの配列として宣言されます。Delphi XE2データセットフィールドタイプTStringFieldはUnicodeをサポートしていませんか?

これを正しく理解していますか?

+1

+1この動作はIMHO VCL間違った実装です。それはIMHOの間違った命名です。*残りのVCL/RTLと矛盾し、混乱や誤解の原因となります。あなたの質問は完全に理にかなっています。 –

答えて

12

いいえ、Unicodeフィールドの場合はTWideStringFieldクラス、非Unicode文字列の場合はTStringFieldクラスを調べる必要があります。 TFieldは単なる基本クラスであり、TField.GetAsWideStringは、Unicode対応の子孫によってオーバーライドされるフォールバック実装を備えた仮想メソッドです。

+1

Unicodeへのデータベース移行は、DFMのすべてのTStringFieldをTWideStringField(および他の多くのソースコード変更)で置き換える必要があります。開発者はスムーズな移行を期待します。 – mjn

+3

@mjnこのアプローチでは、基礎となるデータベースフィールドを変更することなく、あなたのアプリでUnicodeに移行することができます。TWideStringFieldは何年も前からあり、DelphiからUnicodeへの切り替えには関係しません。データベース内のフィールドが以前にUnicodeであった場合は、すでにDelphi 5でTWideStringFieldを使用していました。データベースフィールドが単なるAnsiStringの場合、TStringFieldを使用します。 Delphiはデータベース内のデータ定義とデータを自動的に変更しません。 –

+1

@mjn実際にはnoです。なぜなら、値がUnicodeであるかどうかは、データベースに依存するからです。したがって、データベースが旧DelphiバージョンのUnicodeであった場合、既にTWideStringFieldでした。データベースがまだユニコードを持っていない場合、なぜそれが新しいバージョンにあるべきではないのでしょうか? –

4

はい、正しく理解しました。これはで、VCLとそのドキュメントは壊れていますです。あなたの混乱は完全に理にかなっています!

Delphi 2009+の実装では、AnsiStringの場合はAsStringプロパティ、string=UnicodeStringの場合はAsWideStringのプロパティを使用する必要があります。実際には、As*Stringプロパティは、次のような

を定義されています。

property AsString: string read GetAsString write SetAsString; 
property AsWideString: UnicodeString read GetAsWideString write SetAsWideString; 
property AsAnsiString: AnsiString read GetAsAnsiString write SetAsAnsiString; 

地球上で私たちはAsStringAnsiStringを返すことを見つけることができるかもしれどのように?残りのVCL/RTLと比較すると、まったく意味がありません。

AnsiStringおよびTWideStringFieldstring=UnicodeStringにはTStringFieldクラスを使用する実装が壊れています。

また、documentation is also broken

Data.DB.TField.AsString

ストリング(Delphi)またはAnsiString型(C++)としてフィールドの値を表します。

これは、Delphiでstringが、AnsiStringを表すものではありません!このプロパティが普通のstring=UnicodeStringタイプを使用しているという事実は完全にミスリーディングです。

データベースの観点からは、Unicodeを処理するか、特定の文字セットで作業するかは、DBドライバによって異なります。しかし、VCLの観点からすれば、Delphi 2009+ではstringタイプについてしか知りませんが、AsString: Stringを使用するとUnicode対応になると確信してください。

関連する問題