多台打印机控制问题,急寻高手,很急!在线等待。。。(200分)

  • 主题发起人 主题发起人 phcn
  • 开始时间 开始时间
P

phcn

Unregistered / Unconfirmed
GUEST, unregistred user!
小弟在编程中遇到如下问题,请各位大虾指教:
一个跟集群打印的有点类似的功能:在网络中有两台打印机A和B,其中A负责打印文档B负
责打印图片,我想提供一个程序界面可以输入并选择A打印多少份某文档(文档如word文档以
类似发送邮件挂附件的方式挂上)B打印多少份图片(图片如bmp也以挂附件的形式挂上),然
后点击确认,就可以分别在A和B上面得到打印输出了。不知道说得清楚吗?项目比较急,希望
得到相关的源码或者控件,或者告知实现方法。先谢谢了。
 
这样有什么难!在用A打印机时,弹出一个打印设置就行了。同样,在用B打印机时,
也弹出一个打印设置就行了.
 
to fonder:
不好意思,可能是我没有说清楚吧。我的意思是在提前装好两个打印机的驱动的情况下,
不需要设置再对打印机进行设置了。让用户就用我所说的界面就可以了。因为用户的计算机
水平比较低。
 
在后台先设置相应打印机既可
 
后台更改默认打印机我会。而且文档是WORD的话我也可以在后台让他改完之后打出来。问题
是如果是图片怎么办。
 
我不知道下面的能否解决你的问题:是个空件:只要在打印之前,把PrinterName赋为你安装的
打印机名称。(不是我写的)
//RawPrinter.pas
unit RAWPrinter;
{$B-}
interface
uses
Windows, SysUtils, Classes;
type
TRAWPrinter = class(TComponent)
constructor Create(AOwner:TComponent);
override;
destructor Destroy;
override;
private
fDocumentTitle: string;
fPrinterName: string;
fPrinterHandle: DWord;
fLevel: Integer;
// 0 - printer closed
// 1 - printer open
// 2 - job started
// 3 - page started
public
function SetToDefaultPrinter:Boolean;
function begin
Doc:Boolean;
function EndDoc:Boolean;
function Abort:Boolean;
function Write(const Buffer;
Count:Longint):DWord;
function WriteStr(const text:string):Boolean;
function WriteLn(const line:string):Boolean;
function NextPage:Boolean;
function CR:Boolean;
function LF:Boolean;
published
property PrinterName:string read fPrinterName write fPrinterName;
propertydo
cumentTitle:string read fDocumentTitle write fDocumentTitle;
end;

procedure Register;
implementation
uses
WinSpool;

procedure Register;
begin
RegisterComponents('PJank', [TRAWPrinter]);
end;

{ TRAWPrinter }
(***********************************************************************************)
constructor TRAWPrinter.Create(AOwner: TComponent);
begin
inherited;
fDocumentTitle:= '';
fPrinterName:= '';
fLevel:= 0;
end;

destructor TRAWPrinter.Destroy;
begin
if (fLevel>0) then
Abort;
inherited;
end;

(***********************************************************************************)
function TRAWPrinter.SetToDefaultPrinter:Boolean;
var str: array[0..79]of Char;
function FetchStr(s:string):string;
var i: Integer;
begin
s:= TrimLeft(s);
i:= Pos(',',s);
if i=0
then
Result:= s
else
Result:= Copy(s, 1, i-1);
end;
begin
GetProfileString('windows', 'device', '', str, SizeOf(str)-1);
fPrinterName:= FetchStr(str);
Result:= (fPrinterName<>'');
end;

(***********************************************************************************)
function TRAWPrinter.begin
Doc: Boolean;
vardo
cInfo: TDocInfo1;
begin
if (fLevel=0) then
begin
// open printer
if (fPrinterName='') then
SetToDefaultPrinter;
if (fPrinterName<>'') and OpenPrinter(PChar(fPrinterName), fPrinterHandle, nil)
then
fLevel:= 1;
end;
if (fLevel=1) then
begin
// start new job
withdo
cInfodo
begin
pDocName:= PChar(fDocumentTitle);
pOutputFile:= nil;
pDatatype:= 'RAW';
end;
if (StartDocPrinter(fPrinterHandle, 1, @DocInfo)<>0)
then
fLevel:= 2;
end;
if (fLevel=2) then
// start new page
if StartPagePrinter(fPrinterHandle)
then
fLevel:= 3;
Result:= (fLevel=3);
end;

function TRAWPrinter.EndDoc: Boolean;
begin
if (fLevel=3) then
if EndPagePrinter(fPrinterHandle) then
fLevel:= 2;
if (fLevel=2) then
if EndDocPrinter(fPrinterHandle) then
fLevel:= 1;
if (fLevel=1) then
if ClosePrinter(fPrinterHandle) then
fLevel:= 0;
Result:= (fLevel=0);
end;

function TRAWPrinter.Abort: Boolean;
begin
if (fLevel>1) then
if AbortPrinter(fPrinterHandle) then
fLevel:= 1;
if (fLevel=1) then
if ClosePrinter(fPrinterHandle) then
fLevel:= 0;
Result:= (fLevel=0);
end;

(***********************************************************************************)
function TRAWPrinter.Write(const Buffer;
Count: Integer): DWord;
begin
Result:= 0;
if (fLevel=3) then
WritePrinter(fPrinterHandle, Pointer(Buffer), Count, Result);
end;

function TRAWPrinter.WriteStr(const text: string): Boolean;
var len: DWord;
begin
len:= Length(text);
Result:= (Write(text,len)=len);
end;

function TRAWPrinter.WriteLn(const line: string): Boolean;
begin
Result:= WriteStr(line+#10#13);
end;

function TRAWPrinter.NextPage: Boolean;
begin
Result:= WriteStr(#12);
end;

function TRAWPrinter.CR: Boolean;
begin
Result:= WriteStr(#13);
end;

function TRAWPrinter.LF: Boolean;
begin
Result:= WriteStr(#10);
end;

end.
 
问题我已经解决的差不多了。实在不行就算了。另外提个问题吧。打印监控问题,我如何
监控能够记录下来某台打印机的每一个打印任务,打了多少张,纸型是什么,文档名等信息。
就像打印打印机任务列表中的信息差不多,不过多了一个纸型。以前有过类似的问题。但是
我没有找到一个很好的解决方案。监控打印队列,读系统日志(nt)或者其他什么的,如果
有通过测试的程序请发给我一份。phcn@163.com。谢谢。
 
to foxtailhuliwei:
前一个问题我解决的差不多了。不过不会让你白忙活的。我最后会给你一部分分数的。
谢谢。
 
gz,我也想知道!
 
不能白来吧!
 
tophcn:
能否把你的“多台打印机控制问题”解决方法给我介绍一下,我也碰到类似问题。有源代码
最好! shiflying@yxtc.net
 
是呀老大,大家学一下吗 a215a@163.net
 
不好意思,这个问题过去好长时间了,我也好长时间不上大富翁了。现在手头上没有源码,我当初用了一个api函数。具体怎么写的我忘了。好像是一个叫%um%的函数(记得不太清了)。想要的自己查查api函数表,表在网上随便都可以找到,一查就能查到,我手头上没有表。但是这个函数有局限,只能识别计算机的打印机默认设置,如果是能够自动换纸的打印机就会识别有误。源码手头没有了,因为工作都换了,我找了半天都没有找到,等找到再给大家吧。不好意思了。[:D]
 
后退
顶部