delphi 关于汉字换行问题


本文整理自网络,侵删。

 procedure   QrDbTextOnPrint(sender:   TObject;   var   Value:   String);   
  var   
      i   :   integer;   
  begin   
      FMemo   :=   TMemo.Create(FWinControl);   
    
      FMemo.Parent   :=   self;   //是报表所在的窗体   
      FMemo.Width   :=   Tcontrol(sender).Width;   
      FMemo.height   :=   Tcontrol(sender).Height;   
    
      FMemo.Text   :=   Value;                                 
      Value   :=   FMemo.Lines[0];   
      For   i:=   1   to   FMemo.Lines.Count-1   do   
          value   :=   value   +   #13   +   FMemo.Lines[i];   
      FMemo.Free;
 
---------------------------------------------------------------------------------
 
function ApartString(InStr : String ;MaxLen : Integer) : String;
var
P: Integer;
S,L : String;
OriStr : Array[0..1000] OF Char;
OutStr : String;
begin
P := 0;
L := '';
OutStr := '';
StrPCopy(OriStr,InStr);
 
WHILE P <= Length(InStr) - 1 DO
BEGIN
IF ORD(OriStr[P]) > 127 THEN
BEGIN
S := Copy(OriStr,P + 1,2);
Inc(p)
END
ELSE
BEGIN
S := Copy(OriStr,P + 1,1);
END;
 
Inc(p);
 
IF Length(L + S) > MaxLen Then
BEGIN
OutStr := OutStr + L + #13;
L := S;
END
ELSE
BEGIN
L := L + S;
END;
END;
 
OutStr := OutStr + L;
ApartString := OutStr;
 
end;
 

在OnPrint的地方
procedure TPNameCard.QRDBText4Print(sender: TObject; var Value: string);
var
I : Integer;
OriStr : Array[0..1000] OF Char;
V_Chinese : Boolean;
 
begin
IF Not (Sender AS TQRDBText).AutoSize THEN
BEGIN
StrPCopy(OriStr,Value);
V_Chinese := False;
 
FOR I := 0 TO Length(Value) - 1 DO
BEGIN
IF ORD(OriStr[I]) > 127 THEN
BEGIN
V_Chinese := True;
Break;
END;
END;
 
IF V_Chinese THEN
Value := ApartString(Value,20)
ELSE
Value := Value;
END;
end;
 
----------------------------------------------------------------------------------------------
 
   1.在需要显示换行的字段的地方用TQRMemo替代TQRDBText,并调整好TQRMemo的长度和宽度(显示字段的最大范围);   
  2.在报表所在的Form上放一个TMemo控件,由它来负责解决换行问题,在TQRMemo所在的band的BeforePrint事件中写代码,具体如下   
  var   
      i:   integer;   
  begin   
      memo1.lines.clear;   
      TQRMemo.lines.clear;   
      memo1.width:=   TQRMemo.Width;   
   memo1.lines.text:=   ADODataSet1.FieldByName('字段名').AsString;   
      for   i:=   0   to   memo1.lines.Count   -   1   do   
          QRMemo.lines.Add(memo1.lines.strings[i]);   
  end;   
  只要在需要的地方依上面的方法处理就行。   
  其中的memo1的宽度可以控制换行的长度。

相关阅读 >>

Delphi的tfilestream

Delphi stream对象

Delphi 安卓下打开 pdf, mp4 等外部文件

Delphi 的链式代码

Delphi 获取屏幕缩放比例

Delphi开发平台 raw socket

Delphi 判断两个时间差是否在一个指定范围内

Delphi webbrowser 自动登录

Delphi 汉字与区位码

Delphi tgauge类的定义在哪个单元中定义的?

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...