在Delphi中,跨单元使用类型定义的问题
使用Delphi2010。。。 我有一组要组合在一起的二进制属性。我把它定义为在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
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在其界面
部分都可以使用该单元。循环引用有什么问题?