我用delphi6写的程序,打印两种不同大小的报表(一种是 A4,一种是卡片,打印机是epson lq300),打印时不用每次手动设置打印机的属性,如何自动控制,打印票据时自动为卡片的大小,打印其他报表时自动为A4的大小?
解决方案 »
- 一个关于delphi调用dll的问题,dll有函数说明,请求帮助,马上结贴
- 求能导出中文的fastreport
- 如何将对话框显示在所有程序的最前面.
- webbrowser.navigate() 函数的问题! 马上给分
- ADOQUERY的SQL语句查询出的MEMO型数据为什么总是不完全?
- 关于DELPHI调用动态连接库的问题!
- 请问QQ的原理如何?是怎样在广域网里运行的?我想做一个QQ聊天程序(C/S结构),局域网内运行正常,在广域网里为何连接不上服务器端!
- 主从表都缓存时insert,delete的问题
- 在Delphi中导出Excel表的遇到的问题
- 调用系统窗口
- 关于在AdoQuery中使用distinct的问题
- 如何获取目录?SelectoryDirectory的界面太丑了,有无其它(界面简洁一点)的?
var
adevice,adriver,aport:array[0..255] of char;
devicehandle:thandle;
devmode:pdeviceMode;
begin
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
devmode:=globalLock(devicehandle);
//以下开始初始化打印机
with devmode^ do
begin
//打印份数
dmfields:=dmfields or dm_copies;
dmcopies:=strtoint(maskedit1.Text);
//打印纸张
dmfields:=dmfields or dm_papersize;
dmpapersize:=256;
dmfields:=dmfields or dm_paperlength;
dmpaperlength:=dm.rstype['paperlength'];
dmfields:=dmfields or dm_paperwidth;
dmpaperwidth:=dm.rstype['paperwidth'];
resetdc(devicehandle,devmode^); //加上这句即可
end;
if not devicehandle=0 then
globalunlock(devicehandle);
end;
procedure setprinter;//设置打印机
type
Tpname=array[0..63]of char;
Tpnames=array[0..0]of Tpname;
var
papernames:pointer;
i,rslt:integer;
device,driver,port:array[0..255]of char;
adevmode,PrnHd:Thandle;
devmode:Pdevicemode;
a3support:boolean;
PrnInfo : PPrinterInfo1;
pcbNeeded,PDevModeBytes : DWORD;
begin
printer.PrinterIndex :=printer.PrinterIndex ;
printer.GetPrinter(device,driver,port,adevmode);
rslt:=devicecapabilitiesa(device,port,dc_papernames,nil,nil);
if rslt>0 then
begin
getmem(papernames,rslt*64);
try
if devicecapabilitiesa(device,port,dc_papernames,papernames,nil)=-1 then
raise exception.Create('deccap error');
for i:=0 to rslt - 1 do
if strpas(Tpnames(papernames^)[i])='A3' then
a3support:=true;
finally
freemem(papernames,rslt*64);
end;
end;
if a3support then
begin
printer.PrinterIndex :=printer.PrinterIndex ;
printer.GetPrinter(device,driver,port,adevmode);
if adevmode<>0 then
begin
devmode:=globallock(adevmode);
try
devmode^.dmFields:=devmode^.dmFields or dm_papersize or dm_orientation;
devmode^.dmpapersize:=DMPAPER_A3;
devmode^.dmOrientation :=dmorient_portrait;
// devmode^.dmpapersize:=DMORIENT_LANDSCAPE;
Printer.SetPrinter(Device,Driver,Port,aDevmode);
finally
globalunlock(adevmode);
end;
end
else
raise exception.Create('打印机初始化错误!'); printer.BeginDoc ;
printer.Canvas.TextOut(5,6,'24efhsdghasjhgjkf');
printer.EndDoc ;
end;
end;
这样吧,用Delphi举个例子吧,以下程序将打印机纸张设为:114mm*190mm:procedure PreparePrinter;varaDevice: array[0..CCHDEVICENAME-1] of Char;aDriver: array[0..MAX_PATH-1] of Char;aPort: array[0..31] of Char;hDevMode: THandle;pDevMode: PDeviceMode;begin// 获取打印机DeviceMode的句柄Printer.GetPrinter(aDevice, aDriver, aPort, hDevMode);if hDevMode <> 0 thenbegin// 获取指向DeviceMode的指针pDevMode := GlobalLock(hDevMode);if pDevMode <> nil thenbeginpDevMode^.dmPaperSize := DMPAPER_USER;pDevMode^.dmPaperLength := 1140;pDevMode^.dmPaperWidth := 1900;pDevMode^.dmFields := pDevMode^.dmFields or DM_PAPERSIZE;pDevMode^.dmFields := pDevMode^.dmFields or DM_PAPERLENGTH;pDevMode^.dmFields := pDevMode^.dmFields or DM_PAPERWIDTH;ResetDC(Printer.Handle, pDevMode^);GlobalUnlock(hDevMode);end;end;end;用修改DeviceMode的方法的话,只是改变你程序中的打印机设置,不会影响其他程序打印的。
开始---设置----打印机---文件----服务器属性---创建新格式