有没有办法把字符串赋给集合变量?

WuLoveXue 2004-12-03 02:54:26
就有如GetEnumValue()这种函数.

type
a : (a1,a2,a3);
sa : set of a;
var
str : string;
b : sa;
begin
str := '(a1,a2)';
b := ????(str); //有没有这函数?
end;
...全文
197 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
WGYKING 2004-12-04
  • 打赏
  • 举报
回复
基本知识
但是很多人不知
通过FAQ
WuLoveXue 2004-12-04
  • 打赏
  • 举报
回复
呵呵,就是谢谢故国晚秋!
lxpbuaa 2004-12-04
  • 打赏
  • 举报
回复
1、{$M+}和{$M-}开关起什么作用?
{$M+}让编译器给TOneClass 生成运行时类型信息,这样才能对TOneClass做GetPropInfo操作。
2、还有这句PInteger(@R)^ := V;这句是怎么把一个整数转成集合变量的,非常感谢!
在Delphi内部,枚举是用一个Byte整数表示的,相应的集合不过就是枚举指的一个累加,也是一个整数。PInteger(@R)^ := V中先用PIntger(R)^得到一个指向集合R的指针,然后转化为一个整数,最后就可以给它赋值了。
lxpbuaa 2004-12-03
  • 打赏
  • 举报
回复
或者:
uses TypInfo;


type

TE = (a1, a2, a3);
TS = set of TE;
{$M+}
TOneClass = class
private
FProp: TS;
published
property Prop: TS read FProp;
end;
{$M-}

procedure TForm1.Button1Click(Sender: TObject);
var
S: string;
V: Integer;
R: TS;
begin
S := '[a1,a2]';
V := StringToSet(GetPropInfo(TOneClass, 'Prop'), S);
PInteger(@R)^ := V;
end;
lxpbuaa 2004-12-03
  • 打赏
  • 举报
回复
uses TypInfo;


type

TE = (a1, a2, a3);
TS = set of TE;

procedure TForm1.Button1Click(Sender: TObject);
var
I, V0, V: Integer;
Strs: TStrings;
E: TE;
S: string;
R: TS;
begin
Strs := TStringList.Create;
Strs.Text := 'a1'#13'a3'; //包含a1,a3
V := 0;
V0 := 1;
for E := Low(TE) to High(TE) do
begin
S := GetEnumName(TypeInfo(TE), Ord(E));
if Strs.IndexOf(S) <> -1 then
begin
for I := 1 to Ord(E) do
V0 := V0 * 2;
Inc(V, V0);
end;
end;
Strs.Free;
PInteger(@R)^ := V;

if a1 in R then ShowMessage('OK');
end;
nyf1220 2004-12-03
  • 打赏
  • 举报
回复
似乎没有吧,自己写个
ljyt 2004-12-03
  • 打赏
  • 举报
回复
没有,你自己写一个嘛
zzlingaaa 2004-12-03
  • 打赏
  • 举报
回复
UP一下,我是没做到,因为delphi的集合元素必须是有序类型...

16,749

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧