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的宽度可以控制换行的长度。