正如大卫所提到的,问题在于字符串网格中使用的字体。但是,说 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本身,而是您在 Delphi 版本中创建项目的事实,该版本应用了支持/不支持 Unicode 的默认字体。
在较新版本的 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 本身的更改所取代,如果您希望应用一些其他默认字体(在新表单/项目中),您可以在此处找到有用的信息。