お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル

"指定用紙への印字ルーチン作成(私風、、)"




指定用紙への印刷(私の場合は、、)
  
  お役所の書類や得意先指定の請求書等など、「この囲いの中にこれだけの文字
  を入れなければならない」という指定用紙への印字はDOSの頃から苦労の多
  い作業でした。が、窓時代になりフォントの書体はともかく(明朝かゴシック
  が中心)サイズが自由になったのは大いに喜ぶべきで、ことにプリンターごと
  のエスケープシーケンスなどという問題を考えなくても印字できるようになっ
  たのは大幅な重労働の軽減につながりました。
  
テスト(例示):
  印字したいもの                      カセットテープの表紙
  印刷を予定しているプリンタの解像度  300bps
  作業を行う時のディスプレイの解像度  1024×768ピクセル
  使用 Delphi   Delphi2 Dev

・指定用紙をスキャナでとる。

  まず印刷を予定しているプリンタの解像度と同じ解像度でスキャンする。この
  場合、グレイ(256階調)ぐらいで行った方がモノクロよりも分かり易い画
  像になる。スキャン範囲は用紙サイズで行うのだが、その時に表示単位をピク
  セルにして取り込み画像のサイズを記録しておく。また、拡大縮小率は100%
  (等大)で行う方が後にリサイズしても奇麗な画像を得れる。
  
  テスト:8bitグレイ(256階調)
          解像度 300dpi
          幅 1200 × 高 1080 ピクセル 拡大縮小率 100%

・作業できるようにスキャン画像をリサイズする。

  Delphi で作業するために画像ファイルをリサイズする。そのサイズは、作業を
  行うと時のディスプレイの解像度にちゃんと入る大きさにする。また出来れば
  2分の1とか3分の1とか整数分母で考えたリサイズを行う方が良い。けして
  Delphi上のリサイズである AutoSize でいいとか考えないこと。
  
  テスト:作業時ディスプレ解像度  1024 * 768 ピクセル
          2分の1でちょうど作業しやすいおおきさになる。
          リサイズ後の画像は 幅 600 × 高 540 ピクセル

・リサイズ後の画像を Delphi で扱える画像フォーマットで保存する。

  非力マシン(私の場合なのだが、、泣)の場合、スキャナや画像を扱った後に
  リソースが減り、Delphi 起動後に固まることがある。そういうトラブルからの
  回避には再起動しかない?
  テスト:Delphi2 では [*.JPG]などは扱えないので[*.BMP]で保存。

・Delphi を起動して準備にかかる

  Delphi を起動して Form を用意する(起動時にさらの Form1 が出るのでそれ
  で良い)そこに Image を貼り、Picture プロパティ で画像を読み込む。Align 
  プロパティ を alClient にして、画像全部が出てくるように Form の大きさを
  調節する。この場合、Stretch や AutoSize は false のままにすること。
  ここで一旦ファイルを保存する。
  テスト: unit1 , project1

・画像上に印刷イメージを貼り付ける

  イメージ画像の上に Edit を貼ってゆく。その Edit の Text プロパティ に何の
  データかを入れてゆくと後々分かり易い。また、後のソースのことを考えて、
  貼り付けの順番は規則をもってする方が良い。
  テスト: Edit1  Text に 'タイトル'
           Edit2  Text に 'A曲1'

・まずは印字座標をみてみよう

  Form 上で右クリックするとスピード・メニューが現れる。「テキストとして
  表示」を選択する。永遠と画像ファイルの 16 進ダンプの後に貼り付けた
  Edit のフォーム上の座標が書かれている。(再度、フォームにかえるには
  やはり同じように右クリックでスピードメニューを出して、「フォームとして
  表示」を選択すればよい。)
  テスト:  object Edit1: TEdit
              Left = 104
              Top = 112
              Width = 417
              Height = 28
              TabOrder = 0
              Text = 'タイトル'
            end
   この場合、Left 104 , Top 112 になっている。画像ファイルを2分の1に
   したので、この値の2倍である Left 208 , Top 224 が印刷を予定している
   プリンタ上の(300bps)印字座標になる。印刷される項目が「タイトル」で
   あることも Text に入れたから分かる。
  
・このデータを参照しながら印刷ルーチンを作成
  
  *手作業の説明ですが、自動的におこなう[*.exe]の作成を検討中!
  
  必要なデータ部分をハイライトさせて「コピー」し、エディタ等で参照、また
  は印刷して参照しながらルーチンを作成する。
  
・$$$これからは、テスト内容でお話をすすめます。$$$
  
・Form の use に printer を追加し、例えば Button1 で印刷を開始するコー
  ドは以下のようになる。

  procedure TForm1.Button1Click(Sender:Object)
  var
    i1,i2:Integer;       //印刷ずれの調整のための変数宣言
    x:Integer;           //解像度変更対応のための変数宣言
  begin
    with Printer do begin
      i1 := 0;      // 横ずれの数値を設定
      i2 := 0;      // 縦ずれの数値を設定
      x  := 1;      // 基準解像度倍率を設定
      BeginDoc;     //印刷スープラへの出力開始
      Canvas.Font.Name:='MS 明朝';     //印字フォントの設定(フォント)
      Canvas.Font.Size:=10;              //同上              (サイズ)
      Canvas.TextOut(104*x+i1,112*x+i2,Edit1.Text);  //実際のデータ
      Canvas.Font.Name:='MS ゴシック'  //フォントの変更
      Canvas.Font.Size:=8;               //サイズの変更
      Canvas.TextOut(32*x+i1,432*x+i2,Edit2.Text);   //実際のデータ
      Canvas.TextOut(32*x+i1,462*x+i2,Edit3.Text);   //実際のデータ
      //...後は上記と同じように書いてゆく
      EndDoc;       //印刷スープラへの出力終了>印刷の開始
    end;
  end;

「横ずれと縦ずれの説明」
  スキャナの取り込み時、プリンタの設定等でおきる。テスト印字後に適当な
  数値を入れてずれを調整する。

「基準解像度倍率の説明」
  テスト時は印刷を予定しているプリンタが解像度300bpsであったが、同一プ
  リンタでも解像度を選べる場合が多い。もしそれが 600bps だった場合は、
  座標も 600 / 300 = 2 で、2倍で書かなければならない。別のプリンタを選
  んだ場合も多少違いはあるにせよ、同じ解像度なら同じ位置に印字してくれる。

後書き:
  DOSの頃は印字テストの繰り返しが非常に辛かった。が、これでテスト回数
  がぐっと減った。これはルーチン自動生成の[*.EXE]を作成したいところだが、
  超初心者のために何時になるか分からない。また、イメージ画面でフォントの
  種類やサイズを設定して、それも考慮に入れたプリンタ汎用ルーチンを作成す
  る方向では考えている。これも何時になるか分からないし、計算上に小数点が
  出た場合などの対処の仕方、罫線を入れたい場合の方法等、今から勉強しなけ
  ればならないが、なにせ私は7番会議室のお騒がせ者、データベース勉強中の
  身である。今のところ困っていないので、手作業でよしとしよう!

  どなたか自動生成の[*.EXE]を作成する気がないかなぁ、、、

  やっぱりこれでも力技している  高田  浩  でした。


Original document by 高田 浩    氏 ID:(KFE06073)


ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。

Copyright 1996-2002 Delphi Users' Forum