相关疑难解决方法(0)

如何在没有助手的情况下访问私有方法?

在Delphi 10 Seattle中,我可以使用以下代码来解决过于严格的可见性限制.

如何访问私有变量?

type 
  TBase = class(TObject)
  private
    FMemberVar: integer;
  end;
Run Code Online (Sandbox Code Playgroud)

我如何访问普通或虚拟私有方法?

type
  TBase2 = class(TObject) 
  private
    procedure UsefullButHidden;  
    procedure VirtualHidden; virtual;
    procedure PreviouslyProtected; override;
  end;
Run Code Online (Sandbox Code Playgroud)

以前我会使用类助手来打开基类.

type
  TBaseHelper = class helper for TBase
    function GetMemberVar: integer;
Run Code Online (Sandbox Code Playgroud)

在Delphi 10.1 Berlin中,类助手不再能够访问主题类或记录的私有成员.

是否有其他方式可以访问私人会员?

delphi private delphi-10.1-berlin

29
推荐指数
5
解决办法
5415
查看次数

我如何修补delphi类的私有方法?

我已经阅读了这些问题和答案

如何更改外部声明的函数的实现(绕行)

在delphi中调用例程调用

但我不能弄清楚如何修补位于其他单元中的类的私有方法.

检查此示例我想修补Bar程序.

Unit ThidParty;
Interface
   Type
      TFoo =Class
        private
           procedure Bar;
       end;
Run Code Online (Sandbox Code Playgroud)

我认为关键是找到一种方法来获取私有方法的地址.

那么,我如何修补delphi类的私有方法?

delphi delphi-xe2

15
推荐指数
1
解决办法
4780
查看次数

从类助手访问私有字段

特定

type
  TMyClass = class
  private
    FPrivateInt : Integer;
  protected
    FProtectedInt : Integer;
  public
    FPublicInt : Integer;
  end;
Run Code Online (Sandbox Code Playgroud)

在一个单位和

type
  TMyHelper = class helper for TMyClass
    function Sum : Integer;
  end;
[...]
function TMyHelper.Sum: Integer;
begin
  Result := 0;
  Result := Result + FPublicInt;
  Result := Result + FProtectedInt;
  Result := Result + FPrivateInt;  // <- compiler error here
end;
Run Code Online (Sandbox Code Playgroud)

在另一个,XE8编译器报告错误"E2003未声明的标识符'FPrivateInt'.这是我直观地预期的,因为在声明类的单元外部的私有成员的可见性受限,如果我没有看到示例Marco Cantu的Delphi 2007手册p89/90,访问"帮助"类的私人领域,并在接受的答案的开头段落中明确声明

我可以用类助手调用静态私有类方法吗?

这似乎支持它:"众所周知,帮助者确实破解了私人可见性.因此,私人成员可以从班级助手那里看到......"

那么,为什么我会收到E2003 Undeclared Identifier错误?在我的理解或代码中,我显然在某处遗漏了某些东西.我使用XE4和XE6,btw和XE4在我引用的SO答案之前得到了相同的错误,这是从去年开始的.

delphi helper delphi-xe8

2
推荐指数
1
解决办法
1602
查看次数

Delphi中的泛型并返回对tlist <class>的引用

我仍然使用Delphi XE4(我使用多个Delphi编译器的最新编译器),并且需要一个特定的解决方法,因为他们在此版本中完全隐藏了TBasicAction中的FClients.我在设置启用/禁用时连接/断开客户端运行时(以避免使用~100 + actions和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}
Run Code Online (Sandbox Code Playgroud)

但是,我收到错误

E2003未声明的标识符:TList <>

我必须承认,自从我最初听说稳定性问题+我需要保持与Lazarus/FreePascal的兼容性时,我永远不会使用Delphi中的泛型.

我知道最近的版本Delphi再次改变了类助手,但我现在最感兴趣的是让它与Delphi XE4一起使用

delphi generics delphi-xe4

0
推荐指数
1
解决办法
404
查看次数