要在一台电脑上控制两台打印机打印,怎么办啊?

cap_125 2004-10-31 05:40:18
现在写的一个软件中,需要将两种类型的报表用两台打印机分别打印。
比如控制报表A自动用打印机A打印,报表B自动用打印机B打印。我用的quick report。
请教高手,这样应该如何进行啊?
分不够可以再加,请高手指教。不胜3k。
...全文
1544 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
cap_125 2004-11-30
  • 打赏
  • 举报
回复
谢谢各位了。
ghchen 2004-11-02
  • 打赏
  • 举报
回复
学习......
ksaiy 2004-11-02
  • 打赏
  • 举报
回复
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

const
MAXPRINTERBUFFER = 8000;
MAXPRINTERNAME = 500;
MAXPRINTERINFO = 50;

type
TPrinterBuffer = array[0..MAXPRINTERBUFFER - 1] of char;
TForm1 = class(TForm)
ListBox1: TListBox;
Button2: TButton;
Button1: TButton;
Label1: TLabel;
procedure Button2Click(Sender: TObject);
procedure GetPrinterNames;
function ParseNames(const namebuffer: TPrinterBuffer; var startPos: integer): string;
function SetPrinter(const PrinterName : String) : boolean;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
printerNames: TStringList;
defaultPrinter: integer;

implementation

{$R *.DFM}

procedure TForm1.Button2Click(Sender: TObject);
var
x : integer;
begin
try
for x := 0 to printerNames.Count -1 do begin
If ListBox1.Selected[x] then begin
if (SetPrinter(ListBox1.Items.Strings[x]))
then label1.Caption := 'Printer set to ' + ListBox1.Items.Strings[x]
else label1.Caption := 'Printer not set';
end;
end;
except
label1.Caption := 'An error occured while setting the printer';
end;
end;

procedure TForm1.GetPrinterNames;
var
buffer: TPrinterBuffer;
currPos: integer;
printerName: string;
begin
printerNames.Free;
printerNames := TStringList.Create;
if GetProfileString(PChar('PrinterPorts'), nil, '', buffer, MAXPRINTERBUFFER) > 0 then
begin
currPos := 0;
while (true) do
begin
printerName := ParseNames(buffer, currPos);
if printerName <> '' then
printerNames.Add(printerName)
else
break;
end;
end;
end;

function TForm1.ParseNames(const namebuffer: TPrinterBuffer;
var startPos: integer): string;
var
i, j, NameLength: integer;
str: string;
begin
result := '';
if (startPos > High(namebuffer)) or (namebuffer[startPos] = Chr(0))

then
exit;
for i := startPos to High(namebuffer) do begin
if namebuffer[i] = Chr(0)

then begin
nameLength := i - startPos;
SetLength(str, nameLength);
for j := 0 to nameLength - 1 do
str[j+1] := namebuffer[startPos + j];
result := str;
startPos := i + 1;
break;
end;
end;
end;

function TForm1.SetPrinter(const PrinterName: String): boolean;
var
s2 : string;
dum1 : Pchar;
xx, qq : integer;
const
cs1 : pchar = 'Windows';
cs2 : pchar = 'Device';
cs3 : pchar = 'Devices';
cs4 : pchar = #0;

begin
xx := 254;
GetMem( dum1, xx);
Result := False;
try
qq := GetProfileString( cs3, pchar( printerName ), #0, dum1, xx);
if (qq > 0) and (trim( strpas( dum1 )) <> '')

then begin
s2 := PrinterName + ',' + strpas( dum1 );
while GetProfileString( cs1, cs2, cs4, dum1, xx) > 0 do
WriteProfileString( cs1, cs2, #0);
WriteProfileString( cs1, cs2, pchar( s2 ));
case Win32Platform of
VER_PLATFORM_WIN32_NT :
// SendMessage( HWND_BROADCAST, WM_WININICHANGE, 0, LongInt(cs1));
// VER_PLATFORM_WIN32_WINDOWS :
// SendMessage( HWND_BROADCAST, WM_SETTINGCHANGE, 0, LongInt(cs1));
end;
Result := True;
end;
finally
FreeMem( dum1 );
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
GetPrinterNames;
Listbox1.Items.AddStrings(PrinterNames);
end;

end.
qufo 2004-11-02
  • 打赏
  • 举报
回复
回复人: masterjames(三月街) ( ) 信誉:97 2004-11-01 12:41:00 得分: 0


同时打印是不行的(除非用并行计算机),建议客户只要用一个打印吧,或两台电脑,
这个在我做的项目中,开始客户不同意,后来,发现一点也不慢,最后就用了一台电脑


嘿嘿,偶就用同时打印,一点按钮两台打印机一起动作。
一般说来,就算动态设置打印机,也得等一台打印机打完后另一台打印机才开始工作,如果第一台打印机打印20页的话,嘿嘿。
我的程序可以让第一台打印机开始打印一两秒之内另一台打印机马上响应,开始打印。嘿嘿。
masterjames 2004-11-01
  • 打赏
  • 举报
回复
同时打印是不行的(除非用并行计算机),建议客户只要用一个打印吧,或两台电脑,
这个在我做的项目中,开始客户不同意,后来,发现一点也不慢,最后就用了一台电脑
qufo 2004-11-01
  • 打赏
  • 举报
回复
我已成功实施的方案中可以解决此需求。

我的项目中需要打印销售清单及发票,其中A打印机打印清单,使用 220x190的1+5的印(链式),B机打印发票,发票是四联的,180x70。

只要点下一个按钮,则打印机A打印清单,B打印机同时打印出发票出来。

有兴趣可以联系。 qufo#tom.com
xhh_88 2004-11-01
  • 打赏
  • 举报
回复
动态设置打印机.
才子鸣 2004-10-31
  • 打赏
  • 举报
回复
up
longtusoft 2004-10-31
  • 打赏
  • 举报
回复
metro 2004-10-31
  • 打赏
  • 举报
回复
在打印预览里就可以选择了,比如网络上有n个打印机,你可以任意选其中一个
yat5460 2004-10-31
  • 打赏
  • 举报
回复
可以先获取打印机列表啊
readersm68 2004-10-31
  • 打赏
  • 举报
回复
通过定义的打印机名称,定位在Printer.Printers中的位置,设置打印机Printer.PrinterIndex值,来指定打印机。
readersm68 2004-10-31
  • 打赏
  • 举报
回复
先定义打印机名称,及对应报表。打印前取得所有打印机的名称(Printer.Printers),然后打印前通过报表对应的打印机名称,在获得的打印机名称查找没有,提示,安装活修订打印机名称,有的话指定打印机进行打印。

2,497

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧