关于集合(0分)

  • 主题发起人 主题发起人 touip
  • 开始时间 开始时间
T

touip

Unregistered / Unconfirmed
GUEST, unregistred user!
比如: 有个集合 var tt: (abc,bcd,cde)
我想通过一个字符串来生成一个tt, 字符串和tt同名,
也就是说如果字符串为'abc',则tt等于abc
我不想用if s='abc' then tt:=abc;
...
有没其他方法?
谁能解决一定给分
 
你要是愿意用复杂的RTTI,应该还是有办法得
 
to wrench:
没关系,能否说下原理,最好给个例子
 
更正一下,你说的这并不是集合型,而是枚举型:)
要答到你的目的也并不复杂:
type
tt = (abc,bcd,cde);
const
tt_s: array[tt] of string = ('abc','bcd','cde');

procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(tt_s[abc])
// 显示abc对应的字符串'abc'
end;
 
to skyweb:
对,谢谢
 
呵呵。这是数组啊。[^]
 
tt是枚举,
tt_s是数组。
那集合是什么,枚举和数组不是集合的一种?
 
问题是我想用case来区别各种情况
但传递进来的参数是字符串
我不想用
if s='abc' then x:=1;
if s='bcd' then x:=2;
.....
case x of
1:
do something
2:
do something
.....
end;
有很多不同的字符串,有没这样一种方法
比如: 有个枚举类型 tt: (abc,bcd,cde)
我想通过一个字符串来生成一个tt, 字符串和tt同名,
也就是说如果字符串为'abc',则tt等于abc

 
反过来依据字符串查找枚举型的时情况,可以用CASE,但用查找的方式更灵活一些,例:
type
tt = (abc,bcd,cde);
const
tt_s: array[tt] of string = ('abc','bcd','cde');

function GetTT(const tt_name: string): tt;
var
i: integer;
begin
for i:=Low(tt) to High(tt) do
if tt_s=tt_name then
begin
Result:=tt(i);
break;
end;
end;
 
使用GetEnumName可以取得枚举类型的元素名称,如
uses
TypInfo;

type
TSomeEnum = (seFirst, seSecond, seThird);
TSomeSet = set of TSomeEnum;
var
AEnum: TSomeEnum;
begin
for AEnum:=Low(TSomeEnum) to High(TSomeEnum) do
WriteLn(GetEnumName(TypeInfo(TSomeEnum), Integer(AEnum)));
end;
 
后退
顶部