可换自动换行和设置行间距报表控件 (100分)

  • 主题发起人 主题发起人 lyq2276959
  • 开始时间 开始时间
L

lyq2276959

Unregistered / Unconfirmed
GUEST, unregistred user!
{使用:
设置一行字数:
qrtext.count:=5;
设置行间距:
qrtext.linespace:=10;
设置要显示的内容:
qrtext.text:='中华人民共和国中华人民共和国';
//其它功能请帮助完成:
字体的改变,最好能自动计算换行,能对标点作处理等等
本控件的安装:将本段文字复制并生成一个qqrtext.pas文件后即可安装
以下为本控件的程序:
}
unit qqrtext;
interface
uses
Windows, Messages, SysUtils, Classes, Controls, QuickRpt, QRCtrls, Graphics;
type
tqrtext = class(tqrshape)
private
Ftext: string;
Flinespace: integer;
//行间距
Fcount: integer;
//一行中的字数(中文字数)
procedure setftext(value: string);
procedure setFlinespace(value: integer);
procedure setFcount(value: integer);
{ Private declarations }
protected
procedure Paint;
override;
//显示
procedure Print(OfsX, OfsY: integer);
override;
//打印
{ Protected declarations }
public
{ Public declarations }
published
property text: string read Ftext write setftext;
property linespace: integer read Flinespace write setFlinespace;
property count: integer read Fcount write setFcount;
property font;
{ Published declarations }
end;

procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Samples', [TQRtext]);
end;

{ TQRtext }
procedure TQRtext.Paint;
var
mystr, mystr1, ch: string;
//本行要显示的字符
i, j, y, fontheight: integer;
isok: boolean;
begin
isok := false;
//设计时显示数据
if length(Ftext) > 0 then
begin
//有内容要显示
canvas.Brush.Style := bssolid;
canvas.Brush.Color := clwhite;
canvas.FillRect(canvas.ClipRect);
y := 0;
j := fcount * 2;
//中文字数为所要设置的字数的2倍
canvas.Font := font;
fontheight := canvas.TextHeight('字');
//求得每行高度/
//计数第1行要显示的字串
mystr1 := ftext;
//剩余的字
for i := 1 to length(ftext)do
begin
//以下为看所给的文的下一个符号是否为后置标点的处理
mystr := copy(mystr1, 1, j);//取前n个字
if length(mystr)=0 then
exit;//无字可取则退出
mystr1 := copy(mystr1, j + 1, length(mystr1));
//剩余的
repeat
ch := copy(mystr1, 1, 2);
if (ch = ',') or (ch='。') then
begin
mystr := mystr + copy(mystr1, 1, 2);
mystr1 := copy(mystr1, 3, length(mystr1));
//计数第n行要显示的字串
end
else
begin
mystr1 := copy(mystr1,1, length(mystr1));
break;
//为非后置标点则退出
end;
until isok;
canvas.TextOut(0, y, mystr);
//显示字符
y := y + fontheight + Flinespace;
//下一行的位置=上一行的位置+字高+行间距
end;
end;
// inherited;  不能再执行父类的动作了。
//打印部分与这个过程似,但要在QuickReport报表中的Qrprinter的Canvas中输出显示
//同时还有一个偏移量。
end;

procedure TQRtext.print(OfsX, OfsY: integer);
var
mystr, mystr1, ch: string;
//本行要显示的字符
i, j, y, fontheight: integer;
isok: boolean;
begin
with qrprinterdo
begin
isok := false;
//设计时显示数据
if length(Ftext) > 0 then
begin
//有内容要显示
canvas.Brush.Style := bssolid;
canvas.Brush.Color := clwhite;
canvas.FillRect(canvas.ClipRect);
y :=OfsY;
j := fcount * 2;
//中文字数为所要设置的字数的2倍
canvas.Font := font;
fontheight := canvas.TextHeight('字');
//求得每行高度/
//计数第1行要显示的字串
mystr1 := ftext;
//剩余的字
for i := 1 to length(ftext)do
begin
//以下为看所给的文的下一个符号是否为后置标点的处理
mystr := copy(mystr1, 1, j);//取前n个字
if length(mystr)=0 then
exit;//无字可取则退出
mystr1 := copy(mystr1, j + 1, length(mystr1));
//剩余的
repeat
ch := copy(mystr1, 1, 2);
if (ch = ',') or (ch='。') then
begin
mystr := mystr + copy(mystr1, 1, 2);
mystr1 := copy(mystr1, 3, length(mystr1));
//计数第n行要显示的字串
end
else
begin
mystr1 := copy(mystr1,1, length(mystr1));
break;
//为非后置标点则退出
end;
until isok;
canvas.TextOut(OfsX, y, mystr);
//显示字符
y := y + fontheight + Flinespace;
//下一行的位置=上一行的位置+字高+行间距
end;
end;
// inherited;  不能再执行父类的动作了。
//打印部分与这个过程似,但要在QuickReport报表中的Qrprinter的Canvas中输出显示
//同时还有一个偏移量。
end;
end;

procedure TQRtext.setFcount(value: integer);
begin
Fcount := value;
paint;
//值改变后重新显示数据
end;

procedure TQRtext.setFlinespace(value: integer);
begin
Flinespace := value;
paint;
//值改变后重新显示数据
end;

procedure TQRtext.setftext(value: string);
begin
if Ftext <> value then
begin
Ftext := value;
paint;
//值改变后重新显示数据
end;
end;

end.

 
用report machine就可以做到,Quickrep是垃圾
 
quickrep是免费的!!^-^
 
后退
顶部