关于用delphi编写的打印管理(200分)

  • 主题发起人 主题发起人 blesser
  • 开始时间 开始时间
B

blesser

Unregistered / Unconfirmed
GUEST, unregistred user!
哪为大虾知道,有哪个网站有关于用delphi编写的打印管理系统软件,
最好是有源程序和具有相关介绍资料的!
 
我记得www.cnshare.com.cn上有一个PB写的通用打印程序,
可以找来看看。
我正在做一个通用的打印报表设计管理工具,用cell做的。
不过是为一家软件公司做的,源代码不能给你。但是如果你
有关于这个方面的问题,可以交流一下。
 
我有一个,但不是我写的。Hope it can help you!
我有一个仿写的例子,若要可以给你。

DELPHI文本和图形的打印
首 先 在FORM 当 中 加 入MEMO、PRINTDIALOG、PRINTERSETUPDIALOG
和 两 个BUTTON 控 件, 两 个 BUTTON 的CAPTION 分 别 为
“ 打 印 设 置” 和“ 打 印”。 然 后 编 写BUTTON 的 事 件 驱 动
程 序( 代 码 在 下 面),这 个 简 单 的 例 子 中 只 要 单 击
“ 打 印” 按 钮 时 便 可 以 在 打 印机 上 输 出 文 件0S2.TXT,
打 印 事 件 的 清 单 如 下:
implementation
uses printers;
{$R *.DFM}
procedure TForm1.BitBtn1Click(Sender: TObject);
begin

printersetupdialog1.execute;
//选择输出的打印机以及其他打印控制选项
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
var
lines:integer;
prntext:system.text;
//将PRNTEXT声名为一个在SYSTEM程序单元当中定义的文本文件
begin

if printdialog1.execute then

assignprn(prntext);
//将PRNTEST分配给打印机
rewrite(prntext);
//调用REWRITE函数,为输出打开已分配的文件
printer.canvas.font:=memo1.font;
//把当前MEMO1的字体指定给打印对象的CANVAS的字体属性
for lines:=0 to memo1.lines.count-1do

writeln(prntext,memo1.lines[lines]);
//把MEMO的内容写到打印机对象
system.close(prntext);
//关闭打印文件
end;

procedure TForm1.FormCreate(Sender: TObject);
begin

memo1.lines.loadfromfile('c:/dos/os2.txt');
//在FORM建立时读入C:/DOS/OS2.TXT文件
end;

end.

2、 图 形 的 打 印 功 能, 简 单 的图 形 打 印 功 能 也 如 打
印 文 本 一 样 的 容 易, 只 是 告 诉 打 印机 对
象(TPRINTER) 开 始 打 印, 把 图 形 简 单 的 复 制 到 打 印 机上
去, 最 后 告 诉 打 印 机 结 束 打 印 工 作。
举 例 说 明: 将 上 面 的 例 子的MEMO 控 件 换 成IMAGE 控
件, 再 经 过 一 些 简 单 的 修 改, 图 形 打印 的
代 码 如 下:
procedure TForm1.BitBtn1Click(Sender: TObject);
begin

if printdialog1.execute then
begin

printer.begin
doc;
printer.canvas.draw(0,0,image1.picture.graphic);
printer.enddoc;
end;

end;

在 这 种 情 况 下, 使 用 的 是 打印 机 的 分 辨 率, 图 形
在 页 面 的 左 上 角 开 始 打 印 输 出, 打 出的 图
形 很 小, 在 很 多 的 情 况 下 不 能 符 合 要 求, 但 是 打 印 机
画 布CANVAS 的STRETHDRAW 的 方 法, 可 以 让 我
们 对 图 形 进 行 灵 活的 处 理, 画 布(CANVAS) 的STRETCHDRAW 方
法 声 名 为:
procedure StretchDraw(const Rect: TRect;
Graphic: TGraphic);
其中的RECT参数代表图形输出区域的大小,TRECT的类型声名为:
TRect = record
case Integer of
0: (Left, Top, Right, Bottom: Integer);
1: (TopLeft, BottomRight: TPoint);
end;

因 此 我 们 只 要 调 整RECT 的 大小 及 其 在 打 印 页 面 上
的 位 置, 进 而 达 到 自 己 满 意 的 效 果,下 面
的 代 码 是 不 断 的 放 大 图 形, 充 满 我 们 定 义 的 矩 形 区域,
并 将 其 定 位 在 打 印 机 画 布(CANVAS) 的 中 央
进 行 输 出。代 码 如 下:
procedure TForm1.Button1Click(Sender: TObject);
VAR
strect:Trect;
//定义打印输出矩形框的大小
temhi,temwd:integer;
begin

if printdialog1.execute then

begin

temhi:=image1.picture.height;
temwd:=image1.picture.width;
while (temhi printer.pageheight div 2)and
//将图形放大到打印页面的1/2大小
(temwd printer.pagewidth div 2) do

begin

temhi:=temhi+temhi;
temwd:=temwd+temwd;
end;

with strectdo
//定义图形在页面上的中心位置输出
begin

left:=(printer.pagewidth -temwd) div 2;
top:=(printer.pageheight-temhi) div 2;
right:=left+temwd;
bottom:=top+temhi;
end;

with printerdo

begin

begin
doc;
canvas.stretchdraw(strect,image1.picture.graphic);
//将放大的图形向打印机输出
enddoc;
end;

end;

end;

以 上 代 码 在DELPHI2.0 上 编 译 通过, 通 过 这 些 小 小 的
例 子, 相 信 大 家 对 于 在DELPHI 中 打 印
图形 和 文 本 有 一 定 的 了 解, 同 样 通 过 打 印 机 的
画 布(CANVAS)属 性 也 可 以 实 现 数 据 库 表 单 的 打 印,
在 这 里 不 一 一 赘 述,如 果 大 家 有 兴 趣 不 妨 一 试。
作 者 地 址: 北 方 工 业 大 学801 信 箱 李 晓 东 邮 编100041


8.26.2 任意打印

有时我们要打印任意排列的表或往已经印好的登记表上对号入座写上数据时,
可以新建一个窗体(假设为Form1),再把Form1的BorderStyle设为bsNone、
AutoScroll设为True,接下来再创建一个新窗体(假设为Form2),
再建个按钮Button1,编写代码:

procedure TForm2.Button1Click(Sender: TObject);
begin

Form1.Width :=900;
Form1.Height :=800;
Form1.Print;
end;

接下来你在Form1上对应的位置写上数据,运行后按Button1就会一五一十的
打印下来了。
 
有没有可以获取打印机状态信息的程序?
 
wumeng君的例子都是书中的例子,因目前也在解决类似的问题,所以
看的也多!
请后来的诸位解决如何在画布/Form上画的表格对应到打印纸上?!
 
I have finished a General Cell Print program.

You can mail to me !!!

mycyzhoujun@163.net
 
可以用FindFirstPrinterChangeNotification建立一个
监视对象,和WaitForSingleObject、
FindNextPrinterChangeNotification配合可以对打印机或
打印队列进行监视,并获得相关信息。
 
to tasam:
谢谢先!不知有没有现成程序?有的话mail给我,好吗?zjy311@263.net!
 
呵呵,打印和报表真是个大问题。
 
我用了好几种报表了,现在用reportbuilder,但也总有bug,头大啊...
 
接受答案了.
 
后退
顶部