Printer.Index 指定後Printer參數帶不進來? |
缺席
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
請問各位, 我利用以下的程式在印表機, 讓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 發送簡訊給我 |
|
RootKit
資深會員 發表:16 回覆:358 積分:419 註冊:2008-01-02 發送簡訊給我 |
我記得以前遇到過。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 Printer.PrinterIndex := PrinterIndex; Printer.PrinterIndex := Printer.PrinterIndex; PrinterCanvasUpdateFont; end; end; [/code] 上面是當年的註記,不過已忘記為什麼。提供參考一下。 另外我查了一下 experts-exchange.com 認為使用 Printer.SetPrinter 是較為恰當的作法。 沒時間,就不幫你做確認了。 |
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
感謝回應, 不過要是採用這樣的方式, 不被客戶打死才怪! 而且該客戶列印的種類十分多, 有要輸出條碼, 有要印出卡片, 還有要印報表, 出貨單與特殊袋子, 唯獨是這台印表機的參數帶不進來, 其他都可以,
現在的狀況是原廠說是我們程式的問題, 他們無法解決(因為在word, notepad等軟體的dialog都會帶參數, 就是Delphi中的無法運作) 所以現在我也不知道要怎麼辦? ===================引 用 careychen 文 章=================== PD 版主,小弟找了一下相關資料,也沒找著什麼,而且那時候出現的 Dialog 也是 Windows 本身的, 不是 Delphi 的,所以要嘛,自己做一個,或是換個方向想,要列印前先把 User 選的印表機設成預設的 當列印完後,再設回原本的,這樣會不會快點解決您的問題? |
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
謝謝回覆, 不過測過並沒有改善, 而且似乎與 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 發送簡訊給我 |
我用下列方式變更紙張,不知道對你有沒有用
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 發送簡訊給我 |
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |