Delphi Programming / Object Pascal
サイトのトップページへ リンクのページへ ロゴマーク
[掲載 2000年12月12日] [更新 2016年04月19日] 印刷プレビュー制御コンポーネント
   
印刷プレビュー制御コンポーネント
テキスト文書の描画
動作確認等 図は Windows 7 U64(SP1) + Delphi XE(UP1) Pro で作成







テキスト文書の描画


テキスト,あるいはテキスト文書の描画については,サンプルプログラム集の以下の記事も参考にしてください.
これらのサンプルでは,通常のテキストファイルも扱えます.TRichEdit は,ある程度の禁則処理も行ってくれるようです.テキストの属性等も設定ができ,本コンポーネントのテキスト描画用のメソッドよりも処理が高速です.





テキストファイルの読込み表示


TextOutFile(Yt, Xl, Xr, RowH, FileName): Integer

関数です.ディスク内にあるテキストファイルを読込んで,引数で指定する X 座標の範囲に両端揃えで描画します.描画の下端位置は BottomMargin プロパティで設定した値です.頁を越えての描画はしません (Ver 3.2 で 2 文字固定の禁則処理を実装しました).
終了すると,次の印刷開始 Y 座標値を返します.テキストファイルの内容が空の場合は描画開始位置の Yt の値を返します.

引数 説明
Yt Integer 描画開始 Y 座標値
Xl Integer 描画範囲の左端 X 座標値
Xr Integer 描画範囲の左端 X 座標値
RowH Integer 行間隔で 0.1 mm 単位の値
行間隔は文字の高さと行間のスペースの合計値
FileName String フルパスのテキストファイル名を指定




TStringList のテキスト描画


StringListOut(SL, 
              Options,
              Xl,
              Xr,
              Yt,
              Yb,
              RowH,
              KinsokuCnt): Integer

関数です.TStringList 内のテキストファイルを引数で指定する領域内に描画します.頁を越えての描画はしません.必要であれば,改頁処理を行い,戻値の TStringList を次頁以降に描画する処理をして下さい.
終了すると,次の印刷開始Y座標値を返します.元の TStringList が空の場合は描画開始位置の Yt の値を返します.

引数 説明
var SL TStringList 描画するテキストを収めた TStringList
終了すると,指定領域内に描画出来なかった残りのテキストが入っている
また,1 行 (改行まで) の残りの文字列がインデック [0] に入っている
Options TFormatOptions DHGL の GetTextPositionのOptions の値で,以下の値
何も指定しない時は左端揃え

foJustify 両端揃え
foEven   均等割付
foRight  右端揃え
foCenter  中央揃え
foKerning カーニングを行う
Xl Integer 描画領域の左端 X 座標値
Xr Integer 描画領域の右端 X 座標値
Yt Integer 描画領域の上端 Y 座標値
Yb Integer 描画領域の下端 Y 座標値
RowH Integer 行間隔で 0.1 mm 単位の値
行間隔は文字の高さと行間のスペースの合計値
KinsokuCnt Integer 省略可能
禁則処理する文字数の指定
省略時の値は 2
0 の時は禁則処理を行わない
禁則文字についてはは plPrev.pas 内のコード参照


図1
実行画面例 (1 頁目)

リスト1
複数頁にテキストを印刷する例 (先読み方式)
DHGL の TextUtils が必要
uses
  TextUtils;

{$R *.DFM}

//=============================================================================
//  ディスクからテキストを読込んで設定したマージン内に印刷
//  1頁で終了しない場合は次頁に印刷する
//
//  禁則処理を行うこのコードは,プレビューまで時間がかかる
//
//  usesにTextUtils(中村拓男氏作)が必要
//=============================================================================
procedure TForm1.BitBtn1Click(Sender: TObject);
var
  LStringList : TStringList;
  LOptions    : TFormatOptions;
  LRowH       : Integer;
  LStartY     : Integer;
begin
  //テキストを保持するTStringList作成
  LStringList:=TStringList.Create;

  LOptions := [foJustify];
  try
    //TStringListにテキストを読込む
    LStringList.LoadFromFile('001.txt');

    plPrev1.TopMargin    := 300;  //上端マージン
    plPrev1.BottomMargin := 250;  //下端マージン
    plPrev1.LeftMargin   := 300;  //左端マージン
    plPrev1.RightMargin  := 250;  //右端マージン
    LRowH                := 60;   //行幅

    plPrev1.BeginDoc;
    plPrev1.FontSize(10.5);
    plPrev1.FontName('MS P明朝');
    try
      while True do begin
        if plPrev1.PageNumber = 1 then begin
          LStartY := 900;
        end else begin
          LStartY := plPrev1.TopMargin;
        end;

        plPrev1.StringListOut(LStringList,
                              LOptions,
                              plPrev1.LeftMargin,
                              plPrev1.PaperWidth - plPrev1.RightMargin,
                              LStartY,
                              plPrev1.PaperHeight - plPrev1.BottomMargin,
                              LRowH);
        //描画領域に3mmの余白をつけてブルーの枠線を描画
        plPrev1.PenColor(clBlue);
        plPrev1.PenWidth(3);
        plPrev1.RectLine(plPrev1.LeftMargin - 30,
                         plPrev1.PaperWidth - plPrev1.RightMargin + 30,
                         LStartY - 30,
                         plPrev1.PaperHeight - plPrev1.BottomMargin + 30);
        if LStringList.Count = 0 then break;

        //改頁
        plPrev1.NewPage;
      end;
    finally
      plPrev1.EndDoc;
    end;

    //プレビュー開始
    plPrev1.ShowModal;
  finally
    FreeAndNil(LStringList);
  end;
end;




行間や禁則処理なしのテキスト文書の印刷


テキスト文書の描画メソッドでは,行間や禁則処理を行っているため,処理に時間がかかる場合があります.行間指定が不要で,単にテキストファイルを読込みんで印刷するだけであれば以下のコードで十分です.
ただし,このコードでは複数頁にまたがる印刷はできません.
この他にも,サンプルプログラム集に,印刷プレビュー制御コンポーネントを使用したテストプログラムがあります.参考にしてください.


リスト2
行間や禁則処理をしないテキストファイルの印刷
//=============================================================================
//  行間や禁則処理なしのテキスト文書の印刷
//  複数ページは不可
//=============================================================================
procedure TForm1.BitBtn1Click(Sender: TObject);
var
  LRect       : TRect;
  LStringList : TStringList;
begin
  //印刷領域の設定
  LRect := Rect(plPrev1.LeftMargin,
                plPrev1.TopMargin,
                plPrev1.PaperWidth,
                plPrev1.PaperHeight);
  plPrev1.BeginDoc;
  LStringList := TStringList.Create;
  try
    //テキストファイルを読み込む
    LStringList.LoadFromFile('001.txt');

    plPrev1.FontName('MS ゴシック');
    DrawTextEx(plPrev1.Canvas.Handle,
               PChar(LStringList.Text),
               -1,
               LRect,
               DT_LEFT or DT_WORDBREAK,
               nil);
  finally
    FreeAndnil(LStringList);
    plPrev1.EndDoc;
  end;

  //プレビュー開始
  plPrev1.ShowModal;
end;