5

只是为了测试将我的 Delphi 7 程序转换为 Delphi XE 5 的难度,我在 Delphi 7 上编写了简单的应用程序 - 将 TStringGrid 放在 Form 上,并在创建表单时添加了代码:

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

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

于 2014-10-21T21:34:57.323 回答