【问题标题】:Generics in Delphi and returning a reference to tlist<class>Delphi 中的泛型并返回对 tlist<class> 的引用
【发布时间】:2017-09-05 10:17:39
【问题描述】:

我仍然使用 Delphi XE4(我使用多个 Delphi 编译器的最新编译器)并且需要一个特定的解决方法,因为他们在这个版本中完全隐藏了 TBasicAction 中的 FClients。我在设置启用/禁用时连接/断开客户端运行时(以避免闪烁约 100 多个动作和 ui 元素)因此这个 XE4 的解决方法:

这是我天真的尝试,只是简单地返回字段。

  TmscBasicActionCrack = class(TBasicAction)
  end;
{$IFDEF mymsDELPHIXE4}
  TmscBasicActionHelper = class helper for TBasicAction
  public
    function Helper_Get_Private_FClients: TList<System.Classes.TBasicActionLink>;
  end;
{$ENDIF}

{$IFDEF mymsDELPHIXE4}
//------------------------------------------------------------------------------
function TmscBasicActionHelper.Helper_Get_Private_FClients: TList<System.Classes.TBasicActionLink>;
begin
  Result := Self.FClients;
end;
{$ENDIF}

但是,我得到了错误

E2003 未声明的标识符:TList

我必须承认我从来没有在 Delphi 中使用泛型,因为我最初听说过稳定性问题 + 我需要保持与 Lazarus/FreePascal 的兼容性。

我知道 Delphi 的最新版本再次更改了类助手,但我现在最感兴趣的是让它与 Delphi XE4 一起工作

【问题讨论】:

  • 请作为答案...我会接受的。谢谢:)
  • 如果您升级到柏林或更高版本,您的班级助手将不再按原样工作,您将不得不重新编写它(请参阅How to access a private field from a class helper in Delphi 10.1 Berlin?)。您应该为您的问题找到不同的解决方案。为什么您需要直接访问FClients 列表?出于某种原因,它是私有的。
  • 我有一个相当复杂的设置,其中 100 多个动作在 onidle 中设置为启用/禁用......现在不幸的是规则有点复杂(也部分充满了定义,因为我有 6 个不同的工具编译/使用完全相同的项目和代码)并且某些操作可以设置两次(是的,我可以为所有操作创建布尔值,处理它们然后设置操作) - 这会导致工具栏闪烁。我很久以前的解决方案是在更新操作状态时从其 UI 元素中分离操作。
  • 您应该更新各个动作的OnUpdate 事件中的动作状态,或者TActionManagerOnUpdate 事件中的动作状态,而不是Application.OnIdle 事件本身。另请查看TApplication.ActionUpdateDelay 属性(默认为 0)。
  • 谢谢 - 我会尝试看看那些在 Lazarus 中是否也可用,或者可能使用您在定义中为 Delphi 列出的那些 - 我对 Delphi 和 Lazarus 使用相同的代码库 + 表单(使用 Lazarus 定位 Mac )

标签: delphi generics delphi-xe4


【解决方案1】:

错误表明编译器不知道TList&lt;T&gt; 类型。要使用它,您必须在 uses 子句中包含 System.Generics.Collections

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-08
    • 2010-10-01
    • 1970-01-01
    • 2011-04-04
    • 1970-01-01
    • 1970-01-01
    • 2014-02-09
    相关资源
    最近更新 更多