设置类型的范围问题

时间:2016-11-18 16:24:21

标签: delphi

我有3个单位这是我的主要单位......

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Panel1: TPanel;
    Panel2: TPanel;
    Panel3: TPanel;
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

Uses Unit2;

{$R *.dfm}


procedure TForm1.FormShow(Sender: TObject);
begin
  Panel1.Visible := oiNone in form2.Settings.OptVars;
  Panel2.Visible := oiHint in form2.Settings.OptVars;
  Panel3.Visible := oiStat in form2.Settings.OptVars;
end;

end.

这是第二个单元 - 由第一个使用。     单位Unit2;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Unit3;

type
  TForm2 = class(TForm)
    CheckBox1: TCheckBox;
    CheckBox2: TCheckBox;
    CheckBox3: TCheckBox;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    Settings: TSettings;
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.FormCreate(Sender: TObject);
begin
  Settings := TSettings.Create;
  Checkbox1.Checked := oiNone in Settings.OptVars;
  CheckBox2.Checked := oiHint in Settings.OptVars;
  CheckBox3.Checked := oiStat in Settings.OptVars;
end;

procedure TForm2.FormDestroy(Sender: TObject);
begin
  Settings.Free;
end;

end.

这是第二个单元使用的单位,包含其他单位使用的Set类型。

unit Unit3;

interface

Uses
  winAPI.windows,system.classes;

Type
  TOptions = Set Of (oiNone, oiHint, oiStat);

  TSettings = class

  private
    fMyOption:    TOptions;
  public
    Constructor Create;
    Destructor Destroy;
    property OptVars: TOptions read fMyOption write fMyOption;
  end;


implementation

constructor TSettings.Create;
begin
  fMyOption := [oiNone, oiHint, oiStat];
end;

destructor TSettings.Destroy;
begin

end;

end.

在第二个单元中,oiNone,oiHint,oiStat项目均可访问并且在范围内。

在第一个单元中,oiNone,oiHint和oiStat项目不可访问且在范围内,尽管可以访问作为TOption数据类型的Settings.OpVars。

我想不出更好的方式来描述我的问题。如果将这些项目放入项目中,您应该会看到问题。

2 个答案:

答案 0 :(得分:4)

更新

在最新的编辑之后,很明显我的第一次预感是正确的。您没有使用声明该类型的单位。名称已更改,但在当前编辑中,您的问题是主单元不使用Unit3

您需要引用声明集类型的单元及其枚举类型。将UnusedItemsReg添加到第三个单元的uses子句中。

如果您已经这样做了,那么我能想到的唯一其他解释是您在启用了作用域枚举的情况下进行编译。但我现在抓着稻草。

我肯定会建议您将枚举类型声明为自己的命名类型。当然,如果你使用范围的枚举,那么你需要这样做。但迟早你会想要提供这种类型。

type
  TOption = (oiNone, oiHint, oiStat); 
  TOptions = set of TOption;

如果你确实使用了范围的枚举,那么你将会像这样引用:

TOption.oiNone

答案 1 :(得分:3)

您需要在主单元的(a)使用条款中使用Unit3。否则它无法看到类型TOptions。这是Delphi要求可视性的要求。它不使用您似乎正在寻找的隐式引用。