【问题标题】:TVirtualStringTree compatibility between Delphi 7 and Delphi 2010 - 'Parameter lists differ'Delphi 7 和 Delphi 2010 之间的 TVirtualStringTree 兼容性 - “参数列表不同”
【发布时间】:2010-04-20 13:24:10
【问题描述】:

我制作了一个包含 TVirtualStringTree 的表单,该表单可在 Delphi 7 和 Delphi 2010 中运行。我注意到,当我在两个平台之间移动时,我在树事件和字符串类型在 TWideString (D7) 和字符串 (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}

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

【问题讨论】:

    标签: delphi virtualtreeview


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      并更改所有事件签名以使用这种新类型,这将使​​您的 .dfm 文件保持兼容且不受这些条件限制。

      【讨论】:

      • Delphi 似乎不喜欢这个。我想到了那个。试试看。
      • 尝试不使用额外的“类型”说明符,以便它们是简单的别名而不是唯一的数据类型:type VTString = WideString;类型 VString = String;
      • @Remy:它必须是 Delphi 7,它不喜欢事件声明中的 VTSTring - 它会触发“参数列表不同”消息,即使您说它是一个简单的别名。
      • 看来你没有重建你的IDE包。
      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

        • UnicodeString 是在 Delphi 2009 中引入的。如果您编写依赖于 Unicode 的应用程序或组件,那么最好的办法就是完全按照 VirtualTreeView 所做的那样:在任何地方使用 UnicodeString 并在以下版本中为 WideString 定义一个类型别名Delphi 没有它。
        • 这并不能真正解决问题,因为 Delphi 7 不够聪明,无法意识到 UnicodeString 在这种情况下表示 WideString。它仍然会产生同样的错误。
        • @FrederikSlijkerman Delphi 5(我使用的)足够聪明,可以弄清楚它。奇怪的是,Delphi 7 会倒退。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-09-14
        • 1970-01-01
        • 2013-10-24
        • 2013-04-26
        • 1970-01-01
        • 1970-01-01
        • 2012-10-01
        相关资源
        最近更新 更多