请问各位高手,如何把字符串类型和集合类型互转?(50)

  • 主题发起人 chenzhong
  • 开始时间
C

chenzhong

Unregistered / Unconfirmed
GUEST, unregistred user!
学到集合类型了,什么交啊,并啊,一下理解的不是很清楚,所以想自己写个小工具来加强记忆,没事的时候可以去玩几下。程序设计思路就是2组数字,用随机函数了,然后把结果显示到edit1.text和edit2.text现在问题是,进行集合运算时类型不同,运行不了。想了N个办法,开始想写函数,快写完了,竟然还是类型不同,我晕,好笑。又想到指针,结果还是不同直接声明为集合,又不会随机把集合成员变个数字。况且,要显示到EDIT筐。我又不会赚了。。我真的想搞定他,但本人技术有限制,只能来这碰碰运气了,希望各位高手 指教。把字符串类型转成集合类型把集合类型转成字符串类型
 
V

vvyang

Unregistered / Unconfirmed
GUEST, unregistred user!
1、从理论上讲,字符串本体和集合的本质是相同的,他们在内存中的状态是相同的,都是0、1代码...2、从理智上讲,好像集合内元素是无序的(例如不能因为别人出生晚就说人家不是地球人),而字符串是有序的(例如不能把“情调”说成“调情”)...3、多了不说了...
 
W

wr960204

Unregistered / Unconfirmed
GUEST, unregistred user!
uses TypInfo;type TSetDemo = set of(S1, S2, S3, S4);procedure StrToSet(TypeInfo: PTypeInfo;
const Value: string;
out Result);
function NextWord(var P: PChar): string;
var I: Integer;
begin
while P^ in [',', ' ', '[', ']']do
Inc(P);
I := 0;
while P in ['A'..'Z', 'a'..'z', '0'..'9', '_']do
Inc(I);
SetString(Result, P, I);
Inc(P, I);
end;
type TMaxSet = set of Byte;var ElemTypeInfo: PTypeInfo;
ElemTypeData: PTypeData;
P: PChar;
EnumName: string;
I, ElemValue: Integer;
begin
ElemTypeInfo := GetTypeData(TypeInfo)^.CompType^;
ElemTypeData := GetTypeData(ElemTypeInfo);
for I := ElemTypeData^.MinValue to ElemTypeData^.MaxValuedo
Exclude(TMaxSet(Result), I);
P := PChar(Value);
repeat EnumName := NextWord(P);
if EnumName = '' then
Break;
ElemValue := GetEnumValue(ElemTypeInfo, EnumName);
if ElemValue < 0 then
raise EConvertError.CreateFmt('值"%s"不正常吧!', [EnumName]);
Include(TMaxSet(Result), ElemValue);
until False;
end;
function SetToStr(TypeInfo: PTypeInfo;
const Value;
Brackets: Boolean = True): string;type ByteSet = set of 0..7;var ByteValue: ^ByteSet;
I, M: Integer;
ElemTypeInfo: PTypeInfo;
ElemTypeData: PTypeData;
begin
Result := '';
ElemTypeInfo := GetTypeData(TypeInfo)^.CompType^;
ElemTypeData := GetTypeData(ElemTypeInfo);
ByteValue := @Value;
for I := ElemTypeData^.MinValue to ElemTypeData^.MaxValuedo
begin
M := I mod 8;
if M in ByteValue^ then
begin
if Result <> '' then
Result := Result + ',';
Result := Result + GetEnumName(ElemTypeInfo, I);
end;
if M = 7 then
Inc(ByteValue) end;
if Brackets then
Result := '[' + Result + ']';
end;
procedure TForm1.Button1Click(Sender: TObject);var S : TSetDemo;
begin
StrToSet(TypeInfo(TSetDemo), '[S1,S3]', s);
Edit1.Text := SetToStr(TypeInfo(TSetDemo),S, True);
end;
 
C

chenzhong

Unregistered / Unconfirmed
GUEST, unregistred user!
哇,打这么多代码,这位大哥很累吧。我先看看。
 
C

chenzhong

Unregistered / Unconfirmed
GUEST, unregistred user!
有点高深,有句代码编译不出来。 raise EConvertError.CreateFmt('值"%s"不正常吧!', [EnumName]);错误提示构建 [错误] HanShu.pas(35): Undeclared identifier: 'EConvertError' [错误] HanShu.pas(35): Missing operator or semicolon [错误] HanShu.pas(35): Ordinal type required [致命错误] JiHe.dpr(6): Could not compile used unit 'HanShu.pas'查找 'EConvertError' F:/Delphi/学习Delphi/集合学习程序/HanShu.pas(35): raise EConvertError.CreateFmt('值"%s"不正常吧!', [EnumName]);
有好人帮帮忙查查吗。最好给点注释,才学1个月,一下难理解这代码。
 
W

wr960204

Unregistered / Unconfirmed
GUEST, unregistred user!
raise EConvertError.CreateFmt('值"%s"不正常吧!', [EnumName]);要不你就直接换成ShowMessage('值不正常吧!');
 
C

chenzhong

Unregistered / Unconfirmed
GUEST, unregistred user!
编译正常了,下面这句话,也不行的,原因是uses没引用单元。我也不知道是哪个单元,反正是练习小程序,我就把那几个全加上了,就正常了 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls我去测试下函数能不能转,能转换成功,我就研究研究你的写法,大富翁,是个好地方。还是要感谢你啊,2次回答我的问题。
 
C

chenzhong

Unregistered / Unconfirmed
GUEST, unregistred user!
.....天书。跟我书上学的都不一样。老大,你干脆给出中文思路,我自己去琢磨。看你这代码,比我自己写还难。就告诉我怎么实现类型转换。这几天看书,和查了下pchar,感觉你好象也是操作内存地址做的。。。。。[:(][:(][:(]告诉我中文思路吧,我自己去琢磨。另外这里,procedure StrToSet(TypeInfo: PTypeInfo;
const Value: string;
out Result);参数out Result怎么都可以不用写类型进去的?
 

Similar threads

回复
0
查看
848
不得闲
S
回复
0
查看
945
SUNSTONE的Delphi笔记
S
S
回复
0
查看
766
SUNSTONE的Delphi笔记
S
顶部