函式如下:
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;
當傳入數字、字符、漢字及其它字符進去后換行就會出現亂碼,請大家幫忙查查哪有問題。
uj5u.com熱心網友回復:
要說清字符轉換的目的,讓大家為你猜謎語?uj5u.com熱心網友回復:
字串換行!!!!!,指定一行字串長度,超出換另一行。uj5u.com熱心網友回復:
你這是按照固定長度換行吧,你這個寫的太麻煩了。漢字按幾個長度算?
uj5u.com熱心網友回復:
漢字二個長度算的uj5u.com熱心網友回復:
首先你不能直接判斷,當截取位元組是否單位元組,你可以試著先判斷它是否首位元組,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;
uj5u.com熱心網友回復:
Function GetNChars(Str: AnsiString; var N: Integer): AnsiString;//截取字串前 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;
uj5u.com熱心網友回復:
我不知道樓主用的是D7還是XE,但如果是XE的話,系統已經對ANSI和UNICODE編碼有明顯的機制區分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;
uj5u.com熱心網友回復:
漢字全角都按兩個所以你的長度必須是2的倍數uj5u.com熱心網友回復:
一個漢字被劈開兩半了轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/74582.html
標籤:VCL組件開發及應用
