以前は INI ファイルを使用して Unicode テキストを保存していましたが、現在は実行可能ファイルに Unicode テキストを保存する必要があります。どうすればこれを達成できますか?
これらの文字を保存したい:
āčēūīšķļņž
以前は INI ファイルを使用して Unicode テキストを保存していましたが、現在は実行可能ファイルに Unicode テキストを保存する必要があります。どうすればこれを達成できますか?
これらの文字を保存したい:
āčēūīšķļņž
どうしても Delphi 7 を使用する必要がある場合は、いくつかのバリエーションがあります。
実行可能ファイルにリンクされたリソースに文字列を格納します。
グローバルデータモジュールまたはその他のビジュアルまたは非ビジュアルコンポーネントにある大きなメモまたは同じものに文字列を保存し、インデックスでアクセスします。これは、Delphi リソースの文字列が XML エンコード形式で格納されているために可能です。たとえば、シンボルの例āčēūīšķļņžは次のように保存されますāčēūīšķļņž
XML エンコードまたは Base64 エンコードされた文字列をコード内の文字列定数に格納します。
文字列変換には、 EncdDecd.pas 、 xdom.pas 、または UTF8Encode/UTF8Decode などの System.pas の関数を使用できます。
Delphi フォームで Unicode 文字列を表示および編集するには、TNT Unicode コントロールのような Unicode コントロールの特別なセットを使用するか、元の Delphi コントロールをサブクラス化し、TntControls.pas (TNT Unicode の一部コントロール):
Windows NT は、ネイティブの Unicode ウィンドウをサポートしています。TWinControl の子孫に Unicode サポートを追加するには、CreateWindowHandle() をオーバーライドして CreateUnicodeHandle() を呼び出します。
これが機能する主な理由の 1 つは、VCL が SendMessage() の ANSI バージョン (SendMessageA()) のみを使用するためです。UNICODE ウィンドウで SendMessageA() を呼び出すと、Windows は ANSI/UNICODE 変換を自動的に処理します。たとえば、VCL が SendMessageA を使用して WM_SETTEXT をウィンドウに送信する場合、ターゲット ウィンドウが UNICODE ウィンドウであっても、Windows は実際には PAnsiChar を予期します。そのため、SendMessageA を PChars で呼び出しても問題はありません。
VCL の問題は、TControl.Perform() メソッドに関係しています。Perform() はウィンドウ プロシージャを直接呼び出し、ANSI ウィンドウを想定します。これは、たとえば、VCL が Perform(WM_SETTEXT, ...) を呼び出して PAnsiChar を渡し、最終的に PWideChar を予期する DefWindowProcW() に渡される場合に問題になります。
これが SubClassUnicodeControl() の理由です。このプロシージャは、Windows WndProc と TWinControl.WindowProc ポインタをサブクラス化します。メッセージが Windows からのものか、または WindowProc が直接呼び出されたかを判断します。次に、SendMessageA() for Windows を呼び出して、特定のテキスト メッセージを適切に変換します。
もう 1 つの問題は、TWinControl.DoKeyPress() に関するものです。WM_CHAR メッセージから呼び出されます。WideChar を AnsiChar にキャストし、結果の文字を DefWindowProc に送信します。これを避けるために、DefWindowProc もサブクラス化されます。WindowProc は、渡す前に char コードを #FF に変換することにより、ANSI 処理コードに対して WM_CHAR メッセージを安全にします。元の WideChar を TWMChar の .Unused フィールドに格納します。コード #FF は、DefWindowProc に渡される前に、WideChar に変換されます。
行う
const MyString = WideString('Teksts latvie'#$0161'u valod'#$0101);