Delphi Programming / Object Pascal
サイトのトップページへ リンクのページへ ロゴマーク
[掲載 2002年01月01日] [更新 2016年04月29日] タックシール印刷コンポーネント
タックシール印刷コンポーネント
テストプログラム Envelope
動作確認等 Windows 7 U64(SP1) + Delphi XE(UP1) Pro







封筒の宛名印刷


単票帳票作成の参考としての,封筒への宛名書きの例です.
Delphi に付属の DBDEMOS を使用しています.「用紙のタイプ」は stNoCut にして,単票形式となっています.基本的にははがきの場合と変わりませんが,ここでは「長形3号(120×235mm)」という封筒を使用しています.この用紙サイズがリストにないプリンタドライバがあります.そこで,起動時にユーザ定義用紙を作成してからプレビューするようにしています.


リスト1 
Query1 の SQL プロパティ
select CustNo,Company,Zip,Addr1,Phone from customer


[備考]
封筒への印刷の際,封筒のフラップ側 (文書の挿入側 - プレビューの図では右側) がプリンタへの挿入方向である場合,挿入が困難なことがあります.その場合,180 度回転して印刷する,逆方向からの印刷にして,フラップとは反対側から挿入すると,挿入しやすいことがあります.


図1
設計画面
図2
印刷項目
  • コードで書くので項目エディタの設定なし
図3
実行画面

リスト2
テストプログラムのコード
unit EnvelopeUnit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, plPrev, plTackPrev, DB, DBTables, StdCtrls, Spin, ExtCtrls, Buttons;

type
  TForm1 = class(TForm)
    BitBtn1: TBitBtn;
    Query1: TQuery;
    Panel1: TPanel;
    BitBtn2: TBitBtn;
    Query1CustNo: TFloatField;
    Query1Company: TStringField;
    Query1Zip: TStringField;
    Query1Addr1: TStringField;
    Query1Phone: TStringField;
    Panel5: TPanel;
    Panel6: TPanel;
    Panel7: TPanel;
    SpinEdit1: TSpinEdit;
    SpinEdit2: TSpinEdit;
    CheckBox1: TCheckBox;
    CheckBox2: TCheckBox;
    plTackPrev1: TplTackPrev;
    procedure BitBtn1Click(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);
    procedure plTackPrev1FormShow(Sender: TObject);
    procedure plTackPrev1BeforePageDraw(Sneder: TObject; DataNo,
      Page: Integer);
  private
    { Private 宣言 }
    FPaperWidth  : Integer;
    FPaperHeight : Integer;
    LPaperName   : string;
    FLeftOffset  : Integer;
    FTopOffset   : Integer;
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

uses
  Printers;

{$R *.DFM}

//=============================================================================
//  プレビュー開始
//  クエリーの結果のデータを封筒に印刷
//  長形4号封筒の横方向の印刷
//
//  使用するプリンタドライバで,プリントサーバに登録されている全ての用紙が
//  使用可能とは限らないこと注意
//  ここではユーザ定義用紙を作成して対処する
//
//  Query1のSQL文は以下の通り
//  select CustNo,Company,Zip,Addr1,Phone from customer
//=============================================================================
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  //封筒のサイズ(長形3型)の用紙作成.印刷の方向は横
  FPaperWidth  := 1200;
  FPaperHeight := 2350;
  LPaperName   := '長形3型 ';

  plTackPrev1.plSetPrinter.SetUserPaper(LPaperName, FPaperWidth, FPaperHeight);
  plTackPrev1.plSetPrinter.Orientation := poLandscape;

  plTackPrev1.Title := '封筒印刷のテスト';
  //単票形式での印刷とする
  plTackPrev1.SealType := stNoCut;
  plTackPrev1.Preview;
end;

//=============================================================================
//  ユーザ定義用紙を削除してプログラム終了
//  プリントサーバに登録しても,削除はしないプリンタドライバもある
//=============================================================================
procedure TForm1.BitBtn2Click(Sender: TObject);
begin
  plTackPrev1.plSetPrinter.DeleteUserPaper(LPaperName);
  Close;
end;

//=============================================================================
//  TplTackPrevのOnFormShowイベント
//  プレビュー開始したら説明文字列をステータスバーに表示
//=============================================================================
procedure TForm1.plTackPrev1FormShow(Sender: TObject);
begin
  plTackPrev1.StatusBarText := '  封筒 長形3型 (120×235mm) ';

  //郵便番号と枠の印刷位置微調整値
  FLeftOffset := SpinEdit1.Value;
  FTopOffset  := SpinEdit2.Value;

  //逆方向からの印刷フラグの設定
  //封筒のフラップ側(プレビューでは右)がプリンタへの挿入側の場合,挿入が困難な
  //ことがある,逆方向からの印刷にすると挿入しやすい
  plTackPrev1.InversePrint := CheckBox2.Checked;
end;

//=============================================================================
//  TplTackPrevのOnBeforePageDrawイベント
//  印刷コードは全てここで処理(項目エディタでは設定していない)
//
//  Query1のSQL文は以下の通り
//  select  CustNo,Company,Zip,Addr1,Phone from customer
//=============================================================================
procedure TForm1.plTackPrev1BeforePageDraw(Sneder: TObject; DataNo,
  Page: Integer);
var
  LText    : string;
  LZipText : string;
begin
  //住所の印刷
  LText := plTackPrev1.DataSet.FieldByName('Addr1').AsString;
  plTackPrev1.FontSize (18);
  plTackPrev1.TextOutLT(500, 230, LText);

  //宛先施設の印刷
  LText := plTackPrev1.DataSet.FieldByName('Company').AsString;
  plTackPrev1.FontSize(20);
  plTackPrev1.TextOutLT(500, 550, LText);

  //郵便番号と郵便番号枠の印刷
  LZipText := plTackPrev1.DataSet.FieldByName('Zip').AsString;
  plTackPrev1.FontSize(25);
  plTackPrev1.ZipOut(LZipText, FLeftOffset, FTopOffset, CheckBox1.Checked, 0);
end;

end.




ハガキや封筒等の用紙設定


DEVMODE 構造体の dmPaperSize メンバに以下の用紙サイズ番号の値があります.
これらはプリントサーバに登録されていますが,プリントサーバに登録されている用紙が全てのプリンタドライバで利用できるわけではありません.
プリントサーバに同じサイズの用紙が登録されていても,プリンタドライバによっては,独自の用紙サイズ番号と用紙名で登録しているものがあります.

以下の用紙サイズ等が使用できない場合は,該当するプリンタドライバで使用可能な用紙のリストから選択することになります.あるいは実行時にユーザ定義用紙として登録すれば使用できますが,プリンタドライバによっては,プリントサーバの用紙の削除ができない場合があります.



  //日本のハガキサイズの用紙番号
  DMPAPER_JAPANESE_POSTCARD
  DMPAPER_JENV_CHOU4_ROTATED

  //日本の長形4号封筒サイズの用紙番号
  DMPAPER_JENV_CHOU4
  DMPAPER_JENV_CHOU4_ROTATED