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

請問如何才能知道印表機是否有支援自訂紙張大小的格式呢?

尚未結案
SKYSTAR
中階會員


發表:76
回覆:198
積分:64
註冊:2002-06-10

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-02-21 14:36:52 IP:203.73.xxx.xxx 未訂閱
各位大大好: 可否請教一下, 在Delphi中如何寫程式來知道目前電腦中的某一台印表機是否 有支援自訂紙張大小格式? 我的意思是該如何知道某台印表機是否有支援自訂紙張的格式呢? (必須用程式來取得....而不是自己跑到控制台去查看,或是利用印表機對話盒 來查看) 先謝啦!!
qoo1234
版主


發表:256
回覆:1167
積分:659
註冊:2003-02-24

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-02-28 14:33:14 IP:218.163.xxx.xxx 未訂閱
//取得印表機的紙張格式列表
uses WinSpool,Printers;
....

procedure GetPaperFormats(ComboBoxTmp:TComboBox;PrinterName:String);
type
  TPaperName = array[0..63] of Char;
  TPaperNameArray = array[1..256] of TPaperName;
  FPapernameArray = ^TPaperNameArray;
var
  i, numPaperformats: Integer;
  pPaperFormats: FPapernameArray;
  PrinterHandle: THandle;
begin
  OpenPrinter(PChar(PrinterName), PrinterHandle, nil);
  numPaperformats :=WinSpool.DeviceCapabilities(PChar(PrinterName), 'LPT1', DC_PAPERNAMES, nil, nil);
  if numPaperformats > 0 then
  begin
    GetMem(pPaperformats,numPaperformats * Sizeof(TPapername));
    try
      WinSpool.DeviceCapabilities(PChar(PrinterName), 'LPT1', DC_PAPERNAMES,Pchar(pPaperFormats), nil);
      ComboBoxTmp.clear;
      for i := 1 to numPaperformats do
       ComboBoxTmp.Items.Add(pPaperformats^[i]);
    finally
      FreeMem(pPaperformats);
    end;
  end;
end;    //取得已安裝的印表機名稱列表
procedure TForm1.FormShow(Sender: TObject);
begin
 ComboBox1.items:= printer.printers;
end;    //取得印表機的紙張格式列表
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
 if ComboBox1.Text<>'' then
   GetPaperFormats(ComboBox2,ComboBox1.Text);
end;
 
網海無涯,學無止境!
qoo1234
版主


發表:256
回覆:1167
積分:659
註冊:2003-02-24

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-03-01 01:08:01 IP:218.163.xxx.xxx 未訂閱
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=237    網海無涯,學無止境!
SKYSTAR
中階會員


發表:76
回覆:198
積分:64
註冊:2002-06-10

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-03-01 15:02:23 IP:203.73.xxx.xxx 未訂閱
您好:    謝謝您的回答!!    先補充一下,您所提供的程式,有三個相同的地方,可能要稍稍修改一下,否則好 像會抓不到紙張的大小清單! 原因好像是印表機的全名,因為會加上 On LPT1: ,共九個字元,所以我就改成了以下紅色的部份,就沒有問題了!!    
引言: //取得印表機的紙張格式列表
uses WinSpool,Printers;
....

procedure GetPaperFormats(ComboBoxTmp:TComboBox;PrinterName:String);
type
  TPaperName = array[0..63] of Char;
  TPaperNameArray = array[1..256] of TPaperName;
  FPapernameArray = ^TPaperNameArray;
var
  i, numPaperformats: Integer;
  pPaperFormats: FPapernameArray;
  PrinterHandle: THandle;
begin
  OpenPrinter(PChar(Copy(PrinterName,1,Length(PrinterName)-9)), PrinterHandle, nil);
  numPaperformats :=WinSpool.DeviceCapabilities(PChar(Copy(PrinterName,1,Length(PrinterName)-9)), 'LPT1', DC_PAPERNAMES, nil, nil);
  if numPaperformats > 0 then
  begin
    GetMem(pPaperformats,numPaperformats * Sizeof(TPapername));
    try
      WinSpool.DeviceCapabilities(PChar(Copy(PrinterName,1,Length(PrinterName)-9)), 'LPT1', DC_PAPERNAMES,Pchar(pPaperFormats), nil);
      ComboBoxTmp.clear;
      for i := 1 to numPaperformats do
       ComboBoxTmp.Items.Add(pPaperformats^[i]);
    finally
      FreeMem(pPaperformats);
    end;
  end;
end;    //取得已安裝的印表機名稱列表
procedure TForm1.FormShow(Sender: TObject);
begin
 ComboBox1.items:= printer.printers;
end;    //取得印表機的紙張格式列表
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
 if ComboBox1.Text<>'' then
   GetPaperFormats(ComboBox2,ComboBox1.Text);
end;
 
網海無涯,學無止境!
另外可否再次請教: 因為每一台印表機的自訂紙張格式所傳回的文字: 有的是 : 使用者自訂大小 有的是 : 使用者定義大小 等等...都不太相同.... 因為曾在WINAPI看過,好像可以傳回相對的數值... 如: A4 ---> 傳回 9 如: 自訂紙張 ---> 傳回 256 所以想請教一下....在Delphi中要如何傳回這些紙張的相對應之數值呢? Thanks!!
qoo1234
版主


發表:256
回覆:1167
積分:659
註冊:2003-02-24

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-03-01 18:30:18 IP:218.163.xxx.xxx 未訂閱
請參考 DEVMODE API部分有詳細資料與Windows.pas單元 http://www.scalabium.com/faq/dct0019.htm http://www.scalabium.com/faq/dct0020.htm example:
procedure SetPrinterSettings(FPrinter: TPrinter);
var
  FDevice: PChar;
  FDriver: PChar;
  FPort: PChar;
  DeviceMode: THandle;
  DevMode: PDeviceMode;
begin
  {to get a current printer settings}
  FPrinter.GetPrinter(FDevice, FDriver, FPort, DeviceMode);
  {lock a printer device}
  DevMode := GlobalLock(DeviceMode);      {set a paper size as A4-Transverse}
  if ((DevMode^.dmFields and DM_PAPERSIZE) = DM_PAPERSIZE) then
  begin
    DevMode^.dmFields := DevMode^.dmFields or DM_PAPERSIZE;
    DevMode^.dmPaperSize := DMPAPER_A4_TRANSVERSE;
  end;      {set a paper source as Tractor bin}
  if  ((DevMode^.dmFields and DM_DEFAULTSOURCE) = DM_DEFAULTSOURCE) then
  begin
    DevMode^.dmFields := DevMode^.dmFields or DM_DEFAULTSOURCE;
    DevMode^.dmDefaultSource := DMBIN_TRACTOR;
  end;      {set a Landscape orientation}
  if  ((DevMode^.dmFields and DM_ORIENTATION) = DM_ORIENTATION) then
  begin
    DevMode^.dmFields := DevMode^.dmFields or DM_ORIENTATION;
    DevMode^.dmOrientation := DMORIENT_LANDSCAPE;
  end;      {set a printer settings}
  FPrinter.SetPrinter(FDevice, FDriver, FPort, DeviceMode);      {unlock a device}
  GlobalUnlock(DeviceMode);
end;
網海無涯,學無止境! 發表人 - qoo1234 於 2004/03/01 18:41:58 發表人 - qoo1234 於 2004/03/01 18:53:58
系統時間:2024-05-18 14:17:37
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!