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

Printer.Index 指定後Printer參數帶不進來?

缺席
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-10-06 19:38:05 IP:61.67.xxx.xxx 未訂閱
請問各位, 我利用以下的程式在印表機, 讓user選擇所要的印表機然後再透過PrinterDialog提供給使用者列印所要的資料(這台印表機是印製塑膠卡的印卡機, 如第二張圖) 但我發現, 可能用戶有4-5種印表機, 當用戶指定這台印表機, 再透過FR系統送出時, 在控制台中印表機設定內->進階->列印預設值, 已經有針對該印表機做了一些標準初值設定的選項(如第1張圖), 這些設定竟然都沒有被帶進來(如圖三) 請問該如何處理, 才有辦法令參數可以同時帶入 PS:如果我把這台印表機設定為"預設印表機"就沒有這個問題, 但如果我指定EPSON LQ-300為預設印表機, 再透過這樣的功能選擇此台印表機來輸出, 圖一的參數在圖三上就沒有辦法帶入了 

程式碼

[code delphi]
function TForm_BarCode.setPrinter(printername: string): boolean;
var idx: integer;
begin
idx:= Printer.Printers.IndexOf(printername);
if idx=-1 then begin
Application.MessageBox('找不到指定的印表機存在','錯誤',MB_OK);
result:= False;
end
else begin
Printer.PrinterIndex:= idx;
result:= True;
end;
end;
[/code]


careychen
尊榮會員


發表:41
回覆:580
積分:959
註冊:2004-03-03

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-10-06 21:40:34 IP:59.126.xxx.xxx 訂閱
PD 版主,小弟找了一下相關資料,也沒找著什麼,而且那時候出現的 Dialog 也是 Windows 本身的,
不是 Delphi 的,所以要嘛,自己做一個,或是換個方向想,要列印前先把 User 選的印表機設成預設的
當列印完後,再設回原本的,這樣會不會快點解決您的問題?
------
價值的展現,來自於你用哪一個角度來看待它!!
編輯記錄
careychen 重新編輯於 2008-10-06 21:42:31, 註解 無‧
RootKit
資深會員


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-10-06 22:16:49 IP:122.126.xxx.xxx 訂閱
我記得以前遇到過。N久年,功力還很嫩的時候。找了一下程式碼:

[code delphi]
{ 不同上設定,針對切換印表機所造成 Canvas 不正確。使用TPinter 切記! }
{ 當更換印表機包含PrinterDlg仍有 Bugs 需重新在 UpdateFont }
Procedure Change_Printer(PrinterIndex:Integer);
procedure PrinterCanvasUpdateFont;
var
FontSize: Integer;
begin
if GetDeviceCaps(Printer.Handle, LOGPIXELSY) <> Printer.Canvas.Font.PixelsPerInch then
begin
FontSize := Printer.Canvas.Font.Size;
Printer.Canvas.Font.PixelsPerInch := GetDeviceCaps(Printer.Handle, LOGPIXELSY);
Printer.Canvas.Font.Size := FontSize;
end;
end;
begin
if PrinterIndex begin
Printer.PrinterIndex := PrinterIndex;
Printer.PrinterIndex := Printer.PrinterIndex;
PrinterCanvasUpdateFont;
end;
end;

[/code]
上面是當年的註記,不過已忘記為什麼。提供參考一下。

另外我查了一下 experts-exchange.com 認為使用 Printer.SetPrinter 是較為恰當的作法。
沒時間,就不幫你做確認了。
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-10-07 00:01:42 IP:61.67.xxx.xxx 未訂閱
感謝回應, 不過要是採用這樣的方式, 不被客戶打死才怪! 而且該客戶列印的種類十分多, 有要輸出條碼, 有要印出卡片, 還有要印報表, 出貨單與特殊袋子, 唯獨是這台印表機的參數帶不進來, 其他都可以, 
現在的狀況是原廠說是我們程式的問題, 他們無法解決(因為在word, notepad等軟體的dialog都會帶參數, 就是Delphi中的無法運作)
所以現在我也不知道要怎麼辦?
===================引 用 careychen 文 章===================
PD 版主,小弟找了一下相關資料,也沒找著什麼,而且那時候出現的 Dialog 也是 Windows 本身的,
不是 Delphi 的,所以要嘛,自己做一個,或是換個方向想,要列印前先把 User 選的印表機設成預設的
當列印完後,再設回原本的,這樣會不會快點解決您的問題?
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-10-07 00:14:56 IP:61.67.xxx.xxx 未訂閱
謝謝回覆, 不過測過並沒有改善, 而且似乎與 updateforn沒有關聯, 我再找找看 setprinter 的用法, 其中的參數如何帶還有問題

ps:底下紅色的部份看起來怪怪的, 不知有何作用哦!
===================引 用 RootKit 文 章===================
我記得以前遇到過。N久年,功力還很嫩的時候。找了一下程式碼:

不同上設定,針對切換印表機所造成 Canvas 不正確。使用TPinter 切記!
Printer.PrinterIndex := PrinterIndex;
Printer.PrinterIndex := Printer.PrinterIndex;
PrinterCanvasUpdateFont;
end;
end;


上面是當年的註記,不過已忘記為什麼。提供參考一下。

另外我查了一下 experts-exchange.com 認為使用 Printer.SetPrinter 是較為恰當的作法。
沒時間,就不幫你做確認了。
chris681016
中階會員


發表:69
回覆:122
積分:98
註冊:2006-10-12

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-10-07 10:06:52 IP:211.75.xxx.xxx 訂閱
我用下列方式變更紙張,不知道對你有沒有用

function VrSet(VR_Size,is_os:string; Print1: TPrinter):string;
var Driver,Device,Port: array[0..512] of Char;
hDev: THandle; // DeviceMode結構體的記憶體Handle
pDev: PDEVICEMODE; // 對DeviceMode結構體的Pointer
hPrn: THandle; // 印表機的Handle
paper_num,Driver_name:string;
hPrinter : THandle;
begin
Print1.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;
Print1.SetPrinter(Device, Driver, Port, hDev);
end;
編輯記錄
chris681016 重新編輯於 2008-10-07 10:08:33, 註解 無‧
chih_kuan
中階會員


發表:38
回覆:82
積分:54
註冊:2003-02-20

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-10-07 14:07:30 IP:211.23.xxx.xxx 未訂閱
能否使用者.選定印表機..
SendMessage...
讓系統知道..
硬體設備有所變更..
迫使系統從底層、硬體上就一完整的重置..
這樣..是否能解決您的問題..
我之前的做法是這樣做的..
謹供參考~
------
叔叔有練過,初學者不要學。
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-10-07 21:19:35 IP:61.67.xxx.xxx 未訂閱
因為這個案例並不是紙張選擇, 事實上我根本不知道要取出那些參數及改變設定那些參數, 所以程式在ktop上我有搜尋過也看過, 但並沒有確實的幫助
目前我是幫客戶把這台印表機改為"預設", 就沒有問題了, 至於其他要用到的印表機因為透過dialog選擇並沒有這樣的問題, 客戶還能接受啦, 但還是想看看有沒有方法可以給它解決的啦!
編輯記錄
P.D. 重新編輯於 2008-10-07 21:27:42, 註解 無‧
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#9 引用回覆 回覆 發表時間:2008-10-22 12:28:47 IP:61.67.xxx.xxx 未訂閱
看來暫時還沒有辦法解決, 我先幫客戶改為預設來處理, 目前還沒有發生上面帶不進來的問題, 雖然沒有解決到問題, 但仍十份感謝各位的協助, 謝謝!
系統時間:2024-04-24 18:24:29
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!