集合与枚举。。。。这该如何运算?知道的帮帮忙,不知道的帮UP。。谢谢~ (100分)

Y

youou

Unregistered / Unconfirmed
GUEST, unregistred user!
type
//枚举类型:
TTestItem=(tiBuWu,tiPurRed,tiPurGreen,tiCutoffRaster,tiWhiteBright,tiWindowBright,
tiRaster,tiBalance93K,tiBalance65K);

// 集合类型:
TTestItems=set of TTestItem;
//================================
var
tis:TTestItems;
//=================================
procedure TForm2.Button1Click(Sender: TObject);
var
tis : TTestItems;
ti : TTestItem;
i : integer;
begin

tis:=[tiBuWu,tiBalance93K,tiBalance65K]

ti:=
end;
//1.如何取得集合中的每一个值?
//2.取出后怎样赋给枚举类型?
对于枚举类型可以运用GetEnumValue及GetEnumName
那集合该如何操作?






 
TTestItems=set of TTestItem;
改成
TTestItems=array[1..Max] of TTestItem;

tis[1]:=ti;
 
这样不符要求的。。
程序需要用集合类型的。。
 
回复人: failer(独败) ( ) 信誉:100 2003-01-12 22:19:00 得分:0
const setlength=8 //表示集合长度的常量,用集合元素个数减一;

procedure TForm2.Button1Click(Sender: TObject);
var
tis : TTestItems;
ti : TTestItem;
i : integer;
begin

tis:=[tiBuWu,tiBalance93K,tiBalance65K]

for i:=0 to setlength do
begin
if TTestItem(i) in tis //判断元素是否在集合中
then
ti:=TTestItem(i);赋给枚举类型
//do something;
end;
end;


以上运用了强制类型转换来达到目的。



 
正确答案:

var I:TTestItem;
tis TTestItems;
ti:TTestItem;
begin
for I=low(I) to High(I) do
if I in tis then
ti:=I;
end;
 
to Headchen:
这个方法跟上面的差不多。。

还有没有其他办法?
 
首先,delphi好像没有提供求集合的单元素子集(即你说的每一个值)个数的函数。这样就要你自己编。
然后,取出来的也是子集,怎么能够给枚举类型赋值呢?只能用序号强制转换。

欢迎指教。
 
procedure TForm1.Button1Click(Sender: TObject);
Type PInt64=^Int64;
var a,b:Int64;
BIS:TBorderIcons;
begin
BIS:=[biSystemMenu,biMaximize];
a:=Ord(biMaximize)*2;
b:=0;
move(BIS,b,Sizeof(BIS));
if (a and b)=a then
ShowMessage('biMaximize is in set:[biSystemMenu,biMaximize]');
end;

不过本程序只支持最长8个字节的集合(当然一般来说是够了),对于某些特大的集合来说,并不一定是低于8个字节的,就不一定会对了.

一般我们使用的集合都是1个字节或者两个字节的.
 

procedure TForm1.Button1Click(Sender: TObject);
Type PInt64=^Int64;
var a,b,c,i:Int64;
BIS:TBorderIcons;
str:String;
m:TBorderIcon;
begin
BIS:=[biSystemMenu,biMaximize,biHelp];
a:=Ord(biMaximize)*2;
b:=0;
move(BIS,b,Sizeof(BIS));
if (a and b)=a then
ShowMessage('biMaximize is in set:[biSystemMenu,biMaximize]');

i:=0;
While b<>0 do
begin
c:=b MOD 2;
b:=b DIV 2;
if c<>0 then
begin
m:=TBorderIcon(i);//这里即得到包含在BIS中的一个元素.
str:=GetEnumName(TypeInfo(TBorderIcon),ORD(m));
ShowMessage(str);
end;
inc(i);
end;
end;
 
顶部