2016-01-29 68 views
0

如何訪問VCL單元中的私有函數?VCL單元中的Delphi訪問私有函數

我需要從ExtCtrls.pas調用功能ColorToPrettyName

現在我將其複製到我的源代碼中,但IMO更好使用該函數。

一些更多的細節: 該功能用於TColorBox,但我只需要漂亮的名字。 我試圖實例化TColorBox並從中獲得漂亮的名字,但只有當我有一些TWinControl分配給它的Parent時纔有可能。但那TWinControl我沒有在我想用漂亮的名字的地方,我不想做任何黑客。

回答

2

由於未曝光,您無法從單元外輕鬆調用此函數。

您可以創建一個調用該函數的控件實例,並說服它執行骯髒的工作。如另一個答案所示,這是完全可行的。

您可以使用反彙編器來查找函數的地址並使用過程變量調用它。 madExcept源代碼是該技術示例的重要來源。

總的來說,在我看來,將源文件複製到代碼是最好的選擇。所有可用的選項都有缺點,這似乎是最簡單的。

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/

它包含更多有用的實用程序和組件。

+0

謝謝你的另一個「緊急」解決方案。我們對JCL有這種依賴性,但因爲我們使用了JCL調試,所以只是臨時發佈。我們計劃移植到Lazarus(只要它支持我們需要的某些Delphi特性),並且JCL是問題AFAIK(以Windows爲中心等等)。所以我現在就留在「複製粘貼」解決方案。 –

1

像大衛說的那樣;將源文件複製到你自己的單位將是最好的。

我相信ColorToPrettyName不會經常更改,但如果您擔心在Delphi升級後它會和您複製的代碼會有所不同,那麼您可以在代碼中添加一個編譯器指令來檢查版本並警告您關於它。然後,您可以更新您的代碼並等到下次您升級您的Delphi時。簡單。

+0

好主意。我認爲將EMBT支持頁面(或現在的WTF)的報告提交給接口部分複製該功能頭文件是沒有意義的。 –

+0

有嘗試的意義。問題是他們是否會發現它是一個需要的練習。但是請嘗試。 –

+3

我沒有看到發表意見的觀點* David是對的*。它提供了哪些附加信息作爲答案?你的第二段會對原始問題或David的回答作出很好的評論,但是它再次沒有提供額外的信息。 –