有二个打印机,让用户可以选择从那个打印机打印(100分)

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

babygo2000

Unregistered / Unconfirmed
GUEST, unregistred user!
现在用户有二只打印机,客户现在需要实现的是,他希望从那一台打印机打印,就从那一
台打印机打印,不知DELPHI中如何实现。望有类似经验的高手指点迷津!急...
 
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 -1do
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 = Chr(0)
then
begin
nameLength := i - startPos;
SetLength(str, nameLength);
for j := 0 to nameLength - 1do
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) >
0do
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.
 
窗体上有个TComBox,命名为cb1
窗体名为Form1
procedure TForm1.FormCreate(Sender: TObject);
begin
cb1.items.assign(printer.printers);
end;

procedure TForm1.Button1Click(Sender: TObject);
var LPrinter:string;
PrinIniFile:Tinifile;
LStr:string;
begin
LStr:=printer.Printers[cb1.itemindex];
delete(Lstr,pos(' on ',Lstr),Length(LStr));
PrinIniFile:=TIniFile.Create('WIN.ini');
try
LPrinter:=PrinIniFile.ReadString('Devices',LStr,'');
PrinIniFile.writestring('windows','device',LStr+','+LPrinter);
finally
PrinIniFile.free;
end;
end;
***********************
uses printers;

procedure SetDefaultPrinter(const printerindex:integer);
Var
FHandle : THandle;
HPrt : THandle;
PrtInfo5: PPrinterInfo5;
FDevice: array[0..79] of char;
FDriver: array[0..79] of char;
FPort: array[0..79] of char;
begin

{printerindex为选中打印机的索引,如果使用打印机名称,则此句可忽略}
Printer.PrinterIndex := printerindex;
Printer.GetPrinter (FDevice, FDriver, FPort, FHandle);
OpenPrinter(FDevice, HPrt, nil);
if HPrt = 0 then
raise(Exception.Create('不能打开打印机'));
try
PrtInfo5 := GetPrinterInfo5(HPrt);
PrtInfo5.Attributes := PrtInfo5.Attributes +
PRINTER_ATTRIBUTE_DEFAULT;
SetPrinter(HPrt,5,PrtInfo5,PRINTER_CONTROL_SET_STATUS);
FreeMem(PrtInfo5);
finally
ClosePrinter(HPrt);
end;

end;

设置打印机的,你看一下吧
 
to app2001
你的设置默认打印机是可以的,但默认设置后没有刷新,一定要程序重新启动一下!
不知你是否有解决的方法
 
我不太清楚你是在什么地方打印,实际上如果是指定打印机打印的话我楼上的做法就不错,如果是在报表里指定打印机的话
使用QR的时候,如果系统有多台打印机,如果要使用某台指定的打印机的话,QR却把所有的打印人物都发送到默认的打印机上面去了,那么如何发送到指定的打印机呢?
可以这样,直接指定输出打印机就可以了:
Printer.PrinterIndex:=0;
///指定第一台打印机为输出设备
Printer.PinnterIndex:=-1;
///默认打印机为输出设备
 
to app2001
用你的方法不能该变QR的输出打印机,能不能写的仔细点
 
可以用 printers.Printer.Printers 获得打印机列表
可以用 printers.printer.printers.Indexof('打印机名') 获取指定打印机索引
可以用 printers.Printer.PrinterIndex:= 打印机索引;
来设置当前打印机
如果是用 TQuickRep 组件
QuickRep1.PrinterSettings.PrinterIndex:= 打印机索引;
来设置当前打印机
 
楼上的我正好有个问题,我用的fastreport
前面都正确的,使用方法也是相同的,但是fastreport 没有直接赋值的,只有
frreport1.ChangePrinter(0, i);i就是取出来的打印机索引,用QR没有问题,我的方法在大多数情况下也没有问题,但是现在碰到一个问题,在一台机器上,装了2个打印机
一台HP100,一台HP1000,
我要控制选用非默认打印机Hp1000打印,就提示print index out ,,,如果改变打印机为默认打印机,就没有问题!使用QR控制的话可以实现,而且我的程序在大部分机器上测试通过,就在那台机器上出了问题,原因可能是那台机器装了一台网络打印机,网线练的那种,绘图仪,但是很奇怪的就是我把那台hp1000装到别的机器也测试通不过了,我在有台机器装了4个打印机测试都通过了使用我的办法!,急啊,真不知道什么原因了!
 
后退
顶部