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

程式設定紙張大小後, 如何設定紙張上下左右之列印邊界

尚未結案
Morselin
一般會員


發表:3
回覆:3
積分:1
註冊:2004-10-16

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-11-02 17:01:10 IP:220.135.xxx.xxx 未訂閱
請教各位先進, 經查詢 k.top 的文章後, 現可指定印表機及控制紙張的尺寸, 但現列印 8cm x 4cm , 間距 2.4mm 左右的標籤紙時, 卻只能列印其中的 18mm 高度範圍.... 其餘部份似成了高度的邊界....4-1.8 = 22mm ?? 不知該如何下指令來設定其邊界?? 謝謝....    程式如下:    
procedure TForm1.Button1Click(Sender: TObject);
var
Device : array[0..255] of char;
Driver : array[0..255] of char;
Port   : array[0..255] of char;
hDMode : THandle;
PDMode : PDEVMODE;
sl     : TStringList;
i,j,y,idx: integer;
begin
  sl := TStringList.Create;
  sl.Assign(Printer.printers);
  idx:= sl.indexof('LQ1170C');
  sl.Free;
  if idx=-1 then raise exception.Create('找不到印表機或印表機未連線');
  Printer.PrinterIndex := idx;
  Printer.GetPrinter(Device, Driver, Port, hDMode);
  if hDMode <> 0 then begin
    pDMode := GlobalLock(hDMode);
    if pDMode <> nil then begin
     {Set to legal}
      pDMode^.dmFields := pDMode^.dmFields or dm_PaperSize;
      pDMode^.dmPaperSize := DMPAPER_LEGAL;
     {Set to custom size}
      pDMode^.dmFields := pDMode^.dmFields or
                          DM_PAPERSIZE or
                          DM_PAPERWIDTH or
                          DM_PAPERLENGTH;
      pDMode^.dmPaperSize := DMPAPER_USER;
      pDMode^.dmPaperWidth :=  800 {紙張寬度, 以 0.1mm為一單位};
      pDMode^.dmPaperLength :=  425 {紙張長度, 以 0.1mm為一單位};
     {Set the bin to use}
      pDMode^.dmFields := pDMode^.dmFields or DMBIN_MANUAL;
      pDMode^.dmDefaultSource := DMBIN_MANUAL;
      GlobalUnlock(hDMode);
    end;
  end;
  Printer.PrinterIndex := Printer.PrinterIndex;
  for i:=1 to 2 do
    begin
      Printer.BeginDoc;
          Printer.Canvas.TextOut( 00, 0, '1234567890123456789012345678901234567890  1');
          Printer.Canvas.TextOut( 00, 20, '1234567890123456789012345678901234567890  2');
          Printer.Canvas.TextOut( 00,40, '1234567890123456789012345678901234567890  3');
          Printer.Canvas.TextOut( 00, 60, '1234567890123456789012345678901234567890  4');
          Printer.Canvas.TextOut( 00, 80, '1234567890123456789012345678901234567890  5');
          Printer.Canvas.TextOut( 00, 100, '1234567890123456789012345678901234567890  6');
          Printer.Canvas.TextOut( 00, 120, '1234567890123456789012345678901234567890  7');
      Printer.EndDoc;
    end;
end;
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-11-04 17:51:10 IP:202.39.xxx.xxx 未訂閱
這有一篇可以參考看看: http://www.swissdelphicenter.ch/torry/showcode.php?id=1039
Morselin
一般會員


發表:3
回覆:3
積分:1
註冊:2004-10-16

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-11-05 13:14:31 IP:220.135.xxx.xxx 未訂閱
感謝, 不過參考之後印出來還是一樣的狀況.... 參照國外 delphi 的文章抓 margin出來看是有改變.... 但印出來還是一樣....    
unit setptr_size001;    interface    uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;    type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    Label10: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;    var
  Form1: TForm1;    implementation
uses Printers;
type
  TMargins = record
    Left,
    Top,
    Right,
    Bottom: Double
end;
{$R *.dfm}    procedure TForm1.Button1Click(Sender: TObject);
var
  PixelsPerInch : TPoint;
  PhysPageSize  : TPoint;
  OffsetStart   : TPoint;
  PageRes       : TPoint;
  Margins       : TMargins;      Device        : array[0..255] of char;
  Driver        : array[0..255] of char;
  Port          : array[0..255] of char;
  hDMode        : THandle;
  PDMode        : PDEVMODE;      sl            : TStringList;
  i,j,y,idx     : integer;
begin
  sl := TStringList.Create;
  sl.Assign(Printer.printers);
  idx:= sl.indexof('LQ1170C');
  sl.Free;
  if idx=-1 then raise exception.Create('找不到印表機或印表機未連線');
  Printer.PrinterIndex := idx;      // 此段設定列印紙張大小 =============================================
  Printer.GetPrinter(Device, Driver, Port, hDMode);
  if hDMode <> 0 then begin
    pDMode := GlobalLock(hDMode);
    if pDMode <> nil then begin
     {Set to legal}
      pDMode^.dmFields := pDMode^.dmFields or dm_PaperSize;
      pDMode^.dmPaperSize := DMPAPER_LEGAL;
     {Set to custom size}
      pDMode^.dmFields := pDMode^.dmFields or
                          DM_PAPERSIZE or
                          DM_PAPERWIDTH or
                          DM_PAPERLENGTH;
      pDMode^.dmPaperSize   := DMPAPER_USER;
      pDMode^.dmPaperWidth  := 800 ; //紙張寬度, 以 0.1mm為一單位
      pDMode^.dmPaperLength := 425 ; //紙張長度, 以 0.1mm為一單位
      pDMode^.dmPanningWidth:= 780 ;
      pDMode^.dmPanningHeight:=405 ;
     {Set the bin to use}
      pDMode^.dmFields := pDMode^.dmFields or DMBIN_MANUAL;
      pDMode^.dmDefaultSource := DMBIN_MANUAL;
      GlobalUnlock(hDMode);
    end;
  end;      // 此段設定列印紙張邊界 =============================================
  PixelsPerInch.y := GetDeviceCaps(Printer.Handle, LOGPIXELSY); // Get the Verticle resolution of printer
  PixelsPerInch.x := GetDeviceCaps(Printer.Handle, LOGPIXELSX); // Get the Horizon resolution of printer
  Escape(Printer.Handle, GETPHYSPAGESIZE, 0, nil, @PhysPageSize);
  Escape(Printer.Handle, GETPRINTINGOFFSET, 0, nil, @OffsetStart);
  PageRes.y := GetDeviceCaps(Printer.Handle, VERTRES);
  PageRes.x := GetDeviceCaps(Printer.Handle, HORZRES);
  label1.caption:=floattostr(Margins.top);
  label2.caption:=floattostr(Margins.bottom);
  label3.caption:=floattostr(Margins.left);
  label4.caption:=floattostr(Margins.right);
  // Top Margin
  Margins.Top := OffsetStart.y / PixelsPerInch.y;
  // Left Margin
  Margins.Left := OffsetStart.x / PixelsPerInch.x;
  // Bottom Margin
  Margins.Bottom := ((PhysPageSize.y - PageRes.y) / PixelsPerInch.y) -
    (OffsetStart.y / PixelsPerInch.y);
  // Right Margin
  Margins.Right := ((PhysPageSize.x - PageRes.x) / PixelsPerInch.x) -
    (OffsetStart.x / PixelsPerInch.x);
  label5.caption:=floattostr(Margins.top);
  label6.caption:=floattostr(Margins.bottom);
  label7.caption:=floattostr(Margins.left);
  label8.caption:=floattostr(Margins.right);          for i:=1 to 2 do
    begin
      Printer.BeginDoc;
        Printer.Canvas.TextOut( 00,   0, '1234567890123456789012345678901234567890  1');
        Printer.Canvas.TextOut( 00,  20, '1234567890123456789012345678901234567890  2');
        Printer.Canvas.TextOut( 00,  40, '1234567890123456789012345678901234567890  3');
        Printer.Canvas.TextOut( 00,  60, '1234567890123456789012345678901234567890  4');
        Printer.Canvas.TextOut( 00,  80, '1234567890123456789012345678901234567890  5');
        Printer.Canvas.TextOut( 00, 100, '1234567890123456789012345678901234567890  6');
        Printer.Canvas.TextOut( 00, 120, '1234567890123456789012345678901234567890  7');
      Printer.EndDoc;
    end;
end;    end.
系統時間:2024-05-19 2:18:37
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!