How do I use enum values when their type is defined indirectly in another unit?

ⅰ亾dé卋堺 提交于 2019-12-11 13:44:36

问题


I am trying to reduce the number of Uses and am running into problems with Enums

(* original unit, where types are defined etc *)
unit unit1;
type
  TSomeEnumType = (setValue1, setValue2, ...);
...

(* global unit where all types are linked *)
unit unit2;
uses unit1;
type
  TSomeEnumType = unit1.TSomeEnumType;
...

(* form unit that will use the global unit *)
unit unitform;
uses unit2;
...
procedure FormCreate(Sender : TObject);
var ATypeTest : TSomeEnumType;
begin
  ATypeTest := setValue1; (* error says undeclared *)
  ATypeTest := TSomeEnumType(0); (* Works but there's not point in use enum *)
end;
...

The problem is that in the unitform setValue1 says it is undeclared. How can I get around this?


回答1:


You can not only import the type, but also the constants, like so:

unit unit1;
type
  TSomeEnumType = (setValue1, setValue2, ...);
...

/* global unit where all types are linked */
unit unit2;
uses unit1;
type
  TSomeEnumType = unit1.TSomeEnumType;
const
  setValue1 = unit1.setValue1;
  setValue2 = unit1.setValue2;
  ...

Note that if the idea is that in the end, all units should use unit2 and never unit1, but you want to allow units that currently use unit1 to continue compiling, another way of dealing with that is to remove unit1, put TSomeEnumType in unit2 directly, and in your project options, put unit1=unit2 in the unit aliases. Every time a unit then does uses unit1;, it will really pull in unit2.



来源:https://stackoverflow.com/questions/16925937/how-do-i-use-enum-values-when-their-type-is-defined-indirectly-in-another-unit

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!