如何进行字符串集合的赋值?(100分)

  • 主题发起人 主题发起人 ooooh
  • 开始时间 开始时间
O

ooooh

Unregistered / Unconfirmed
GUEST, unregistred user!
多个radiobutton,点击的时候将(1,3,5,7,9)、(0,2,4,6,8)、(0,3,6,9)、(1,4,7)、(2,5,8),或其它一串任意值(可能是数字,可能是字符串……)动态地赋值给 S (S是字符串),然后在EDIT中输入一个值,按回车,如EDIT中的值在 S 中,就showmessage('YES!').
请问如何编写程序?
 
没明白你什么意思
 
这不是枚举吗,不是字符串集合呀
 
Delphi的System单元定义了下列几个全局函数和过程来操作有序变量和有序类型:
Ord 取得有序变量的值在取值范围中所在的顺序(即位置)
Pred 取得有序变量的前序的值(即上一个位置的值)
Succ 取得有序变量的后序的值(即下一个位置的值)
High 取得有序类型/变量的末序的值(即取值范围规定的最大值),或者数组变量的末序
Low 取得有序类型/变量的始序的值(即取值范围规定的最大值),或者数组变量的始序

下面的例子演示了以上几个函数和过程的使用方法:
type
TC = 'A'..'Z'; {定义字符内容的子界类型}
var
C: TC;
OI: Integer;
PI, SI, H, L: Char;
S: String;
begin
C := 'B';
OI := Ord(C); {OI = 66}
PI := Pred(C); {PI = 'A'}
SI := Succ(C); {SI = 'C'}
H := High(TC); {或者H := High(C); H = 'Z'}
L := Low(TC); {或者L := Low(C); L = 'A'}
S := '顺序:' + IntToStr(OI) + #13 + '前序:' + PI + #13 + '后序:' + SI + #13 + '末序:' + H + #13 + '始序:' + L;
ShowMessage(S);
end;

因此,对于有序类型的取值规则,可以总结如下:
对于一个初始化后的有序变量V,如果它的取值顺序在位置n,那么它的前序是n–1,后序是n+1。如果有序变量V已经位于初序或者末序,那么在{$R+}状态,使用Pred或者Succ将直接返回n–1或者n+1位置的取值;如果在{$R-}状态(缺省),则Pred返回后序取值,Succ返回前序取值。好,弄清了简单类型的概念,搞清楚它所属的各种类型就顺利多了,下面来逐一击破之。
Integer的基本类型是Integer和Cardinal,建议在大多数情况下使用这两种类型,因为它们都是32位的,操作系统和CPU可以花费最少的时间处理它们。很明显,64位的Int64可以兼容其他所有整数类型,而8位的Byte则被其他所有整数类型兼容。通常,取值范围大的可以兼容取值范围小的。范围更大的变量也可以赋值给范围小的,但是数据会被“斩断”,这个规则对于实数也是适用的。例如:
var
B: Byte; {B是8位的}
W: Word; {W是16位的}
begin
W := $1234; {将十六进制常数$1234赋值给W}
B := W; {B得到的值是W的低8位,即十六进制的$34,也即十进制的52}
ShowMessage(IntToStr(B)); {显示B的结果值52}
end;

Character的基本类型是Char。其他类型包括AnsiChar和WideChar。AnsiChar和Char是等同的,都是用来处理8位字符(即单字节字符),而WideChar则是用来处理多字节字符(目前版本的Delphi实现为16位,即2字节字符)的。大家可以参考本小节下面讲解String类型的内容,可以对这几个类型有更深的认识。
Boolean的基本类型是Boolean。另外三个是为了兼容操作系统(如一些API函数使用)和其他语言(如C)而定义的。Boolean和ByteBool都是占用1个字节,而WordBool和LongBool分别占据2个和4个字节。
Enumerated(枚举)类型定义一系列有序值的集合。Enumerated变量就从这个既定的集合中取某个值。集合中的有序值可以称为元素,元素一般从0开始连续索引(也就是元素的顺序号),如:
type
TSize = (Small, Medium, Large);
var
Size: TSize;
begin
Size := Large;
ShowMessage(IntToStr(Ord(Size))); {显示2}
end;
但是也可以显示指定枚举元素的索引(注意这类枚举类型不能生成运行时类型信息),如:
type
TSize = (Small = 5, Medium = 10, BeforLarge, Large = Small + Medium);
var
Size: TSize;
begin
Size := BeforLarge;
ShowMessage(IntToStr(Ord(Size))); {显示11而不是2,因为Medium被索引为10,那么其后序相应的为11}
Size := Large;
ShowMessage(IntToStr(Ord(Size))); {显示15而不是3}
end;

Subrange(子界)类型也是定义一系列有序值的集合,但是子界的有序值必须是在别的有序类型(可以将它称为子界的基本类型(baseType))中已经定义过的。子界中有序值的索引被基类确定。如:
type
TColors = (Red, Blue=5, Green, Yellow, Orange, Purple=10, White, Black); {定义一个枚举类型TColors。TColors定义了一些有序值供下面的子界类型TMyColors使用}
TMyColors = Green..White;
var
MyColors: TMyColors;
begin
MyColors := Green; {MyColors只能在Green...White之间取值,取Red、Black等是不允许的}
ShowMessage(IntToStr(Ord(MyColors))); {显示6,因为元素Green在TColors中被索引为6}
end;
 
您的 <<(1,3,5,7,9)、(0,2,4,6,8)、(0,3,6,9)、
(1,4,7)、(2,5,8),或其它一串任意值>>
如果是对枚举类型的操作,您看下边的东西能不能给您点提示:
type
TMStr=(adsfasdf,djuyyk,wedfhgj,test);
procedure TForm1.RadioButton1Click(Sender: TObject);
var
s:TMstr;
i:integer;
begin
//s:=adsfasdf;
s:=djuyyk;
i:=ord(s);//此时i=0
showmessage(inttostr(i));
end;





如果是代表在不同的Radiobutton中给S赋不同的值,那么如下就可以了:

var s:string;//s作用域要为radiobutton和edit共同可见的
//
在Radiobutton的click事件中给s赋值;
在edit的OnkeyDown事件中如下:
procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key=13 then
if Pos(edit1.Text,S)>0 then
Messagebox(handle,'应该是这个吧?','标题',0);
end;
 
或者是我说得太复杂了,在以下命令中,如果 S 是string、[1,2,0,3,5]是字符串,比如:
s:='我';如何判断s是否在字符串'我是中国人!'中?能不能像integer那样用简单的语句判断?

procedure TForm1.Button1Click(Sender: TObject);
var s:integer;
begin
edit2.clear;
s:=strtoint(edit1.text);
if s in[1,2,0,3,5] then edit2.Text:='yes!';
end;
 
if pos('我','11fda我们') > 0 then showmessage('yes');

procedure TForm1.Button1Click(Sender: TObject);
var s:integer;
begin
edit2.clear;
s:=edit1.text;
if pos(s,'....') > 0 then edit2.Text:='yes!';
end;
 
哈……,谢了!原来是这么简单!

procedure TForm1.Button1Click(Sender: TObject);
begin
if pos(edit1.Text,edit2.Text) > 0 then edit2.Text:='yes!';
end;
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
606
import
I
I
回复
0
查看
724
import
I
后退
顶部