在 Delphi 中,跨单元使用类型定义时出现问题

发布于 2024-11-17 03:15:24 字数 1351 浏览 4 评论 0原文

使用德尔福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 USES 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 文件和 Main.pas 的顶部复制了 TTableAttrSet 类型定义,但这“似乎不是正确的方式”。

问题2)。我遇到的更大问题是编译错误。在 Main.pas 的调用行上,

TestAttr(TabAttr);

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

Using Delphi 2010...
I have a set of binary properties I want to group together. I have defined it as such...

type
    TTableAttributeType = (
        tabROOT = 1, 
        tabONLINE = 2, 
        tabPARTITIONED = 3, 
        tabCOMPRESSED = 4,  
        );

// Make a set of of the Table Attribute types...
type
      TTableAttrSet = Set of TTableAttributeType;

In my MAIN.PAS unit, I can create a variable of type TTableAttrSet.
Another Unit, UTILS.PAS needs to understand the TTableAttrSet type as well. That is taken care of by the USES clauses...

Main USES Util...
Util USES Main (The 2nd uses clauses, under implementation section, so I don't get circular reference problems....

So far so good. My problem is that I need to pass a var variable of type TTableAttrSet FROM main to Utils.

In main.pas

procedure TForm1.Button1Click(Sender: TObject);
    var
    TabAttr : TTableAttrSet;

    begin
    TestAttr (TabAttr);
    end;

and in UTILS.PAS, I have

procedure TestAttr(var Attr: TTableAttrSet);
begin
      Attr := [tabROOT, tabCOMPRESSED];
end;

When I try this, I run into several problems...
Problem 1). When I define my procedure definition at the top of utils.pas,

procedure TestAttr(var Attr: TTableAttrSet);

I get the error that TTableAttrSet is an Undeclared Identifier. This makes sense because the definition is in Main.pas, and the 'uses Main.pas' is AFTER my procedure definitions. How do I get around this? For now, I have duplicated the TTableAttrSet type definition at the top of the Utils.pas file as well as Main.pas, but this does not 'seem the right way'.

Problem 2). The bigger issue that I am running into is a compile error. on the calling line in Main.pas

TestAttr(TabAttr);

I get the error 'Types of actual and formal var parameters must be identifical'. To my knowledge they are identical. What is the compiler complaining about?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

阳光的暖冬 2024-11-24 03:15:24

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

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

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

The simple solution is to move the declaration of TTableAttributeType to the Utils unit. You can't declare it twice because then you have two distinct types. That's no use to you, you need only a single type.

This solution will work so long as the Main unit does not need to reference TTableAttributeType in its interface section. Since the Utils unit clearly needs to do so then that would create a circular dependency between unit interface sections which is illegal.

If both the Main and Utils units need to reference TTableAttributeType in their interface sections then you need to create another unit that just contains type declarations. That unit could be used by both Utils and Main in their interface sections.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文