【问题标题】:Add Unicode support to TreeNT component向 TreeNT 组件添加 Unicode 支持
【发布时间】:2012-12-23 11:56:20
【问题描述】:

我在我的应用程序中使用TreeNT 组件。我正在将应用程序迁移到 XE2。 我已经在 XE2 中重新编译了组件。运行时它不会在窗口中显示节点标题。

您能给我一些将第三方组件手动迁移到 XE2 的提示吗?

【问题讨论】:

  • 尝试使用 Virtual TreeView 而不是 TreeNT。
  • 我不能使用它,因为在这个控件上定义了更多用户定义的组件。

标签: delphi unicode components delphi-xe2


【解决方案1】:

Delphi中有很多关于Unicode的文章 组件的移植与应用程序的移植没有什么不同。 找到并阅读它们。真的。

你会被 PChar -> PAnsiChar/PWideChar 歧义击中,特别是如果你在 {$T-} 模式下工作。检查编译时是否输入了指针。

如果您在分配缓冲区或在move 过程中移动原始数据时没有在 Sizeof(char) 上进行乘法运算,则会受到打击。

您最好搜索模棱两可的类型 - char、pchar、string - 并删除它们,根据上下文将它们显式替换为 WideChar/PWideChar/UnicodeString 或 AnsiChar/PAnsiChar/AnsiString。因此,您既可以了解类型转换可能发生的位置,也可以让编译器为您进行类型检查。 ShortStirng 类型(string[255] 由 TreeNT 使用)根据定义是非 Unicode。访问时请注意每一处。

如果您从 Windows DLL 直接导入并在 Windows 函数名称处指定“A”,您将会受到打击。这很容易导致 ANSI 函数获取意外的 UTF-16 数据。

尝试搜索是否有人已经这样做了。例如 http://code.google.com/p/keynote-nf/source/browse/trunk/3rd_party/treent/TreeNT.pas - 但这在 2007 年结束,在 Delphi RTL 中的 Unicode 之前。

【讨论】:

  • 相信很久以前大家都转用VTW了。
  • 可能有两个地方最有可能偏离轨道。第一个是渲染,第二个是传递值。首先,您应该查看组件是呈现自身还是完全依赖于继承的 Windows 呈现。在源中搜索 PAINT 词。您可能会发现 WM_PAINT 消息引用或 WMPaint 方法覆盖或其他任何内容。如果不是这样,我什至可以让新的消息方法对 WM_PAINT 做出反应,并且只调用继承的实现,然后打开“使用调试 DCU”并将其跟踪到 VCL 库存 TTreeView 可能直到它会进行渲染
  • 或转到 Windows 内置函数。尽管跟踪有时会变得复杂。另一种方法是 - 启用调试 DCU - 深入跟踪更改节点标题的某些行。它应该越来越深入,可能是事件进入 VCL 源,最终将标题更改消息发送到 Windows 小部件。它可能是 TVM_SETITEM 或在 VCL 和/或 TreeNT 中命名的任何名称:See MSDN
  • 在发送消息之前,它会填充数据记录,并且可能会在这条路径上的某处将宽字符串转换为 ansistring 失败。当您修复它时,请注意将其放在一些开源文件中,以便其他人能够从中受益并在需要时获得进一步的帮助。
  • 感谢 cmets。当我尝试使用给出错误的 TNT Delphi unicode 组件进行编译时,“对 OS 函数的调用失败。”
猜你喜欢
  • 2011-03-10
  • 2016-08-06
  • 2011-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-30
  • 1970-01-01
相关资源
最近更新 更多