我有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。
我想不出更好的方式来描述我的问题。如果将这些项目放入项目中,您应该会看到问题。
答案 0 :(得分:4)
在最新的编辑之后,很明显我的第一次预感是正确的。您没有使用声明该类型的单位。名称已更改,但在当前编辑中,您的问题是主单元不使用Unit3
。
您需要引用声明集类型的单元及其枚举类型。将UnusedItemsReg
添加到第三个单元的uses子句中。
如果您已经这样做了,那么我能想到的唯一其他解释是您在启用了作用域枚举的情况下进行编译。但我现在抓着稻草。
我肯定会建议您将枚举类型声明为自己的命名类型。当然,如果你使用范围的枚举,那么你需要这样做。但迟早你会想要提供这种类型。
type
TOption = (oiNone, oiHint, oiStat);
TOptions = set of TOption;
如果你确实使用了范围的枚举,那么你将会像这样引用:
TOption.oiNone
答案 1 :(得分:3)
您需要在主单元的(a)使用条款中使用Unit3。否则它无法看到类型TOptions。这是Delphi要求可视性的要求。它不使用您似乎正在寻找的隐式引用。