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。简单。
如何访问 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。简单。