2011-06-27 21 views
4

使用Delphi 2010 ... 我有一組二進制屬性,我想組合在一起。我已經將它定義爲...在Delphi中,跨單元使用類型定義的問題

type 
    TTableAttributeType = (
     tabROOT = 1, 
     tabONLINE = 2, 
     tabPARTITIONED = 3, 
     tabCOMPRESSED = 4, 
     ); 

// Make a set of of the Table Attribute types... 
type 
     TTableAttrSet = Set of TTableAttributeType; 

在我的MAIN.PAS單元中,我可以創建一個類型爲TTableAttrSet的變量。 另一個單元,UTILS.PAS也需要理解TTableAttrSet類型。這是照顧的使用條款...

主要用途實用程序... 實用程序主要(第2使用條款,在實施部分,所以我沒有得到循環參考問題....

到目前爲止一切順利。我的問題是,我需要通過類型TTableAttrSet的變種變量從主到utils的。

在main.pas

procedure TForm1.Button1Click(Sender: TObject); 
    var 
    TabAttr : TTableAttrSet; 

    begin 
    TestAttr (TabAttr); 
    end; 

和UTILS.PAS,我有

procedure TestAttr(var Attr: TTableAttrSet); 
begin 
     Attr := [tabROOT, tabCOMPRESSED]; 
end; 

當我嘗試這個,我遇到了幾個問題... 問題1)。當我定義在utils.pas頂我的過程定義,

procedure TestAttr(var Attr: TTableAttrSet); 

我得到TTableAttrSet是一個未聲明的標識符錯誤。這是有道理的,因爲定義在Main.pas中,'使用Main.pas'是在我的過程定義之後。我如何解決這個問題?現在,我已經在Utils.pas文件和Main.pas文件的頂部重複了TTableAttrSet類型定義,但這看起來並不正確。

問題2)。我遇到的更大的問題是編譯錯誤。在Main.pas的呼叫線上

TestAttr(TabAttr); 

我得到錯誤'類型的實際和正式的變量參數必須是標識'。據我所知他們是相同的。編譯器在抱怨什麼?

+0

循環引用有什麼問題? –

回答

6

簡單的解決方案是將TTableAttributeType的聲明移至Utils單元。你不能申報兩次,因爲那時你有兩種截然不同的類型。這對你沒用,你只需要一種類型。

只要主單元不需要在其接口部分中引用TTableAttributeType,此解決方案就可以工作。由於Utils單元顯然需要這樣做,因此會在單元接口部分之間創建循環依賴,這是非法的。

如果Main和Utils單元在它們的接口部分中都需要引用TTableAttributeType,那麼您需要創建另一個只包含類型聲明的單元。該單位可供Utils和Main在其interface部分中使用。

相關問題