如何在VCL单元中访问私人功能?
我需要从ColorToPrettyName
调用函数ExtCtrls.pas
。
现在我将其复制到我的源码,但IMO更好的是使用该功能。
更多细节:
该函数在TColorBox
中使用,但我只需要漂亮的名字。
我尝试实例化TColorBox
并从中获取漂亮的名称,但这只有在我有一些TWinControl
分配给它的父项时才有可能。但那个TWinControl
我没有在我想要使用漂亮名字的地方,我不想做任何黑客攻击。
答案 0 :(得分:2)
您无法从本机外部轻松调用此功能,因为它未曝光。
您可以创建一个调用该函数的控件实例,并说服它执行脏工作。另一个答案表明,这是完全可行的。
您可以使用反汇编程序查找函数的地址并使用过程变量调用它。 madExcept源代码是该技术示例的重要来源。
总而言之,在我看来,将源代码复制到代码是最佳选择。所有可用的选项都有缺点,这似乎是最简单的。
答案 1 :(得分:2)
您将在此处找到如何访问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/
它包含许多有用的实用程序和组件。
答案 2 :(得分:1)
我相信ColorToPrettyName不会经常更改,但是如果您担心它会复制并且在升级Delphi时复制的代码会有所不同,那么您可以在代码中添加编译器指令来检查版本并警告您它。然后您可以更新代码并等到下次升级Delphi时。容易。