2016-01-11 39 views
0

我有我的應用程序日誌記錄的輔助形式,我有一個過程AddLine公共過程在Delphi XE8不可見

type 
    TFormLog = class(TForm) 
    Memo1: TMemo; 
    private 
    procedure AddLine(aString: String); 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    FormLog: TFormLog; 

implementation 

{$R *.dfm} 

{ TFormLog } 

procedure TFormLog.AddLine(aString: String); 
begin 
    Memo1.Lines.Add(aString); 
end; 

當我使用自動完成(按Ctrl-Shift_C)德爾福添加AddLine程序到private部分,所以很明顯的程序是不可見的主要形式,當我嘗試

FormLog.AddLine('some text'); 

移動的聲明向公衆部分沒有幫助:

type 
    TFormLog = class(TForm) 
    Memo1: TMemo; 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    procedure AddLine(aString: String); 
    end; 

我仍然收到一個編譯器錯誤,AddLine過程未解決。我確實將日誌單元添加到uses子句中,因此在主窗體中已知Formlog
試圖直接訪問TMemo具有相同的效果。

如何修復我的代碼,以便我可以將文本添加到我的主窗體的日誌窗體中?

+1

移動'AddLine'市民節並保存表單。將該單位添加到您的項目。如果這不起作用,那麼編譯器必須正在拾取具有相同名稱的另一個單元或使用先前編譯的單元(以某種方式不能看到源)。 –

+0

至於拿起另一個單元,我會開始procmon,開始編譯,停止procmon並驗證.pas文件被編譯。很可能,這不是你所假設的。 –

+0

報告您的實際錯誤並顯示實際存在問題的代碼,而不是可以工作的代碼。正確的代碼是無關緊要的。使用複製和粘貼來報告編譯器錯誤,而不是「它不工作」或「我得到一個編譯器錯誤」。 –

回答

1

公共成員從其他單位的代碼可見。可能的解釋爲您的錯誤包括:

  1. 該方法是不公開的。
  2. 您的實例變量不是您認爲它的類型。
  3. 您不會編譯您認爲正在編譯的代碼,或者鏈接器正在查找您無意找到的代碼。

您也說:

試圖訪問TMemo直接有同樣的效果。

此外,由於已發佈可見性,因此可以從單位外部看到。很明顯,類似於上述第2項或第3項的事情正在發生。

底線是可以從任何代碼中看到公共(和發佈)成員。問題出在你的代碼中(只有你可以看到),你應該試着通過詢問代碼來解決這個問題,而不是擔心編譯器有缺陷。

在更廣泛的層面上,問題中提供的代碼將該方法聲明爲private。顯然,該成員從單位外部不可見。作爲一般規則,您應該提供您要求幫助的代碼。

此外,如果您詢問編譯器錯誤,請逐字報告錯誤。描述你對錯誤的理解是混淆的一個豐富來源。人們很容易誤解編譯器錯誤。如果他們然後形容他們的誤解,通信就會崩潰。逐字報告編譯器錯誤,然後誤解爲零。

+0

謝謝大衛。我怎麼說編譯器有缺陷?我應該說,無處可去。此外,我所顯示的代碼是Delphi所做的(將聲明放在私有部分中)。我說我把它移到了「公共」。 –

+0

最好顯示您希望我們評論的代碼。就我們所知,你沒有成功將代碼移動到公共部分。在我看來,你認爲你有一個不可見的公衆成員。如果你認爲是這種情況,那麼這將是一個編譯器缺陷。 –

-1

我相信AddLine在VCL Delphi的某些地方是私有的。

從而試圖改變程序/方法名 例如一個名字完全diferent您的姓名呵呵呵,看到了發生錯誤的測試訪問的變量或對象插入到你的PROC /法

或創建一個新項目測試

注意:如果ADDLINE是MEMO的一個方法,所以編譯器無法解析什麼叫會做(我認爲是)

相關問題