【发布时间】: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事件中的动作状态,或者TActionManager的OnUpdate事件中的动作状态,而不是Application.OnIdle事件本身。另请查看TApplication.ActionUpdateDelay属性(默认为 0)。 -
谢谢 - 我会尝试看看那些在 Lazarus 中是否也可用,或者可能使用您在定义中为 Delphi 列出的那些 - 我对 Delphi 和 Lazarus 使用相同的代码库 + 表单(使用 Lazarus 定位 Mac )
标签: delphi generics delphi-xe4