2011-10-31 20 views
0

德爾福7 - 如果我做一個新項目,並添加一行電話LastDelimiter()將無法編譯

spacePos := LastDelimiter(' ' , 'spaced out'); 

它建立。

如果我嘗試在我自己的項目中使用LastDelimiter,它會失敗。

我開始與一個雄鹿比較LastDelimter(#$D#$A, myString)和文失敗,我嘗試與上面的留置權,這也失敗了。

我做use SysUtils,但是當我創建一個新項目時甚至沒有這個必要。

如果我註釋掉那條線,我真正的項目建立得很好。如果我取消註釋,我會得到「缺少操作符或分號」。如果我將LastDelimiter移動到任務上,即使在它所在的函數的第一行上,也是如此 - 它看起來不像前一行中的問題。

任何想法(短我發佈幾klocs)?

感謝

+1

將代碼縮小到最小限度的複製。當你這樣做時,你可能會自己解決它。 –

+0

您需要向我們展示涉及對LastDelimiter的調用的代碼。 –

+0

procedure TForm1.test; var spacePos:Integer; 開始 spacePos:= LastDelimiter('','position of space'); 結束; - 在新創建的D7項目中工作得很好。沒有使用添加,表單上沒有任何內容。 –

回答

5

在你的範圍也許冥冥中一個全局變量定義類似於以下內容:

var 
    LastDelimiter: Integer; 

檢查項目中使用的單位。它應該是接口部分中聲明的全局變量。

或者它可能是一個常數,在接口部分聲明,與此類似:

const 
    LastDelimiter = 32; 
+0

德哦!我怎麼這麼笨(而不是發現它)? – Mawg

4

你所學到的命名空間或標識符或「範圍碰撞」就是今天。在實現或接口使用子句中的某個單元也定義了LastDelimiter,並且由於它是最內層或最近的聲明,因此它將呈現SysUtils中的特定標識符,直到您指定SysUtils前綴。

當你有命名空間衝突,你應該與它的單元名稱限定函數名,然後它會編譯您:

x := SysUtils.LastDelimiter(....); 

正是由於這個原因,一些開發商誰是舒適的,如C#語言和Java來一直要求命名空間中指定,因而其代碼如下所示:

x := namespace.Thing1.Thing2.GetInput(...); 

只是因爲我們並不總是這樣做,在德爾福並不意味着沒有時間的時候,你應該這樣做。