- 註冊時間
- 2006-3-13
- 最後登錄
- 2025-1-10
- 在線時間
- 673 小時
- 閱讀權限
- 200
- 積分
- 417
- 帖子
- 1107
- 精華
- 0
- UID
- 2
  
|
- procedure WrapLine(const s: wideString); //解決中文換行亂碼
- var
- i, cur, beg, last, LoopPos: Integer;
- WasBreak, CRLF: Boolean;
- begin
- CRLF := False;
- LoopPos := 0;
- for i := 1 to Length(s) do
- if (s[i] = #10) or (s[i] = #13) then
- // if s[i] in [#10, #13] then
- begin
- CRLF := True;
- break;
- end;
- last := 1; beg := 1;
- if not CRLF and ((Length(s) <= 1) or (WCanvas.TextWidth(s) <= maxwidth)) then
- OutLine(s + #1)
- else
- begin
- cur := 1;
- while cur <= Length(s) do
- begin
- if (s[cur] = #10) or (s[cur] = #13) then
- // if s[cur] in [#10, #13] then
- begin
- OutLine(Copy(s, beg, cur - beg) + #1);
- while (cur < Length(s)) and
- ((s[cur] = #10) or (s[cur] = #13))
- // (s[cur] in [#10, #13])
- do Inc(cur);
- beg := cur; last := beg;
- if (s[cur] = #10) or (s[cur] = #13) then
- // if s[cur] in [#13, #10] then
- Exit else
- continue;
- end;
- if s[cur] <> ' ' then
- if WCanvas.TextWidth(Copy(s, beg, cur - beg + 1)) > maxwidth then
- begin
- WasBreak := False;
- if (Flags and flWordBreak) <> 0 then
- begin
- i := cur;
- while (i <= Length(s)) and
- not ((s[i] = ' ') or (s[i] = ' ') or (s[i] = '.') or (s[i] = ',') or(s[i] = '-')) do
- //not (s[i] in spaces) do
- Inc(i);
- b := BreakWord(Copy(s, last + 1, i - last - 1));
- if Length(b) > 0 then
- begin
- i := 1;
- cur := last;
- while (i <= Length(b)) and
- (WCanvas.TextWidth(Copy(s, beg, last - beg + 1 + Ord(b[i])) + '-') <= maxwidth) do
- begin
- WasBreak := True;
- cur := last + Ord(b[i]);
- Inc(i);
- end;
- last := cur;
- end;
- end
- else
- if last = beg then last := cur;
- if WasBreak then
- OutLine(Copy(s, beg, last - beg + 1) + '-')
- else if s[last] = ' ' then
- OutLine(Copy(s, beg, last - beg)) else
- begin
- OutLine(Copy(s, beg, last - beg));
- Dec(last);
- end;
- if ((Flags and flWordBreak) <> 0) and not WasBreak and (last = cur - 1) then
- if LoopPos = cur then
- begin
- beg := cur + 1;
- cur := Length(s);
- break;
- end
- else
- LoopPos := cur;
- beg := last + 1; last := beg;
- end;
- // if s[cur] in spaces then last := cur;
- if s[cur] = ' ' then last := cur;
- Inc(cur);
- end;
- if beg <> cur then OutLine(Copy(s, beg, cur - beg + 1) + #1);
- end;
- end;
複製代碼 |
|