pos问题 (50分)

  • 主题发起人 主题发起人 wwwvw
  • 开始时间 开始时间
W

wwwvw

Unregistered / Unconfirmed
GUEST, unregistred user!
第一个问题:
listbox1里有如下数据
w@ee.x - 1548ererr

按下button后把‘ - ’前面的数据,也就是‘w@ee.x’放到edit1里去,把‘ - ’后面的数据,也就是‘1548ererr’放到edit2里去

第2个问题:
listbox1里有如下数据
w@ee.x.w
w@ee+x-
w@e$+ -_.,@e@x
sfsfsdddddf

w@''''''ee$%@x
w@e#e@x
sdgdgdfg

首先是去除listbox里的空行不要,然后出除没有 + -_.,@$%()=@#!^*#' 的那几行数据,这个listbox里可能有几万条数据,要怎么写比较好,多谢指点

 
listbox2.items.clear;
listbox3.items.clear;
for i:=0 to listbox1.items.count-1 do
begin
if (trim(listbox1.items)<>#13) and(pos('.',listbox1.items)<>0) then
begin
listbox2.items.add(copy(listbox1.items),1,pos('-',listbox1.items)-1));
listbox3.items.add(copy(listbox1.items),pos('-',listbox1.items)+1,length(listbox1.items))));
end;
end;
 
来晚了。
 
listbox2.items.add(copy(listbox1.items),1,pos('-',listbox1.items)-1));
以上这一句怎么编译不了啊,提示没有足够的参数,怎么回事,麻烦高手再看看
 
listbox2.items.add(copy(listbox1.items,1,pos('-',listbox1.items)-1));
 
我还是没看大懂,我提的是2个不同的问题,能不能一题一题解答,代码能加点注释的话,有利于我以后的学习,多谢多谢
 
用POS获取'-'的位置,然后截取字符。
 
to wwwvw:
不好意思,我以为你能看得懂。
完整代码,以编译通过。
var i:integer;
begin
listbox2.items.clear;
listbox3.items.clear;
for i:=0 to listbox1.items.count-1 do
begin
if (trim(listbox1.items)<>#13) and(pos('.',listbox1.items)<>0) then // 过滤掉不合符条件的行
begin
listbox2.items.add(copy(listbox1.items,1,pos('-',listbox1.items)-1))
// 取 - 之前的数据
listbox3.items.add(copy(listbox1.items,pos('-',listbox1.items)+1,length(listbox1.items)))
// 取 - 之后的数据
end;
end;

注:
copy(str,i,count)
// 从str中的第i个起取count个字符
pos(str1,str)
// 从str中找到str1出现的位置
trim(str)
// 去掉空格
 
我实在是初学,多谢fei_l的指点,我自己多看看,谢谢了
 
这样容易理解些:
问题一:
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
s:string;
begin
s:=listbox1.Items[0]
//这里的0指Listbox1的第一行,其他的类推
i:=pos('-',s)
//i为‘-’出现在字符串中的位置
edit1.text:=trim(copy(s,1,i-1))
//取第一部分
edit2.text:=trim(copy(s,i+1,length(s)-i))
//取第二部分
end;
 
问题二:
procedure TForm1.Button1Click(Sender: TObject);
var
i,j:integer;
s,s1:string;
bz:boolean;
begin
s1:='+-_.,@$%()=@#!^*#'''
// 你要求在Listbox的项目中要有的字符组成的串
for i:=listbox1.Items.Count-1 downto 0 do begin // 从Listbox1的最后一行数据开始处理,否则会乱套的
s:=listbox1.Items;
if trim(s)='' then
listbox1.Items.Delete(i) // 删除空行
else begin
bz:=true;
for j:=1 to length(s1) do begin
if pos(s1[j],s)>0 then begin // 判断是否包含要求的字符
bz:=false
//包含时设标志为False,
break
//并退出循环
end;
end;
if bz then listbox1.Items.Delete(i)
// 不包含特定字符则删除该项
end;
end;
end;
 
这下完全看明白了,太感谢了,我想多问一个问题,为何我这个计算行数的代码,好象老有误差,要怎么写比较好,edit1.text:='0';

procedure TForm1.Button8Click(Sender: TObject);
var j:integer;
begin

for j := ListBox1.Items.Count downto 1 do
begin

if ListBox1.Tag<ListBox1.Items.Count then
begin
edit1.Text:= IntToStr(StrToInt(edit1.Text) + 1) ;

ListBox1.Tag:=ListBox1.Tag+1;
end
else
ListBox1.Tag:=0;
end;
end;
 
我才不明白,这有什么用途的? 
 
叹,高手不明底手事啊!编程是我最怕也是最不擅长的事,其他比编程更难的,我都能得心应手,看来以后真得下苦功了
 
按你的大体意思应该是求Listbox1的行数,但这样的话没必要这么复杂呀,Listbox1.items.count就是了。
按你的代码,第一次求得8第二次之后求得7把ListBox1.Tag:=0;提前就正确了:
var
j:integer;
begin
ListBox1.Tag:=0;
for j := ListBox1.Items.Count downto 1 do begin
if ListBox1.Tag<ListBox1.Items.Count then begin
edit1.Text:= IntToStr(StrToInt(edit1.Text) + 1) ;
ListBox1.Tag:=ListBox1.Tag+1;
end
end;
end;
这样的话,还不如这样:
var
j:integer;
begin
ListBox1.Tag:=0;
for j := ListBox1.Items.Count downto 1 do begin
if ListBox1.Tag<ListBox1.Items.Count then begin
ListBox1.Tag:=ListBox1.Tag+1;
edit1.Text:= IntToStr(listbox1.Tag) ;
end
end;
end;
这样又更可以简化成这样:
var
j:integer;
begin
ListBox1.Tag:=0;
for j := ListBox1.Items.Count downto 1 do begin
ListBox1.Tag:=ListBox1.Tag+1;
edit1.Text:= IntToStr(listbox1.Tag) ;
end;
end;
这样又不如这样:
var
j:integer;
begin
for j := 1 to ListBox1.Items.Count do begin
edit1.Text:= IntToStr(j) ;
end;
end;
最直接还是这样:
begin
edit1.Text:= IntToStr(Listbox1.items.count) ;
end;

 
我感觉lhc4000是在这里玩!:)而且还玩得很开心!
 
其实对于各位高手来说,我所问的都是小问题,我很感谢大家的帮助,真的多有打搅,不好意思
 
einsteingod:这算是批评呢还是表扬?
 
wwwvw:不要不好意思。
想当年,我也是这样的问题太多太多了的。
而且还不能上大富翁,只好自己乱撞,所以直到现在,很多东西也学得不太规范。
也因此,我很喜欢在大富翁上帮助一些真正的初学者。
而且,更高深的问题我也不懂得回答了。哈哈!
 
这里热心的朋友可真多,再次象所有帮我的朋友说谢谢
 
后退
顶部