如题。怎么写?加在哪里?
..
Printer.BeginDoc;
...
Printer.Canvas.TextOut(200, 100, "fdfdsad很长的字符串!");
...
Printer.EndDoc;
谢谢
..
Printer.BeginDoc;
...
Printer.Canvas.TextOut(200, 100, "fdfdsad很长的字符串!");
...
Printer.EndDoc;
谢谢
printer.PageWidth:=297;
这样不行么,这就是A3纸的大小
Printer.BeginDoc;
...
Printer.Canvas.TextOut(200, 100, "fdfdsad很长的字符串!");
...
Printer.EndDoc;
里进行定义X,Y.下面是我设置Word宏录到的一段宏.你看一下.我选择的就是A3的纸张.
Sub Macro1()
With ActiveDocument.Styles(wdStyleNormal).Font
If .NameFarEast = .NameAscii Then
.NameAscii = ""
End If
.NameFarEast = ""
End With
With ActiveDocument.PageSetup
.LineNumbering.Active = False
.Orientation = wdOrientPortrait
.TopMargin = CentimetersToPoints(2.54)
.BottomMargin = CentimetersToPoints(2.54)
.LeftMargin = CentimetersToPoints(3.17)
.RightMargin = CentimetersToPoints(3.17)
.Gutter = CentimetersToPoints(0)
.HeaderDistance = CentimetersToPoints(1.5)
.FooterDistance = CentimetersToPoints(1.75)
.PageWidth = CentimetersToPoints(29.7)
.PageHeight = CentimetersToPoints(42)
.FirstPageTray = wdPrinterDefaultBin
.OtherPagesTray = wdPrinterDefaultBin
.SectionStart = wdSectionNewPage
.OddAndEvenPagesHeaderFooter = False
.DifferentFirstPageHeaderFooter = False
.VerticalAlignment = wdAlignVerticalTop
.SuppressEndnotes = False
.MirrorMargins = False
.TwoPagesOnOne = False
.BookFoldPrinting = False
.BookFoldRevPrinting = False
.BookFoldPrintingSheets = 1
.GutterPos = wdGutterPosLeft
.LayoutMode = wdLayoutModeLineGrid
End With
End Sub
其实最重要的就是
.PageWidth = CentimetersToPoints(29.7)
.PageHeight = CentimetersToPoints(42)
就是A3的纸张大小.
方 法 一: 利 用Delphi 的TPrinter 类 ----TPrinter 类 是Delphi 对Windows 打 印 处 理 系 统 的 封 装, 它 能 够 帮 助 程 序 员 在 开 发 打 印 程 序 时 尽 可 能 地 减 少 工 作 量。 在 程 序 中 使 用TPrinter, 只 要 在 单 元 的Use 子 句 后 面 添 加Printers 即 可。 当 前 打 印 机 的DevMode 结 构 的 句 柄 可 以 通 过 调 用Tprinter 类 中 的GetPrinter 方 法 来 获 取。 当 程 序 获 得DevMode 结 构 的 句 柄 后, 就 调 用 GlobalLock 函 数 来 得 到 指 向 该 结 构 的 指 针, 随 后 可 对 结 构 中 的 某 些 成 员 进 行 修 改。 下 面 就 举 一 个 例 子 来 说 明 这 一 问 题: 假 设 当 前 打 印 机 的 默 认 纸 张 尺 寸 是A3 纸, 现 在 要 打 印 长 度 为114mm、 宽 度 为190mm 的 纸 张。 为 了 简 单 起 见, 我 们 只 在Form1 上 放 置 一 个 Button1 按 钮, 增 加 一 个OnClick 事 件, 在Use 子 句 后 添 加Printers。 程 序 的 代 码 如 下: Procedure TForm1.Button1Click(Sender: TObject);
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);
// 获 取 打 印 机DevMode 结 构 的 句 柄 值,
存 放 在hDMode 中
if hDMode < > 0 then begin
pDMode := GlobalLock(hDMode);
// 获 取 指 向 打 印 机DevMode 结 构 的// 指 针
if pDMode < > nil then begin
pDMode^.dmPaperSize := 256;
// 如 果 要 将 当 前 打 印 机 纸 张 变 为 自 定 义
dmPaperSize 必 须 设 置 成256
pDMode^.dmPaperLength := 1140;
pDMode^.dmPaperWidth := 1900;
pDMode^.dmFields := pDMode^.dmFields or
DM_PAPERSIZE;
pDMode^.dmFields :=
pDMode^.dmFields or DM_PAPERLENGTH;
pDMode^.dmFields :=
pDMode^.dmFields or DM_PAPERWIDTH;
{ 以 上 三 条 语 句 是 对 相 应
的dmFields 成 员 进 行 置 位。}
ResetDC(Printer.Handle,pDMode^);
// 设 置 打 印 机 设 备 环 境 句 柄 的 值
GlobalUnlock(hDMode);
end;
end;
{ 下 面 的 代 码 是 为 了 测 试 打 印 机 是 否
按190 *114 纸 张 大 小 来 打 印 }
with Printer do begin
BeginDoc;
Canvas.TextOut(10,10,‘Hello, My Friend!');
EndDoc;
end;
end;方 法 二: 利 用 有 关 打 印 的Windows API 函 数 ----解 决 问 题 的 思 路 和 第 一 种 方 法 类 似, 首 先 要 获 取 当 前 打 印 机 的DevMode 结 构 的 指 针, 然 后 再 对 该 结 构 进 行 修 改, 从 而 修 改 打 印 机 纸 张 大 小。 要 完 成 上 述 功 能, 就 得 调 用 DocumentProperties 函 数。 利 用 该 函 数 程 序 就 可 以 获 取 并 修 改 与 当 前 打 印 机 相 关 的DevMode 结 构 中 的 成 员。DocumentProperties 函 数 申 明 如 下: LONG DocumentProperties
(
HWND hWnd,
HANDLE hPrinter,
LPTSTR pDeviceName,
PDEVMODE pDevModeOutput,
PDEVMODE pDevModeInput,
DWORD fMode
);----六 个 参 数 中 只 有pDevModeOutput 是 输 出 变 量, 其 余 五 个 参 数 必 须 由 程 序 给 出 具 体 值。 其 中,hWnd 表 征 当 前 窗 口 的 句 柄 值;hPrinter 表 示 当 前 打 印 机 的 句 柄;pDeviceName 是 对 打 印 机 设 备 的 描 述;pDevModeOutput 是 指 向 句 柄 值 为hPrinter 的 打 印 机 DevMode 结 构 的 指 针;pDevModeInput 是 指 向 一 个 修 改 后 的DevMode 结 构 的 指 针, 该 结 构 有 待 于 被 句 柄 值 为hPrinter 的 打 印 机 接 受;fMode 定 义 了 该 函 数 的 具 体 功 能, 如 果 取 值DM_IN_BUFFER 那 么 表 示 打 印 机 接 受 由 参 数pDevModeInput 表 示 的 由 程 序 修 改 了 的DevMode 值, 如 果 取 值DM_OUT_BUFFER 那 么 程 序 可 以 通 过 参 数pDevModeOutput 来 获 取 打 印 机 的DevMode 值, 如 果fMode 为 零, 则 函 数 返 回 的 值 表 示 结 构 DevMode 所 需 的 字 节 数。 承 接 上 述 例 子, 现 在 将190 *114 大 小 的 纸 张 设 成A4 纸。 再 往Form1 上 放 置 按 钮Button2, 增 加OnClick 事 件, 在Use 子 句 后 面 添 加WinSpool。 代 码 如 下: Procedure TForm1.Button2Click(Sender: TObject);
var
PrnHd : THandle;
PrnInfo : PPrinterInfo1;
pcbNeeded : DWORD;
PDevModeBytes : DWORD;
DevMode: PDeviceMode;
PrnHdc : HDC;
DocInfo : PDocInfo;
begin
OpenPrinter(‘Epson LQ -1600K',PrnHd,nil);
// 获 得 打 印 机 句 柄PrnHd
GetMem(PrnInfo,1024);
GetPrinter(PrnHd,1,PrnInfo,1024,@pcbNeeded);
PDevModeBytes:= DocumentProperties
( Handle,PrnHd,prninfo^.
pDescription,DevMode^,DevMode^,0 );
{ 获 取DevMode 结 构 所 需 的 字 节 数 }
GetMem(DevMode,PDevModeBytes);
// 给 结 构DevMode 分 配 空 间
DocumentProperties( Handle,PrnHd,PrnInfo^.p
Description,DevMode^,DevMode^,DM_OUT_BUFFER );
// 获 取 打 印 机 的DevMode 结 构
With DevMode^ do begin
dmPaperSize := DMPAPER_A4 ;
// 将 纸 张 设 置 成A4 纸
dmFields := dmFields or DM_PAPERSIZE;
end;
DocumentProperties( Handle,PrnHd,PrnInfo^.p
Description,DevMode^,DevMode^,
DM_OUT_BUFFER or DM_IN_BUFFER);
// 修 改DevMode 结 构。
{ 下 面 的 代 码 是 为 了 测 试 打 印 机
是 否 按A4 纸 大 小 来 打 印 }
PrnHdc := CreateDC
( nil, ‘Epson LQ -1600K',nil,DevMode );
GetMem( DocInfo, 100 );
With DocInfo^ do begin
cbSize := sizeof(DocInfo);
lpszDocName := nil;
lpszOutput := nil;
lpszDatatype := nil;
fwType := DI_APPBANDING;
end;
StartDoc( PrnHdc, DocInfo^);
StartPage(PrnHdc);
TextOut( PrnHdc, 10, 10, ‘Hello My Friend!',17);
EndPage(PrnHdc);
EndDoc(PrnHdc);
DeleteDC(PrnHdc);
FreeMem(DocInfo);
FreeMem(PrnInfo);
FreeMem(DevMode);
end;----至 此, 程 序 实 现 了 本 文 开 头 所 提 出 的 要 求。 需 要 指 出 的 是, 上 述 代 码 是 在 程 序 运 行 时, 动 态 地 改 变 打 印 机 纸 张 大 小, 而 不 改 变 打 印 机 默 认 纸 张 大 小。 也 就 是 说 当 打 印 程 序 运 行 结 束 后, 打 印 机 还 是 会 按 照 默 认 打 印 纸 张 大 小 来 打 印、 走 纸。 动 态 调 整 打 印 机 纸 张 尺 寸 也 是 因 打 印 机 而 异, 某 些 打 印 机 基 本 不 支 持 自 定 义 纸 张, 例 如 惠 普 的HP DeskJet 1120C 喷 墨 打 印 机 以 及 众 多 激 光 打 印 机。 因 此 在 这 些 打 印 机 上, 不 能 实 现 按 任 意 纸 张 大 小 打 印。 对 于 一 些 针 式 打 印 机 则 没 有 上 述 问 题。 ----上 述 程 序 是 在Windows 95 环 境 下, 用Delphi 4.0 为 开 发 工 具 调 试 通 过。
setPaper("zp0001",170,298);
Printer.BeginDoc;
...
Printer.Canvas.TextOut(200, 100, "fdfdsad很长的字符串!");
...
Printer.EndDoc;
我遇到的问题是:
打印机:Epson LQ-300K
系统:win98
系统的纸张选择自定义。
程序:在QR设置Papersize为:Custom.可以实现自定义但是当系统换为Win2000和Winxp就不起作用了,不可以自定义,配置如下:
打印机:Epson LQ-300K
系统:Win2000或Winxp
系统的纸张选择自定义(在设置-打印机-文件-服务器属性-新建)
程序:在QR设置Papersize为:Custom.或者defult
结果:就不可以自定义了。
你知道我的问题吗?
你的问题我知道是怎么回事。因为Win98已前的打印机的纸张定义可以直接设置Width和Height,但是从Window2000开始,打印机的纸张定义就不能这样设置了,只能是先定义页形(Paper),然后选择页形。这个载微软的MSDN上有说明的。
procedure SetPaperSize(X, Y: Integer);
// 这段代码绝对可用。单位是0.1mm
// A4时 Printer.Pagewidth:=1440; A5时 Printer.Pagewidth:=1049;
// B5时 Printer.Pagewidth:=1290; 16K时 Printer.Pagewidth:=1035;
// lq1600宽行打印机这个值宽度最大为42cm左右, 长度大约2m。
{Question:
How can I change the papersize of my print job?
Answer:
One way to change printer settings at the start
of a print job is to change the printer's devicemode
structure.
See: TDEVMODE in the Delphi 1.02 help file or DEVMODE
in the Delphi 2.01 help file for other settings you can
change (providing the print driver supports the change).
The following example, contains code to change the papersize and
the paper bin that is uses:}
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.PrinterIndex := Printer.PrinterIndex;
Printer.GetPrinter(Device, Driver, Port, hDMode);
if hDMode <> 0 then
begin
pDMode := GlobalLock(hDMode);
if pDMode <> nil then
begin
if (x = 0) or (y = 0) then
begin
{Set to legal}
pDMode^.dmFields := pDMode^.dmFields or dm_PaperSize;
{pDMode^.dmPaperSize := DMPAPER_LEGAL; changed by wulianmin}
pDMode^.dmPaperSize := DMPAPER_FANFOLD_US;
end
else
begin
{Set to custom size}
pDMode^.dmFields := pDMode^.dmFields or
DM_PAPERSIZE or
DM_PAPERWIDTH or
DM_PAPERLENGTH;
pDMode^.dmPaperSize := DMPAPER_USER;
pDMode^.dmPaperWidth := x {SomeValueInTenthsOfAMillimeter};
pDMode^.dmPaperLength := y {SomeValueInTenthsOfAMillimeter};
end;
{Set the bin to use}
pDMode^.dmFields := pDMode^.dmFields or DMBIN_MANUAL;
pDMode^.dmDefaultSource := DMBIN_MANUAL; GlobalUnlock(hDMode);
end;
end;
Printer.PrinterIndex := Printer.PrinterIndex;
//以下开始打印
end;
note:
此句:
{Set the bin to use}
pDMode^.dmFields := pDMode^.dmFields or DMBIN_MANUAL;
pDMode^.dmDefaultSource := DMBIN_MANUAL;
是设定进纸为手动(DMBIN_MANUAL)