Delphi 7和Delphi 2010之间的TVirtualStringTree兼容性 - '参数列表不同'

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个回答

1

我认为这个旧问题已经得到解决,因为VirtualTrees.pas已经转换为使用UnicodeString,对于旧编译器有一个定义:

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

我不知道何时引入了UnicodeString,但我知道string现在是UnicodeString的别名(可怜的WideString,没有人爱他 - 我知道他的感受)。

UnicodeString是在Delphi 2009中引入的。如果您编写依赖于Unicode的应用程序或组件,最好像VirtualTreeView一样,在所有地方使用UnicodeString,并在没有它的Delphi版本中为WideString定义一个类型别名。 - afrazier
这并不能真正解决问题,因为Delphi 7并不聪明到能意识到在这种情况下UnicodeString意味着WideString。它仍然会生成相同的错误。 - Frederik Slijkerman
@FrederikSlijkerman Delphi 5(我使用的版本)足够聪明,可以自行解决这个问题。很奇怪Delphi 7会出现退步。 - Ian Boyd

1

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

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

并将所有事件签名更改为使用此新类型,这应该使您的 .dfm 文件保持兼容并且不包含这些条件语句。


Delphi 似乎不喜欢这个。我想过了。试一下就知道了。 - Brian Frost
尝试去掉额外的“type”限定符,使它们成为简单别名而不是唯一数据类型: type VTString = WideString; type VString = String; - Remy Lebeau
@Remy:可能是 Delphi 7 不支持在事件声明中使用 VTString,这会触发“参数列表不同”的错误消息,尽管如你所说它只是一个简单的别名。 - Brian Frost
1
看起来你没有重新构建你的IDE包。 - Ondrej Kelle

1

最简单的解决方案是为D7和D2010分别维护独立的源代码和组件文件夹。这样做最终可以节省时间并避免麻烦。


1

我可以提供三种解决方案。对于我的代码,我使用了解决方案(1),因为在我的应用程序中,Delphi 7和Delphi 2010之间需要共享的代码非常少。

  1. 像你所做的那样(使用IFDEF编译)并在运行时分配事件处理程序。你只改变了你的代码,你的需求列表保持不变。这不是一个好的解决方案。
  2. 创建一个派生自TVirtualTree的新组件(例如TMyVirtualTree),它提供了您自己版本的OnGetText事件,在两个平台上具有相同的签名。例如,我会简单地使用“string”。优点:你的代码将在D7和D2010上都能工作,你不会改变VirtualTree代码,但如果其他开发人员想要打开你的代码,他们需要安装你的修改过的TMyVirtualTree组件。
  3. 修改TVirtualTree本身,使其在D7和D2010上都使用相同的类型(字符串)。这也将使你的代码在D7和D2010上都能工作,你的代码将在D2010上使用原始的TVirtualTree,但如果任何新的开发人员想要使用D7打开你的代码,他们需要从你的修改过的源代码重新构建VirtualTree。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接