Delphi 访问 VCL 单元中的私有函数

Delphi access private function in VCL unit

如何访问 VCL 单元中的私有函数?

我需要从 ExtCtrls.pas 调用函数 ColorToPrettyName

现在我将其复制到我的源代码中,但 IMO 更好的做法是改用该函数。

更多细节: TColorBox中使用了该函数,但我只需要漂亮的名字。 我试图实例化 TColorBox 并从中获取漂亮的名称,但这只有在我有一些 TWinControl 分配给它的父级时才有可能。但是那个TWinControl我没有在我想使用漂亮名字的地方,我不想做任何黑客攻击。

您无法轻易地从单元外部调用此函数,因为它未公开。

您可以创建一个调用该函数的控件实例,并说服它完成肮脏的工作。正如另一个答案所证明的那样,这是完全可行的。

您可以使用反汇编程序找到函数的地址并使用过程变量调用它。 madExcept 源代码是该技术示例的重要来源。

总的来说,在我看来,将源代码复制到您的代码中是最好的选择。您所有可用的选项都有缺点,这似乎是最简单的。

您将在此处找到如何访问 ColorToPrettyName 的示例: https://github.com/project-jedi/jvcl/blob/master/donations/Colors/JvFullColorSpaces.pas

// (outchy) Hook of TColorBox to have access to color's pretty names.
// Shame on me but that's the only way to access ColorToPrettyName array in the
// ExtCtrls unit. Thanks Borland.

{$IFDEF COMPILER6_UP}
type
  TJvHookColorBox = class (TCustomColorBox)
  protected
    function GetItemsClass: TCustomComboBoxStringsClass; override;
    procedure DestroyWindowHandle; override;
  public
    constructor Create; reintroduce;
    procedure CreateWnd; override;
    procedure DestroyWnd; override;
  end;
  ........

这是你问的,虽然这绝对不是好的做法。

更好的解决方案是使用 JEDI (JvJCLUtils.pas) 中的相同函数,尽管这会增加依赖性。

您将在这里找到 JEDI:http://jvcl.delphi-jedi.org/

它包含更多有用的实用程序和组件。

就像大卫说的;复制源码到自己的单位最好

我相信 ColorToPrettyName 不会经常更改,但如果您担心它会更改并且您复制的代码在升级 Delphi 后会有所不同,那么您可以在代码中添加一个编译器指令来检查版本并警告您。然后你可以更新你的代码,等到你下次升级你的Delphi。简单。