2010-02-01 95 views
0

從C#背景發送我想學Delphi。 我在我的表單中遇到訪問衝突,我按下了一個創建TLight實例的按鈕。 無論我嘗試訪問我的私人FState,我都會遇到訪問衝突。初始化私人變量創建AccessViolation

我錯過了什麼?

unit Light; 
interface 
uses sysUtils; 

type 
    TLightStates = (Red, Orange, Green); 
type 
    TLight = class 
    private 
     Fstate : TLightStates; 
    published 
     Constructor Create(); overload; 
     procedure SetState(const Value: TLightStates); 
     Property State : TLightStates 
     read Fstate 
     write SetState; 
    end; 

implementation 
{ TLight } 
    constructor TLight.Create; 
    begin 
     Fstate := TLightStates.Red; 
    end; 

    procedure TLight.SetState(const Value: TLightStates); 
    begin 
     Fstate := Value; 
    end; 
end. 

回答

3

你創建你的測試代碼的對象,向財產狀態設置?

var 
    x: TLight; 
begin 
    x := TLight.Create; 
    x.Light := Orange; 
    x.Free; 
end; 

看着代碼,這應該可以正常工作。

另一件事:爲什麼你指定了帶重載的構造函數:你從TObject派生,它沒有虛擬構造函數,所以在這裏不應該指定重載。關於上面這段代碼

+0

啊哈,我沒有初始化它在C#枚舉不需要創建。我壓倒一切的原因是因爲我在教程中看到了這種情況;)我現在看到這是毫無意義的。 Thx – 2010-02-01 12:35:35

+2

@Ritsaert - 你其實意味着重寫而不是重載;覆蓋會導致應用於非虛擬方法時的語法錯誤;超載可以應用於任何方法,這裏只是沒有意義。 – kludg 2010-02-01 13:03:18

+1

>我沒有初始化它,因爲在C#中不需要創建枚舉。 delphi枚舉不需要被實例化。在C#中,您可以聲明一個對象,以便它自動創建(並銷燬)。令人遺憾的是,德爾福沒有這個。 – 2010-02-01 13:34:50

2

一個評論:

var 
    x: TLight; 
begin 
    x := TLight.Create; 
    TRY 
    x.Light := Orange; 
    FINALLY 
    x.Free; 
    END; 
end; 

「try」和「最後」(以上用於可讀性大寫)確保x將被釋放。 正如你可能已經知道,有在Delphi中沒有垃圾收集,以便釋放你的對象是一個必須 ...

關於您最初的一段代碼: 你創造應該是虛擬和公衆。 小意見:

  1. TLightStates =(紅,橙,綠) 實際上應該TLightState = (紅,橙,綠)(無 「S」,因爲 添加一個 「s」 通常會意味着 TLightState)
  2. 您的SetState程序理想情況下應該被保護,而不是 已發佈。

心連心, kuzkot

+2

絕對沒有必要將Create聲明爲虛構構造函數 - 這至少是毫無意義的。 – kludg 2010-02-01 13:10:47

+0

-1。不回答這個問題,並且對於代碼來說過於迂腐,真的很好。請將*註釋*用於與手頭問題無關的事物。 (一旦你獲得了更多的聲望點,你將被允許發表評論。)歡迎來到Stack Overflow。 – 2010-02-01 15:47:32

+2

同意這應該是一個評論。但「過於迂腐」?我看到了一些有效的觀點 - 終極試用,枚舉命名約定,不會讓制定者發佈。 – 2010-02-01 15:53:41