4

使用 Delphi 2010... 我有一组要组合在一起的二进制属性。我已经这样定义了...

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 使用 Util... Util 使用 Main (第二个使用子句,在实现部分下,所以我没有遇到循环引用问题......

到目前为止,一切都很好。我的问题是我需要将 TTableAttrSet FROM main 类型的 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 中,而“使用 Main.pas”在我的过程定义之后。我该如何解决这个问题?目前,我已经在 Utils.pas 文件和 Main.pas 的顶部复制了 TTableAttrSet 类型定义,但这“似乎不是正确的方法”。

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

TestAttr(TabAttr);

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

4

1 回答 1

6

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

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

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

于 2011-06-27T12:48:29.680 回答