我没用delphi作过打印功能,一简单问题求教(100分)

  • 主题发起人 主题发起人 expect
  • 开始时间 开始时间
E

expect

Unregistered / Unconfirmed
GUEST, unregistred user!
我的需求很简单
假设我的数据源是一个StringList,其中每个字符串的长度大约70个字符至200个字符
要实现的功能是在A4纸上把这些字符串打印出来,如果一个字符串太长,一行打不下,
自动换到下一行。
如下图
+-------------------------------------+
| |
| ************************** |
| ************************** |
| ************************** |
| ************************** |
| ************************** |
| ************************** |
| ************************** |
| ************************** |
| ************************** |
| ********************************* |
| ******* |
| ************************** |
| ************************** |
| ********************************* |
| ******* |
| |
+-------------------------------------+
最好也顺便说一下如何设置页边距,表头,及页码
 
一个简单的办法是:
1.找个基于内存的DataSet,如:RxLib的TRxMemoryData
2.将你的StringList中的内容逐行写到TRxMemoryData里;
3.用QuickReport报表控件,设置其DataSet为你的TRxMemoryData
4.在QuickReport上设置纸张、边距等;
5.加几个TQRBand,设置成rbTitle(标题),rbColumnHeader(栏头),rbDetail(明细),rbPageFooter(脚注);形成报表框架。
6.在rbTitle的TQRBand放TQRText写表标题
7.在rbColumnHeader的TQRBand上放TQRLabel写栏头;
8.在rbDetail的TQRBand上放TQRDBText,设置字段,打明细;
9.在rbPageFooter的TQRBand上放TQRExpr可放页码。
QuickReport很方便。
当然你也可以自己用Printer中的Canvas自己画,太过麻烦,通用性也不好。
 
QRMemo1.AutoStretch:=True;

 
如果考虑报表控件的话就简单了
 
我现在主要的问题是报表控件不会用,各位在说详细些,谢谢
 
各位打印高手,请多多帮忙。
那一位可以随手做一个例子发给我,不胜感激。
只要能解决问题就行,不管用什么方法(当然越简单越好)
 
expect2008@sohu.com
 
这个例子是我的程序中使用的。过程中的paper是一个TRxRichEdit类型的组件,放置于form上,打印之前先将RTF文本读入Paper,然后再调用此过程打印。Printer是全局变量。
procedure TMainForm.FilePrintExecute(Sender: TObject);
var
ADevice,ADriver,APort: array [0..255] of Char;
DeviceHandle: THandle;
DevMode: PDeviceMode;
begin
//获取打印机的TDeviceMode
Printer.GetPrinter(ADevice,ADriver,APort,DeviceHandle);
if DeviceHandle=0 then
begin
Printer.PrinterIndex:=Printer.PrinterIndex;
Printer.GetPrinter(ADevice,ADriver,APort,DeviceHandle);
end;
if DeviceHandle=0 then
Raise Exception.Create('没有安装打印机!')
else
begin
DevMode:=GlobalLock(DeviceHandle);
with DevMode^do
begin
dmFields:=dmFields or DM_PAPERSIZE;
dmPaperSize:=DMPAPER_B5;
//设置纸张大小
{
dmFields:=dmFields or DM_DUPLEX;
dmDuplex:=DMDUP_HORIZONTAL;
//设置双面打印
}
end;
end;
paper.PageRect:=Rect(100,0,1100,1600);
if not DeviceHandle=0 then
GlobalUnlock(DeviceHandle);
if PrintDialog1.Execute then
Paper.Print('');
end;
 
在apw的提示下
自己用Printer中的Canvas自己画的
不过,还是感谢leey,我没有提前看到你的答案,不然我会采用你的方法
 
后退
顶部