我把长120的中英文string分成3行输出,但截取后时出现乱码!还有更好截取的方法吗?代码:(50分)

  • 主题发起人 主题发起人 jklmsoho
  • 开始时间 开始时间
J

jklmsoho

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure tform1.makeresult(thestr:string);
var i,j,k,strl,tmpl:integer;
str,str1,str2,str3,str4:string;
begin
str:=thestr;

strl:=length(str);
if strl>80 then insert(' ',str,78);
if strl>160 then insert(' ',str,158);
if strl>240 then insert(' ',str,238);
tmpl:=strl div 80;
case tmpl of
1:begin
str1:=copy(str,1,80);
resultfm.re.Lines.Add(' '+str1);
str2:=copy(str,81,strl-80);
resultfm.re.lines.add(' '+str2);
end;
2:begin

str1:=copy(str,1,80);
resultfm.re.Lines.Add(' '+str1);
str2:=copy(str,81,160);
resultfm.re.lines.add(' '+str2);
str3:=copy(str,161,strl-160);
resultfm.re.lines.add(' '+str3);
end;
3:begin

str1:=copy(str,1,80);
resultfm.re.Lines.Add(' '+str1);
str2:=copy(str,81,160);
resultfm.re.lines.add(' '+str2);
str3:=copy(str,161,240);
resultfm.re.lines.add(' '+str3);
str4:=copy(str,241,strl-240);
resultfm.re.lines.add(' '+str4);
end;
end;
end;
 
使用widestring
var ws : widestring;s1,s2,s3:string;l:integer;
begin
ws := '你的字符串';
l := length(ws) div 3;
s1 := copy(ws,1,l);
s2 := copy (ws,l+1,l);
s3 := copy (2*l +1,255);
 
很长的句子呢?我要把它分成几行,例如:
网上情人:虽然我们未曾见过面,也许今生也难以相见,但我们的真情付出令我们终生快乐,我们的心永远年轻!
做成:
网上情人:虽然我们未曾见过面,
也许今生也难以相见,但我们的真
情付出令我们终生快乐,我们的心
永远年轻!
 
你也太笨了点。
方法都一样,你可以给ws赋任何字符串类型变量
ws := edit1.text;
ws := memo1.text;
然后分几段都行。
 
用俺的涵数吧,不过别望了给分噢.........................

//***************************//
//**涵数功能:获取子串********//
//**参数1:字符串*************//
//**参数2:子串起始位置*******//
//**参数3:子串的长度*********//
//***************************//
function GetSubString(strInfor: string
startPos,endPos: integer): string;
var
charA:char
//临时字符
intI,intCount:integer;
begin
//检查参数
if (strinfor='') or (startpos<1) or (startpos>length(strinfor))
or (endpos<1) then
begin
result:='';
exit;
end
//if

//第一个字符开始取的直接取即可
if startpos=1 then
begin
result:=copy(strinfor,startpos,endpos);
exit;
end;

//统计非中文字数
intcount:=0;
for inti:=1 to startpos-1 do
begin
chara:=strinfor[inti];
if ord(chara)<=127 then
inc(intcount);
end;

//偶数个非中文字数则需从奇数开始取
//奇数个非中文字数则需从偶数开始取
if ( (intcount mod 2=0) and (startpos mod 2=0) ) or
( (intcount mod 2=1) and (startpos mod 2=1) ) then
begin
result:=copy(strinfor,startpos-1,endpos+1);
exit;
end;

//其它情况则正常读取
result:=copy(strinfor,startpos,endpos);

end;
 
用我的copy函数
function YanLeiCopy(st: string
index, count: integer): string;
var
I: integer;
S: widestring;
s1: string;

begin
s := st;
result := '';
s1 := '';
for I := 1 to length(s) do
begin

s1 := s1 + S;
if length(s1) >= index then
begin
if length(s1) < index + count then
result := result + s
else
break;

end;
end;
end;
调用例子
Const newlineLen=40;
with label1 do
begin
Caption := ' ';
while length(st) > newlineLen do
begin
Caption := Caption + YanLeiCopy(st, 1, newlineLen) + #13;
delete(st, 1, length(YanLeiCopy(st, 1, newlineLen)));
end;
Caption := Caption + st;
end;
 
动态创建一个tmemo,设置它的宽度,然后利用它的折行功能就可以了啊
 
将String改为WideString试试,估计问题可以解决。
 
太感谢个为了,只是我只剩下100分了!!!!!!!1[:(]
 
他的整个程序都有问题,怎么可能还能运行啊!?
首先是:1、要求中英文分段,这个就关系到ASCALL码啦,且中文是两个字节的;
2、重复的内容太多,比如第一个CASE语句;
3、没有如何得到每一段的起始字符的程序,这样的话就永远在执行一个相同的
内容,怎么还可能分成几段呢,总是在对同一个变量符值,真是气死我啦!!!
 
基本想法和liujr的相同,只是他最后的那个地方好象有点不对,
//偶数个非中文字数则需从奇数开始取
//奇数个非中文字数则需从偶数开始取
if ( (intcount mod 2=0) and (startpos mod 2=0) ) or
( (intcount mod 2=1) and (startpos mod 2=1) ) then
begin
result:=copy(strinfor,startpos-1,endpos+1);
exit;
end;
应该还有个数为偶,起始位置为奇的和个数为奇,起始位置为偶的情况。
还有就是result:=copy(strinfor,startpos-1,endpos+1);这句好象会将每一段都多加了两个
字符啊,是不是啊!?
 
前面也有点不对,好象也少了两种情况哦!?
 

Similar threads

回复
3
查看
158
金少
后退
顶部