線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:5124
推到 Plurk!
推到 Facebook!

老問題:設定紙張大小的問題

尚未結案
RootKit
資深會員


發表:16
回覆:357
積分:419
註冊:2008-01-02

發送簡訊給我
#1 引用回覆 回覆 發表時間:2010-05-10 10:45:41 IP:60.250.xxx.xxx 訂閱
使用 AddForm 方式增加一個紙張格式。
我測試結果在 Windows2000/NT 可以,並且可在紙張列表中找到該新增的紙張名稱。

而在 Windows XP 卻不行。在「印表機與傳真」->「檔案」->「伺服器內容」有看見該紙張格式
但在DeviceCapabilities 紙張列表中卻找不到。
Why ?

另外,我用以下函數在 Win200/XP 都沒問題。好像看過有人反應不支援 Win2000/NT
覺得有些疑惑。

[code delphi]
procedure SetPaperSize(X, Y: Integer);
// 單位是0.1mm
//改變devicemode結構
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;
end;

[/code]

chris681016
中階會員


發表:64
回覆:117
積分:96
註冊:2006-10-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2010-05-10 15:56:45 IP:211.75.xxx.xxx 訂閱
您是說新增了一個自訂的紙張格式,在2000系統上印表機抓的到,在xp會抓不到嗎?
兩台電腦都用相同的印表機嗎?因為雷射跟噴墨有些並不支援自訂。

如果印表機是用分享,有時印表機那端,和要印的那端好像都要新增相同的紙張格式,有時好像會抓印表機那端的樣子。

那如果用手動新增,不要用addfrom 會正常嗎?~~~~~
RootKit
資深會員


發表:16
回覆:357
積分:419
註冊:2008-01-02

發送簡訊給我
#3 引用回覆 回覆 發表時間:2010-05-10 20:57:45 IP:122.126.xxx.xxx 訂閱
在 XP 抓不到。我試了三款印表機都不行。有噴墨、雷射 ... 共用或本地都一樣。

AddForm ....正確。 在伺服器內容都看的到該格式。
唯有 XP 看得到卻無法使用。.... 不清楚原因 紙張大小下拉列表也不會多一列。
測試在 Win2000/Win 7 都會新增一行在紙張大小列。既使我用手Key進去也一樣。

另一種方法:
我使用「自訂大小」dmPaperSize = DMPAPER_USER Devicemode 方式
在 Win2000 / XP/ Win 7 都可以。

重點!我查網路都說這種方法僅適用在 Win9x/ME 真是不瞭...



===================引 用 chris681016 文 章===================
您是說新增了一個自訂的紙張格式,在2000系統上印表機抓的到,在xp會抓不到嗎?
兩台電腦都用相同的印表機嗎?因為雷射跟噴墨有些並不支援自訂。

如果印表機是用分享,有時印表機那端,和要印的那端好像都要新增相同的紙張格式,有時好像會抓印表機那端的樣子。

那如果用手動新增,不要用addfrom 會正常嗎?~~~~~

編輯記錄
RootKit 重新編輯於 2010-05-10 20:59:34, 註解 無‧
chris681016
中階會員


發表:64
回覆:117
積分:96
註冊:2006-10-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2010-05-12 09:33:26 IP:211.75.xxx.xxx 訂閱
一般如果RUN程式抓不到我會到,「印表機和傳真」選則要列印的印表機,進去看「內容」,到「裝置管理員」裡的紙匣設定,
看是否本身印表驅動程式就可以抓的到,如果這樣看都抓不到我想因該不支援吧,我是這樣。
我設定紙張是這樣寫
paper_num:=Get_Default_PSize('8.27x11'); //會傳回設定紙張的代號一個函數,例如A4一定是9,LETTER一定是1
Printer.PrinterIndex := -1;
Printer.GetPrinter(Device, Driver, Port, hDev);
pDev := GlobalLock(hDev);
try
if (pDev.dmFields and DM_PAPERSIZE) <> 0 then
begin
pDev.dmPaperSize :=StrToInt(paper_num);
pDev.dmFields := pdev.dmFields and not (DM_PAPERWIDTH or DM_PAPERLENGTH);
end;
Win32Check(OpenPrinter(Device, hPrn, Nil));
try
// 將印表機設定與預設值合併
Win32Check(DocumentProperties(0, hPrn, Device, pDev^, pDev^,
DM_COPY or DM_MODIFY) >= 0);
finally
ClosePrinter(hPrn);
end;
finally
GlobalUnlock(hDev);
end;
Printer.SetPrinter(Device, Driver, Port, hDev);
一般我遇到的都是印表機本身沒有支援,XP,或2000千都可以。
系統時間:2017-10-18 6:29:15
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!