4

Delphi2010を使用しています...グループ化したいバイナリプロパティのセットがあります。私はそれをそのように定義しました...

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タイプも理解する必要があります。それはUSES条項によって処理されます...

Main USES Util ... Util USES Main(2番目のuses句は、実装セクションの下にあるため、循環参照の問題は発生しません...。

ここまでは順調ですね。私の問題は、TTableAttrSetFROMmain型のvar変数を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にあり、「uses Main.pas」がプロシージャ定義の後にあるため、これは理にかなっています。これを回避するにはどうすればよいですか?今のところ、Utils.pasファイルとMain.pasの先頭にTTableAttrSetタイプ定義を複製しましたが、これは「正しい方法ではないようです」。

問題2)。私が遭遇しているより大きな問題は、コンパイルエラーです。Main.pasの呼び出し回線

TestAttr(TabAttr);

「実際の変数パラメーターと正式な変数パラメーターのタイプは同一である必要があります」というエラーが表示されます。私の知る限り、それらは同一です。コンパイラは何について不平を言っていますか?

4

1 に答える 1

6

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

TTableAttributeTypeこのソリューションは、メインユニットがインターフェイスセクションで参照する必要がない限り機能します。Utilsユニットは明らかにそうする必要があるので、それはユニットインターフェイスセクション間に循環依存を作成しますが、これは違法です。

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

于 2011-06-27T12:48:29.680 に答える