-2

以前は INI ファイルを使用して Unicode テキストを保存していましたが、現在は実行可能ファイルに Unicode テキストを保存する必要があります。どうすればこれを達成できますか?

これらの文字を保存したい:

āčēūīšķļņž
4

5 に答える 5

2

どうしても Delphi 7 を使用する必要がある場合は、いくつかのバリエーションがあります。

  1. 実行可能ファイルにリンクされたリソースに文字列を格納します。

  2. グローバルデータモジュールまたはその他のビジュアルまたは非ビジュアルコンポーネントにある大きなメモまたは同じものに文字列を保存し、インデックスでアクセスします。これは、Delphi リソースの文字列が XML エンコード形式で格納されているために可能です。たとえば、シンボルの例āčēūīšķļņžは次のように保存されますāčēūīšķļņž

  3. 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 に変換されます。

于 2011-08-15T15:24:36.910 に答える
0

行う

const MyString = WideString('Teksts latvie'#$0161'u valod'#$0101);
于 2011-08-15T12:22:59.127 に答える