在Delphi中,跨单元使用类型定义的问题

在Delphi中,跨单元使用类型定义的问题,delphi,types,units-of-measurement,definitions,Delphi,Types,Units Of Measurement,Definitions,使用Delphi2010。。。 我有一组要组合在一起的二进制属性。我把它定义为 type TTableAttributeType = ( tabROOT = 1, tabONLINE = 2, tabPARTITIONED = 3, tabCOMPRESSED = 4, ); // Make a set of of the Table Attribute types... type T

使用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条款负责的

主要用途。。。 Util使用Main(第二个使用子句,在实现部分下,所以我不会遇到循环引用问题

到目前为止还不错。我的问题是我需要将TTableAttrSet类型的var变量从main传递到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文件顶部的TTableAttrSet类型定义以及Main.pas,但这“似乎不是正确的方法”

问题2)。我遇到的更大的问题是编译错误。在Main.pas中的呼叫线路上

TestAttr(TabAttr);

我得到的错误是“实际和形式var参数的类型必须是可识别的”。据我所知,它们是相同的。编译器在抱怨什么?

简单的解决方案是将
TTableAttributeType
的声明移动到Utils单元。不能声明两次,因为这样就有两种不同的类型。那对你没用,你只需要一种类型

只要主单元不需要在其接口部分中引用
TTableAttributeType
,此解决方案就可以工作。由于Utils单元显然需要这样做,因此这将在单元接口部分之间创建循环依赖关系,这是非法的


如果Main和Utils单元都需要在其接口部分中引用
TTableAttributeType
,那么您需要创建另一个仅包含类型声明的单元。UTIL和Main在其
界面
部分都可以使用该单元。

循环引用有什么问题?