使用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 USES 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参数的类型必须是标识的'。据我所知,他们是完全相同的。什么是编译器抱怨?
答案 0 :(得分:6)
简单的解决方案是将TTableAttributeType
的声明移到Utils单元。你不能两次声明它,因为那时你有两种不同的类型。这对你没用,你只需要一种类型。
只要主设备不需要在其接口部分引用TTableAttributeType
,此解决方案就可以正常工作。由于Utils单元显然需要这样做,否则会在单元接口部分之间产生循环依赖,这是非法的。
如果Main和Utils单元都需要在其接口部分引用TTableAttributeType
,那么您需要创建另一个仅包含类型声明的单元。 Utils和Main在他们的interface
部分中可以使用该单元。