函数如下:Function MitiLine (Str:String;N:Integer):String;
var
I,j,zm,k,lns,s,gs:Integer;
Strs:String;
Begin
zm:=0;
k:=0;
L:=Length(Str ); s:=0;
gs:=0;
If L=0 Then
begin
Result:=Str;
Exit;
End;
if floattostr(L/N)>inttostr(trunc(L/N)) then
lns:=trunc(L/N)+1
else
lns:=trunc(L/N);
L:=Lns;
if L<1 THEN L:=1; if L>1 then
begin For I:=1 To L Do
begin
//s:=(N*(I-1)+1);
ZM:=0; for j:=0 to N-1 do
begin if ByteType(Str,(N*(I-1)+1+s+J)) = mbSingleByte then
begin
zm:=zm+1;
end;
end;
if zm mod 2=0 then
s:=0
else
begin
s:=1;
end;
if i=1 then
BEGIN
Strs:=Strs+Copy(Str,N*(I-1)+1,N+s)+#13+#10 ;
END
else
Strs:=Strs+Copy(Str,N*(I-1)+1+gs,N+s)+#13+#10;
if s=1 then
gs:=gs+1; end; strs:=leftstr(Strs,length(strs)-2); Result:=Strs;
end
else
begin strs:=leftstr(Strs,length(strs)-2);
Result:=Str;
end; End;
当传入数字、字符、汉字及其它字符进去后换行就会出现乱码,请大家帮忙查查哪有问题。
class function TPrinteTable.WordWrap(const Value: AnsiString;
var MaxLength: Integer): AnsiString;
begin
if MaxLength > Length(Value) then
MaxLength := Length(Value);
if System.AnsiStrings.ByteType(Value, MaxLength) = TMbcsByteType.mbLeadByte
then
Dec(MaxLength);
Result := System.AnsiStrings.LeftStr(Value, MaxLength);
end;
//截取字符串前 N 个字符
begin
if N >= Length(Str) then
begin
result := Str;
N := 0;
end
else
begin
//如果第 N 个字符是汉字的前半部分,就少取一个字符
if ByteType(Str, N) = mbLeadByte then
N := N - 1;
result := Copy(Str, 1, N);
end;
end;Function MitiLine(Str: AnsiString; N: Integer): AnsiString;
var
s: AnsiString;
m: Integer;
begin
s := '';
while True do
begin
m := N;
if s = '' then
s := GetNChars(Str, m)
else
s := s + #13#10 + GetNChars(Str, m);
if m = 0 then
Break;
Str := Copy(Str, m + 1, Length(Str) - m);
end;
result := s;
end;//示例
procedure TForm1.btn1Click(Sender: TObject);
var
Str: AnsiString;
N: Integer;
begin
Str := '昨天早盘,沪深两市双双跳空低开,沪指报3131.85点,跌幅1.71%,深成指报10656.9点,跌幅2.13%。开盘后低位震盪,盘中航空板块发力,沪指跌幅一度收窄至0.67%,但无力翻红。';
Memo1.Text := MitiLine(Str, 25);
end;
COPY函数其实已经自动识别ANSI还是UNICODE编码
下面的代码也许能给楼主提供参考,XE8测试通过,也建议:如非必要,一般不要跑到字节运算里面去var
i,iCutLength:Integer;
Str,sCurSymbol,sLineStr:String;
begin
iCutLength:=25;
Str:='昨天早盘,沪深两市双双跳空低开,沪指报3131.85点,跌幅1.71%,深成指报10656.9点,跌幅2.13%。开盘后低位震盪,盘中航空板块发力,沪指跌幅一度收窄至0.67%,但无力翻红。';
sCurSymbol:='';
sLineStr:='';
for I := 1 to Length(Str) do
begin
sCurSymbol:=Copy(Str,i,1);
if Length(AnsiString(sLineStr+sCurSymbol))>iCutLength then
begin
//如果长度>iCutLength就清空行字符串
Memo1.Lines.Add(sLineStr);
sLineStr:=''
end;
sLineStr:=sLineStr+sCurSymbol;
end;
if sLineStr<>'' then
Memo1.Lines.Add(sLineStr);
end;