现需自动更改打印的打印首选项,将纸张类别变更,但根据网上的资料总不能解决?//isize:=DMPAPER_A3;procedure changeSize(isize:integer);
var
Device: array[0..cchDeviceName - 1] of char;
Driver: array[0..MAX_PATH - 1] of char;
Port: array[0..MAX_PATH - 1] of char;
hDMode: THandle;
PDMode: PDEVMODE;
s:array [0..64] of char;
begin
Printer.GetPrinter(Device,Driver,Port,hDMode);
if hDMode <> 0 then begin
pDMode:=GlobalLock(hDMode);
if pDMode <> nil then begin
pDMode^.dmPaperSize:=iSize;
pDMode^.dmFields:=pDMode^.dmFields or DM_PAPERSIZE;
Printer.SetPrinter(Device,Driver,Port,hDMode);
GlobalUnlock(hDMode);
strcopy(s,'windows');
//sendmessage(hwnd_broadcast,wm_settingchange,0,longint(@s));
end;
end;
end;
在执行程序后,打印机的打印首选项没有变动,急啊!
var
Device: array[0..cchDeviceName - 1] of char;
Driver: array[0..MAX_PATH - 1] of char;
Port: array[0..MAX_PATH - 1] of char;
hDMode: THandle;
PDMode: PDEVMODE;
s:array [0..64] of char;
begin
Printer.GetPrinter(Device,Driver,Port,hDMode);
if hDMode <> 0 then begin
pDMode:=GlobalLock(hDMode);
if pDMode <> nil then begin
pDMode^.dmPaperSize:=iSize;
pDMode^.dmFields:=pDMode^.dmFields or DM_PAPERSIZE;
Printer.SetPrinter(Device,Driver,Port,hDMode);
GlobalUnlock(hDMode);
strcopy(s,'windows');
//sendmessage(hwnd_broadcast,wm_settingchange,0,longint(@s));
end;
end;
end;
在执行程序后,打印机的打印首选项没有变动,急啊!
解决方案 »
- 请大家帮我拿拿主义吧,重谢:(
- 利用excelapplication1从数据库中导出数据到EXCEL表中出现错误。
- [在线等!]控件文本输入筐只能输入6个有效字符,可是对应的数据库该项能输入13个字符的,是不是要改控件的属性啊?怎么改?
- 简单的问题
- Property的read和write问题。
- skinengine的skindbgrid的column不能显示中文字段名?有谁知道
- 如何编制delphi控件?
- delphi2007 如何安装indy9.0
- 集合的作用是什么?
- 线程高手看过来!
- 兴奋帖:精通C++的5条绝密配方,如果你做到了,Bill Gates开着加长车,像当年请Anders Hejlsberg一样来请你
- 我哪错了?谁帮我改改
private
protected
public
class procedure SetDefaultPrinter(PrinterName: String);
class procedure SetPaperSize(PaperSize, PaperLength, PaperWidth: Integer);
end; class procedure TPublic.SetDefaultPrinter(PrinterName: String);
var
j: Integer;
Device : PChar;
Driver : Pchar;
Port : Pchar;
HdeviceMode: Thandle;
aPrinter : TPrinter;
begin
Printer.PrinterIndex := -1;
getmem(Device, 255) ;
getmem(Driver, 255) ;
getmem(Port, 255) ;
aPrinter := TPrinter.create;
for j := 0 to Printer.printers.Count-1 do
begin
if Printer.printers[j] = PrinterName then
begin
aprinter.printerindex := j;
aPrinter.getprinter(device, driver, port, HdeviceMode) ;
StrCat(Device, ',') ;
StrCat(Device, Driver ) ;
StrCat(Device, Port ) ;
WriteProfileString('windows', 'device', Device) ;
StrCopy( Device, 'windows' ) ;
SendMessage(HWND_BROADCAST, WM_WININICHANGE, 0 , Longint(@Device)) ;
end;
end;
Freemem(Device, 255) ;
Freemem(Driver, 255) ;
Freemem(Port, 255) ;
aPrinter.Free;
end;class procedure TPublic.SetPaperSize(PaperSize, PaperLength,
PaperWidth: Integer);
var
Device : array[0..cchDeviceName -1] of Char;
Driver : array[0..(MAX_PATH -1)] of Char;
Port : array[0..32]of Char;
hDMode : THandle;
pDMode : PDevMode;
begin
Printer.GetPrinter(Device,Driver,Port,hDMode);
if hDMode <> 0 then
begin
pDMode := GlobalLock(hDMode);
if pDMode <> nil then
begin
pDMode^.dmPaperSize := PaperSize;
pDMode^.dmPaperLength := PaperLength;
pDMode^.dmPaperWidth := PaperWidth;
pDMode^.dmFields := pDMode^.dmFields or
DM_PAPERSIZE;
pDMode^.dmFields :=
pDMode^.dmFields or DM_PAPERLENGTH;
pDMode^.dmFields :=
pDMode^.dmFields or DM_PAPERWIDTH;
ResetDC(Printer.Handle,pDMode^);
GlobalUnlock(hDMode);
end;
end;
end;......实际调用TPublic.SetDefaultPrinter('EPSON LQ300K+');TPublic.SetPaperSize(256, 635, 1450);//注意256这个值表示自定义纸张
TPublic.SetPaperSize(256, 635, 1450);//注意256这个值表示自定义纸张上面2个肯定是没有问题的。(久经沙场了的)Pdf.LoadFile('sigid.pdf');
Pdf.print;在我这里测试没有任何问题。 你试试打印一下其他的文件,再查查原因
Pdf.print;
我可以成功打印,但不能设置纸张类型,printwithdialog可以,但会出现对话框
pdf.print在打印之前能设置纸张类型就成事OK了我使用的是奥西的S320绘图仪
//(256, 635, 1450);可以吗,因为我只有一个打印机,不需要再设置defalutprint吧
可以的。