如何将TStringGrid从Delphi 7转换为Delphi XE

时间:2014-10-21 17:00:25

标签: delphi unicode tstringgrid stringgrid

只是为了测试将Delphi 7程序转换为Delphi XE 5的难度,我在Delphi 7上编写了简单的应用程序 - 在Form上放置了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正在按预期工作。我知道这里有一些简单的技巧,也许是项目设置中的一些变化,但我不能谷歌...也许有人可以提供帮助?

最好的问候。

2 个答案:

答案 0 :(得分:7)

Delphi 7使用的默认字体是MS Sans Serif。在Unicode Delphi下使用此字体时,字符串网格控件似乎不能正确地使用该字体绘制文本。许多其他控件将以该字体正确绘制文本。但由于某种原因,字符串网格控件无法设法这样做。

当您将旧项目升级到XE5时,您继承了Delphi 7的默认值。当您在XE5中创建一个新项目时,我认为Tahoma的默认字体是不同的,并且字符串网格绘制正确地显示了该字体中的西里尔字母。

您可以使用Tahoma或Segoe UI等其他字体解决此问题。无论如何,你肯定不想使用MS Sans Serif。报表视图样式中的列表视图将是另一个不错的选择。尤其是因为它是本机平台控件。

我必须承认,我真的不明白为什么字符串网格控件表现不佳。如果其他人可以对此有所了解,那将是很好的。

答案 1 :(得分:1)

正如David所提到的,问题是字符串网格中使用的字体。但是,说Delphi中的默认字体是 MS Sans Serif 并不严格准确。它过去是 MS Sans Serif ,但是changed (in Delphi 2006) to Tahoma

您可以通过检查特定Delphi版本的RTL源中的 Graphics 单元的来源来查看特定版本的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没有替换条目 strong>字体,然后 MS Sans Serif 仍将被使用。很难分辨,因为这是" CLR"由于Delphi不再支持.NET而且IDE可能不是用CLR定义编译的,所以不应该是这种情况,但是没有办法确定只是检查代码时可能应用的条件定义。 IDE已编译。

但是,无论IDE使用哪种字体,但是选择该字体,这只会影响在IDE中创建的 new 表单。

对于现有表单,就像在这种情况下一样,问题不在于 TStringGrid ,而在于您在Delphi版本中创建项目的事实,该版本应用了默认字体不支持Unicode。

在较新版本的Delphi中打开项目的行为并未改变表单中使用的字体,因此使用 MS Sans Serif保存在 Delphi 7 中的表单在 Delphi XE5 中打开时,字体使用该字体。

TStringGrid 控件然后使用 MS Sans Serif 字体,因为这是表单上设置的字体,表单上控件的默认设置是使用它们父控制字体。

即。 TStringGrid 的这个特定实例正在使用 MS Sans Serif ,因为放置它的表单(仍然)使用 MS Sans Serif

在这种情况下,您应该将表单字体更改为 Tahoma 或a。 ñ。其他合适的Unicode启用字体。

表单上的所有控件仍设置为使用其父控件的字体,然后也将采用此字体。在实际应用程序上执行此操作时,您可能会发现一些使用ParentFont设置为FALSE的控件需要单独处理,即使字体设置正在继承"继承"由于字体更改导致外观发生变化,您的表单设计可能需要进一步整理工作。

请注意,即使对 Tahoma 的此更改已被Windows本身的更改所取代,如果您希望应用其他一些默认字体(在新表单/项目中),您可能会发现{{3} }。