APS NZ
asked on
Setting up a printer from code
Hi
I have created text based reports to be sent to a specific printer, and to a specific paper size. Different reports (not using QuickReport) require different printer settings.
Is there a way to assign the printer and the paper size in code when the user clicks the button to print the report? Sometimes the paper size is *custom* (preprinted forms)
The printers involved are on a NT network and are a laserjet and an old dot matrix printer.
Regards John
I have created text based reports to be sent to a specific printer, and to a specific paper size. Different reports (not using QuickReport) require different printer settings.
Is there a way to assign the printer and the paper size in code when the user clicks the button to print the report? Sometimes the paper size is *custom* (preprinted forms)
The printers involved are on a NT network and are a laserjet and an old dot matrix printer.
Regards John
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
This is a sample on how to print documents on Matrix printers setting the paper size by code.
Adjust paper Length an Width as you want!
Good luck!
VSF
www.enge.cjb.net
www.victory.hpg.com.br
UIN:14016999
procedure TFrmBoletos.CmdImprimirCli ck(Sender: TObject);
var
Device : array[0..255] of char;
Driver : array[0..255] of char;
Port : array[0..255] of char;
hDMode : THandle;
PDMode : PDEVMODE;
VMULTA,VVALOR:REAL;
begin
Printer.GetPrinter(Device, Driver, Port, hDMode);
If hDMode <> 0 then
begin
pDMode := GlobalLock( hDMode );
If pDMode <> nil then
begin
pDMode^.dmPaperSize := DMPAPER_USER;
pDMode^.dmPaperWidth := 1600; // determines paper width
pDMode^.dmPaperLength := 1020; // determines paeper length
pDMode^.dmFields := pDMode^.dmFields or DM_PAPERSIZE;
GlobalUnlock( hDMode );
end;
end;
Printer.BeginDoc;
Printer.Canvas.Pen.Width := 5;
Printer.Canvas.Font.Name := 'Arial';
Printer.Canvas.Font.Size := 10;
Printer.Canvas.TextOut(005 ,035,'Samp le on how to set printer');
Printer.Canvas.TextOut(620 ,035,'Use the coordenades to print anywhere');
Printer.EndDoc;
End;
end;
Adjust paper Length an Width as you want!
Good luck!
VSF
www.enge.cjb.net
www.victory.hpg.com.br
UIN:14016999
procedure TFrmBoletos.CmdImprimirCli
var
Device : array[0..255] of char;
Driver : array[0..255] of char;
Port : array[0..255] of char;
hDMode : THandle;
PDMode : PDEVMODE;
VMULTA,VVALOR:REAL;
begin
Printer.GetPrinter(Device,
If hDMode <> 0 then
begin
pDMode := GlobalLock( hDMode );
If pDMode <> nil then
begin
pDMode^.dmPaperSize := DMPAPER_USER;
pDMode^.dmPaperWidth := 1600; // determines paper width
pDMode^.dmPaperLength := 1020; // determines paeper length
pDMode^.dmFields := pDMode^.dmFields or DM_PAPERSIZE;
GlobalUnlock( hDMode );
end;
end;
Printer.BeginDoc;
Printer.Canvas.Pen.Width := 5;
Printer.Canvas.Font.Name := 'Arial';
Printer.Canvas.Font.Size := 10;
Printer.Canvas.TextOut(005
Printer.Canvas.TextOut(620
Printer.EndDoc;
End;
end;
ASKER
Hello inthe, ginsonic and VSF - thanks for the replies.
All the replies are good, and I now have the problem of who to award the points to. How would I go about awarding points to more than one person?
John
All the replies are good, and I now have the problem of who to award the points to. How would I go about awarding points to more than one person?
John
hi,
just pick the one which helps the most/suits you the best .
just pick the one which helps the most/suits you the best .
i wasnt sure from your q if you needed to change the printer itself or just papersizes but if you do you can use code like below to get a list of printer names and use it with ginsonics code for actual changing the printer:
uses printers;
procedure TForm1.Button1Click(Sender : TObject);
begin
listbox1.clear;
listbox1.items.assign(Prin ter.printe rs);
end;
then use code me,vsf posted for changing the papersize.(i notice our code looks rather similar..)
uses printers;
procedure TForm1.Button1Click(Sender
begin
listbox1.clear;
listbox1.items.assign(Prin
end;
then use code me,vsf posted for changing the papersize.(i notice our code looks rather similar..)
1. Use the good answers order .
2. Choice the best answer for you .
3. Share the points . I know that Ex-Ex can do that , but I don't remember how :P
Or can delete this questions and put two new 25 points questions one named 'POINTS FOR GINSONIC' and one 'POINTS FOR VSF'.
In any case I'm glad that my answer help you .
See you on net .
2. Choice the best answer for you .
3. Share the points . I know that Ex-Ex can do that , but I don't remember how :P
Or can delete this questions and put two new 25 points questions one named 'POINTS FOR GINSONIC' and one 'POINTS FOR VSF'.
In any case I'm glad that my answer help you .
See you on net .
ASKER
Thanks again inthe - I really appreciate the help. I want to give both you and ginsonic some points - maybe if I put in another dummy question with the same title and you can answer it? Let me know.
I will give the points here to ginsonic.
VSF: This in no way infers your help is not useful, but inthe's answer and yours are similar, and inthe got in first.
John
I will give the points here to ginsonic.
VSF: This in no way infers your help is not useful, but inthe's answer and yours are similar, and inthe got in first.
John
>>dummy question with the same title
>>and you can answer it? Let me know
i dont mind ;-)
hey vsf's picture is on EOTW :-)
>>and you can answer it? Let me know
i dont mind ;-)
hey vsf's picture is on EOTW :-)
heres an example i have of changing the papersize and bin:
unit Unit1;
interface
uses
Windows, Messages,Printers, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender
var
Device : array[0..255] of char;
Driver : array[0..255] of char;
Port : array[0..255] of char;
hDMode : THandle;
PDMode : PDEVMODE;
begin
Printer.GetPrinter(Device,
if hDMode <> 0 then begin
pDMode := GlobalLock(hDMode);
if pDMode <> nil then begin
{Set to legal}
pDMode^.dmFields := pDMode^.dmFields or dm_PaperSize;
pDMode^.dmPaperSize := DMPAPER_LEGAL;
{Set to custom size}
pDMode^.dmFields := pDMode^.dmFields or
DM_PAPERSIZE or
DM_PAPERWIDTH or
DM_PAPERLENGTH;
pDMode^.dmPaperSize := DMPAPER_USER;
pDMode^.dmPaperWidth := 100 {SomeValueInTenthsOfAMilli
pDMode^.dmPaperLength := 100 {SomeValueInTenthsOfAMilli
{Set the bin to use}
pDMode^.dmFields := pDMode^.dmFields or DMBIN_MANUAL;
pDMode^.dmDefaultSource := DMBIN_MANUAL;
GlobalUnlock(hDMode);
end;
end;
Printer.PrinterIndex := Printer.PrinterIndex; Printer.BeginDoc;
Printer.Canvas.Font.Name := 'Courier New'; Printer.Canvas.Font.Size := 10;
Printer.Canvas.Font.Color:
Printer.Canvas.TextOut(100
end;
end.
i advise have a look in windows.pas for more paper sizes under:
{ paper selections } heading.there is quite a lot.