Delphi访问VCL单元中的私有功能

时间:2016-01-29 11:31:14

标签: delphi vcl

如何在VCL单元中访问私人功能?

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

现在我将其复制到我的源码,但IMO更好的是使用该功能。

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

3 个答案:

答案 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时。容易。