4

我制作了一个包含 TVirtualStringTree 的表单,可在 Delphi 7 和 Delphi 2010 中使用。我注意到当我在两个平台之间移动时,我在树事件和字符串上收到消息“...参数列表不同..”类型在 TWideString (D7) 和 string (D2010) 之间发生变化。我发现抑制此错误的唯一技巧是使用编译器指令,如下所示:

{$IFDEF TargetDelphi7}
procedure VirtualStringTree1GetText(Sender: TBaseVirtualTree;
  Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
  var CellText: WideString);
{$ELSE}
procedure VirtualStringTree1GetText(Sender: TBaseVirtualTree;
  Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
  var CellText: string);
{$ENDIF}

并在执行事件的地方重复此操作。我错过了一个简单的解决方案吗?谢谢。

4

4 回答 4

1

我可以提出 3 个解决方案。对于我自己的代码,我使用了解决方案 (1),因为对于我的应用程序,很少需要在 Delphi 7 和 Delphi 2010 之间共享代码。

  1. 像你一样做(IFDEF-it 编译)并在运行时分配事件处理程序。您只需更改代码,您的需求列表保持不变。不是一个好的解决方案。
  2. 创建一个派生自 TVirtualTree 的新组件(例如 TMyVirtualTree),该组件提供您自己的 OnGetText 事件版本,在两个平台上具有相同的签名。例如,我只是让它使用“字符串”。优势:您的代码可以在 D7 和 D2010 上运行,您无需更改 VirtualTree 代码但是如果任何其他开发人员想要打开您的代码,他们将需要安装您被黑的 TMyVirtualTree 组件。
  3. 修改 TVirtualTree 本身,对其进行更改,使其对 D7 和 D2010 使用相同的类型(字符串)。这也将使您的代码在 D7 和 D2010 上工作,您的代码将在 D2010 上与 vanilla TVirtualTree 一起工作,但如果任何新开发人员想用 D7 打开您的代码,他们将需要从您的黑客源重建 VirtualTree。
于 2010-04-21T11:55:43.930 回答
1

我认为这个老问题已经解决,因为它VirtualTrees.pas被转换为使用UnicodeString,并为旧编译器定义:

{$ifndef COMPILER_12_UP}
type
  UnicodeString = WideString;
{$endif COMPILER_12_UP}

我不知道什么时候UnicodeString介绍的,但我知道string现在是UnicodeString(可怜的WideString,没有人爱他 -我知道他的感受)的别名。

于 2011-06-13T14:14:56.070 回答
1

最简单的解决方案是为 D7 和 D2010 维护单独的源文件夹和组件文件夹。它最终将节省时间和头痛。

于 2010-04-20T13:53:39.600 回答
1

您也可以尝试在VirtualTrees单元中声明一个新类型:

{$IFDEF TargetDelphi7}
type
  VTString = type WideString;
{$ELSE}
type
  VTString = type string;
{$ENDIF}

并更改所有事件签名以使用这种新类型,这应该使您能够保持您的 .dfm 文件兼容并且没有这些条件。

于 2010-04-20T15:10:51.940 回答