5

私の Delphi 7 プログラムを Delphi XE 5 に変換するのがどれほど難しいかをテストするために、Delphi 7 で簡単なアプリケーションを作成しました - フォームに TStringGrid を配置し、フォーム作成にコードを追加しました:

procedure TFMain.FormCreate(Sender: TObject);
begin
  With StringGrid1 do
    begin
      Cells[0,0]:='čęжэ€';
    end;
end;

(実際には Cells[0,0]:='ce??€' と書かれていましたが、私はそれを期待していました)。当然のことながら、コンパイル、ビルド、実行、Unicode なし。次に、Delphi XE 5 でプロジェクトを再度開き、行を再び Cells[0,0]:='čęжэ€' に変更し、コンパイル、ビルド、実行 - Unicode なし (čę||| のようなものを取得) ! それは私には奇妙でした。Delphi Xe 5 で同じコードを使用して新しいプロジェクトをゼロからビルドすると、同じ TStringGrid が期待どおりに動作します。ここにいくつかの簡単なトリックがあることは知っていますが、プロジェクト設定の変更かもしれませんが、グーグルで検索できません...誰かが助けてくれるでしょうか?

よろしくお願いします。

4

2 に答える 2

7

Delphi 7 で使用されるデフォルトのフォントは MS Sans Serif です。このフォントを Unicode Delphi で使用すると、文字列グリッド コントロールがそのフォントでテキストを正しく描画しないように見えます。他の多くのコントロールは、そのフォントでテキストを正しく描画します。しかし、何らかの理由で、文字列グリッド コントロールはそうすることができません。

古いプロジェクトを XE5 にアップグレードすると、その Delphi 7 のデフォルトが継承されます。XE5 で新しいプロジェクトを作成すると、デフォルトのフォントが異なります。Tahoma だと思います。ストリング グリッドの描画では、キリル文字がそのフォントで正しく表示されます。

Tahoma や Segoe UI などの別のフォントを使用すると、この問題を回避できます。とにかく、MS Sans Serif を使いたくないはずです。レポート ビュー スタイルのリスト ビューは、別の適切なオプションです。特に、これはネイティブ プラットフォーム コントロールであるためです。

文字列グリッド コントロールの動作が改善されない理由がよくわかりません。他の誰かがこれに光を当てることができれば素晴らしいでしょう。

于 2014-10-21T17:32:14.663 に答える
1

David が言及しているように、問題は文字列グリッドで使用されるフォントです。ただし、Delphi のデフォルト フォントがMS Sans Serifであると言うのは厳密には正確ではありません。以前はMS Sans Serifでしたが、(Delphi 2006 で) Tahomaに変更されました。

Delphi の特定のバージョンの RTL ソース内のグラフィックスユニットのソースを調べることで、特定のバージョンの Delphi がどのようにデフォルト フォントを選択するかを確認できます(IDE はそのコードを使用して構築されているため)。具体的には、InitDefFontDataプロシージャ(および、Delphi の古いバージョンではDefFontDataレコード)です。

(少なくとも)Delphi XE4の時点で、デフォルトのTahomaフォントは、レジストリに設定されているように、MS Shell Dlg 2として識別される値のフォント置換の設定によって置き換えられます。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontSubstitutes\

注意 - XE4 のコードを調べると、このキーが存在しないかアクセスできない場合、またはMS Shell Dlg 2フォントの代替エントリがない場合でも、 MS Sans Serifが引き続き使用される可能性がありますこれは「CLR」が定義されているときの動作であるため、わかりにくいですが、Delphi は .NET をサポートしなくなり、IDE はおそらく CLR が定義された状態でコンパイルされていないため、これはもはや当てはまりませんが、そうする方法はありません。 IDE のコンパイル時にどの条件定義が適用されるかは、コードを調べるだけでわかります。

ただし、IDE がどのフォントを使用していても、そのフォントを選択していても、これは IDE で作成された新しいフォームにのみ影響します。

この場合のように、既存のフォームの場合、問題はTStringGrid 自体にあるのではなく、Unicode をサポートする/サポートしないデフォルト フォントを適用したバージョンの Delphi でプロジェクトを作成したという事実にあります。

プロジェクトを新しいバージョンの Delphi で開いても、フォームで使用されているフォントは変更されませんでした。そのため、Delphi 7でMS Sans Serifフォントを使用して保存されたフォームは、 Delphi XE5で開いたときにそのフォントを引き続き使用しています。

次に、TStringGridコントロールはMS Sans Serifフォントを使用します。これは、フォームに設定されたフォントであり、フォーム上のコントロールのデフォルトでは親コントロールのフォントを使用するためです。

つまり、このTStringGridの特定のインスタンスは、 MS Sans Serifを使用しています。これは、それが配置されているフォームが(まだ) MS Sans Serifを使用しているためです。

このような場合、フォーム フォントをTahomaまたはその他の適切な Unicode 対応フォントに変更する必要があります。

親コントロールのフォントを使用するように設定されているフォーム上のすべてのコントロールは、このフォントも採用します。実際のアプリケーションでこれを実行すると、ParentFont が FALSE に設定されたいくつかのコントロールが見つかる場合があります。これは個別に対処する必要があり、フォント設定が「継承」されている場合でも、外観の変更により、フォームのデザインを整理するためにさらに作業が必要になる場合があります。フォント変更の影響です。

このTahomaへの変更でさえ、Windows 自体の変更に取って代わられていることに注意してください。他のデフォルト フォントを (新しいフォーム/プロジェクトで) 適用したい場合は、ここで役立つ情報を見つけることができます。

于 2014-10-21T21:34:57.323 に答える