2011-06-27 4 views
4

Delphi 2010の使用... 私は一緒にグループ化するバイナリプロパティのセットを持っています。私はタイプTTableAttrSetの変数を作成することができ、私のMAIN.PASユニットで、このような...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; 

としてそれを定義しています。 別のユニットでは、UTILS.PASもTTableAttrSetタイプを理解する必要があります。それはUSES条項によって処理されます...

メインUSES Util ... Util USES Main(2番目の節は実装セクションの下にありますので、循環参照の問題は発生しません....

これまでのところは良い。私の問題は、私は、メインFROM UtilsのにタイプTTableAttrSetのVAR変数を渡す必要があるということです。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)。私が実行している大きな問題は、コンパイルエラーです。

TestAttr(TabAttr); 

「実際と正式なvarパラメータの型は同一でなければなりません」というエラーが表示されます。私の知る限り、彼らは同じです。コンパイラは何について苦情を言いますか?

+0

循環参照にどのような問題がありますか? –

答えて

6

簡単な解決策は、TTableAttributeTypeの宣言をUtilsユニットに移動することです。 2つの異なるタイプがあるため、2回宣言することはできません。それはあなたには役に立たない、あなたはただ一つのタイプしか必要としない。

この解決方法は、メインユニットがインターフェイスセクションでTTableAttributeTypeを参照する必要がない限り有効です。 Utilsユニットは明らかにそうする必要があるので、ユニットインタフェースセクション間の循環依存関係は不法である。

MainセクションとUtilsユニットの両方がインタフェースセクションでTTableAttributeTypeを参照する必要がある場合は、タイプ宣言だけを含む別のユニットを作成する必要があります。そのユニットは、interfaceセクションのUtilとMainの両方で使用できます。

関連する問題