2012-03-23 74 views
0

我想定義常量與記錄,其中一個變量是類。 和接收錯誤: [DCC錯誤] usample.pas(18):E2026常量表達式預期通過類記錄

類和記錄聲明在1單元

type TParentClass = class (TObject) 
function Call(s: string) : boolean; 
end; 

type TMyRecord = record 
s: string; 
c: TParentClass; //or TClass 
end; 

而且UNIT2與子類並記錄:

type TChildClass = class (TParentClass); 
procedure two; 

var: 
    class_var: TChildClass; 

const 
rec_var : array[0..1] of TMyRecord = (
    (s : ''; c : class_var) //Error with class_var. 
); 

UPD:我想填寫Class中的記錄和本類中的unit1搜索功能。它是一個團隊項目。

UPD2:

const 
    class_var: TChildClass = nil; 

同樣的錯誤。

+3

這根本無法完成。一個常量只能包含常量。 – 2012-03-23 20:26:04

+0

你想做什麼?在哪裏設置'class_var'? – 2012-03-23 20:31:33

回答

2

因爲編譯器說,你必須在那裏放一個常量,但是你將class_var定義爲一個變量。

將class_var更改爲聲明爲常量而非變量。

但這不能真正做到:

const 
    class_var = TParentClass; 

是不允許的。

而且

const 
    class_var : TClass = TParentClass; 

是不是一個真正的不斷,你不能使用它的另一個不變的聲明中。

+0

@Françoisvar: const class_var:TChildClass = nil; 同樣的錯誤。 – 2012-03-23 20:39:38

+0

@МиколаРоманюк,看我的更新。你需要一個**「真實」**常數。 – 2012-03-23 20:47:58

+0

@Françoisvar:那麼我可以嘗試在Class常量的類之間使用指針嗎? – 2012-03-23 22:25:37

0

您無法定義一個具有初始化爲變量內容的字段的常量。編譯器需要在編譯時評估const,即當class_var甚至沒有位置時,不要介意任何內容。

忘記這個想法。如果可以,將rec_var聲明爲變量並在運行時加載它。

2

在你最新的更新你問爲什麼,這並不編譯:

const 
    class_var: TChildClass = nil; 

rec_var: TMyRecord = (s: ''; c: class_var); 

無法編譯是class_var不是true constant的原因。你可以這樣寫:

rec_var: TMyRecord = (s: ''; c: nil); 

因爲nil是一個真正的常數。

我竭力要得到你真正想要做一個把手,但我的直覺告訴我,一個不變的是不是你所需要的。我認爲你將需要使用在啓動時初始化的變量。

+0

是的,它的工作,但我需要改變無創建類變量,它需要函數,也必須傳遞給記錄。 – 2012-03-23 22:29:28

+0

我不明白。 – 2012-03-23 22:34:49

+0

我想op意味着,指針可以是const,所以類指針不會改變,但是類本身可能會改變。 – none 2012-03-25 14:10:47