2010-02-01 73 views
1

說我有有一個getter返回私人變種的財產

type 
    TLight = class 
    private 
    Ftimer : TTimer; 
    property IsAutoRotating: Boolean read Ftimer.Enabled; 

很明顯的價值,這不能編譯,但爲什麼不和如何解決這個(最好不保持這種狀態在一個單獨的變種。

+1

是什麼讓你認爲它會或應該編譯?回答這個問題將有助於確定你對問題「原因」部分的期望是什麼樣的回答。 – 2010-02-01 15:35:53

+0

Rob +如果ftimer是NIL會怎麼樣? – 2010-02-01 16:19:49

回答

3

吸氣和屬性的設置器應該是類的一個方法或它的父 - 或 - 類的一個字段或它的父

由於FTimer.Enabled既不是上述構建體不會工作 您可能會創建一個getter函數和setter方法將返回FTimer(吸氣)的這個屬性和設置FTimer(二傳)的這個屬性:

類型:

property Enabled: Boolean read GetEnabled write SetEnabled; 

現在按Ctrl-Shift-C類完成。現在爲您創建2種方法。

在吸氣類型:

Result := FTimer.Enabled; 

在二傳手類型:

FTimer.Enabled := Value; 

的Et瞧!

5

您的代碼不會編譯,因爲屬性讀寫說明符必須引用該類的字段或方法。 Ftimer.Enabled既不是這些。

爲了實現IsAutoRotating屬性,你需要創建一個getter函數:

type 
    TLight = class 
    private 
    Ftimer : TTimer; 
    function GetIsAutoRotating: Boolean; 
    public 
    property IsAutoRotating: Boolean read GetIsAutoRotating; 
    end; 

function TLight.GetIsAutoRotating : Boolean; 
begin 
    Result := Ftimer.Enabled; 
end; 
+0

而且,您可能希望將屬性IsAutoRotating移動到類聲明的'published'部分。 – 2010-02-01 16:57:05

+0

並防止未分配FTimer時產生的AV。 – skamradt 2010-02-01 17:22:36

+0

爲什麼你會推薦發佈那個屬性,PA?我沒有看到證據表明該屬性需要通過字符串名稱來訪問。 – 2010-02-02 03:28:55