========================================================================== テキスト印刷&プレビューコンポーネント TPreviewBox Text Print & Preview Component Version 1.0 Copyright(C) 2007 〜 2009 seizo ========================================================================== 【 概要 】 プレビュー機能付きのテキスト印刷コンポーネントです。 実際にテキストファイルを印刷しようとすると、紙サイズ・フォント・ 余白をどう扱うか等、意外とやっかいな問題が多くある事に気付きこの コンポーネントを作成しました。 また、このコンポーネントとほぼ同等の印刷機能を持つ PrintText と PrintPageText という汎用の関数も PrintTxt(PrintTxt.pas) という ユニットとして同梱してあります。 TPreviewBox コンポーネント や PrintText 及び PrintPageText 関数を 使用すれば、作成するアプリケーションやコンポーネントに簡単にテキスト 印刷機能及びプレビュー機能を付加する事が可能です。 TPreviewBox のおもな仕様です。 ・たて・横それぞれ最大16個(合計256個)までプレビューページを表示 する事が可能 ・プレビューを開始する先頭ページの指定が可能 ・プレビューの倍率を指定する事が可能(10〜100%) ・印刷するページを指定して印刷する事が可能 (例 : 8〜12ページのみ印刷等) ・オプション指定によりファイル名やタイムスタンプやページ番号を各 ページの余白に印刷する事が可能 ・タブサイズを 0 〜 32 の範囲で指定する事が可能 ・各行に行番号を付加して印刷する事が可能(最大8桁) ・段組印刷を行なう事が可能(最大256段) ・上下左右の余白のサイズを指定する事が可能(最大1インチ) 【 プロパティ 】 このコンポーネント TPreviewBox で追加されたプロパティは、以下の通りです。 property Text: String; テキスト印刷のプレビューをする対象のテキストを指定します。 property PageCount: Integer; 印刷時のページ数を保持するリードオンリィのプロパティ。 property Column: Integer; 横一列に並べるプレビューイメージの数を指定します。(1〜16) property Row: Integer; 縦一列に並べるプレビューイメージの数を指定します。(1〜16) property StartPage: Integer; プレビューの先頭ページを指定します。(1〜PageCount) property ImageCount: Integer; コントロール上に表示する実際のプレビューイメージの数を保持 するリードオンリィのプロパティ。 property Ratio: Integer; プレビューの倍率を指定します。(%単位、10〜100) property Font: TFont; 印刷時のフォントを指定します。 property PrintOption: Integer; 印刷時のオプションを指定します。 PrintOption で使用する定数は、次の様に定義されています。 const poFileName = 1; // 印刷時にファイル名を印字する。 poTimeStamp = 2; // 印刷時にタイムスタンプを印字する。 poPageNumber = 4; // 印刷時にページ番号を印字する。 例えば、すべてのオプションを有効にするには、このプロパティ に (poFileName or poTimeStamp or poPageNumber) という値を 指定します。(すなわち 7 という値です。) property OptionFont: TFont; 印刷時のオプションのフォントを指定します。 property FileName: String; 現在テキスト印刷のプレビューをする対象になっているテキスト にファイル名等の名前を付けます。PrintOption で poFileName が 有効になっている場合は、この名前が印字するファイル名として 使用されます。 property TabSize: Integer; 印刷・プレビュー時のタブサイズを 0 〜 32 の範囲で指定します。 property DefaultExt: Boolean; FileName プロパティに含まれる拡張子の値によってタブサイズの ディフォルト値を自動指定します。 (.pas .c .h .cpp .hpp を特定の拡張子として扱います。) property LineNumber: Integer; 各行に行番号を付加する場合の行番号の桁数を -8 〜 8 の範囲で指定 します。Abs(LineNumber) すなわち LineNumber の絶対値が行番号の 桁数となります。正の値を指定すると桁数に満たない部分の桁が スペースの行番号となり( 155: <== の様な)、また負の値を 指定すると桁数に満たない部分の桁がゼロの行番号となります。 (000155: <== の様な) property LineCount: Integer; 印刷時の総行数を保持するリードオンリィのプロパティ。 property PILeftMargin: TPercent; 左方向の余白のサイズを1インチ(約25.4mm)の何パーセント分 取るかを指定します。 TPercent は、次の様に定義されています。 Type TPercent = 0..100; // パーセンテージを表わす場合の数値(0% 〜 100%) ただし、PILeftMargin には下限値があり、 PaperInfo.LeftMargin * 100 div PaperInfo.DPI.cx よりも 小さい値を指定する事は出来ません。 property PIRightMargin: TPercent; 右方向の余白のサイズを1インチ(約25.4mm)の何パーセント分 取るかを指定します。 TPercent は、次の様に定義されています。 Type TPercent = 0..100; // パーセンテージを表わす場合の数値(0% 〜 100%) ただし、PIRightMargin には下限値があり、 PaperInfo.RightMargin * 100 div PaperInfo.DPI.cx よりも 小さい値を指定する事は出来ません。 property PITopMargin: TPercent; 上方向の余白のサイズを1インチ(約25.4mm)の何パーセント分 取るかを指定します。 TPercent は、次の様に定義されています。 Type TPercent = 0..100; // パーセンテージを表わす場合の数値(0% 〜 100%) ただし、PIToptMargin には下限値があり、 PaperInfo.TopMargin * 100 div PaperInfo.DPI.cy よりも 小さい値を指定する事は出来ません。 property PIBottomMargin: TPercent; 下方向の余白のサイズを1インチ(約25.4mm)の何パーセント分 取るかを指定します。 TPercent は、次の様に定義されています。 Type TPercent = 0..100; // パーセンテージを表わす場合の数値(0% 〜 100%) ただし、PIBottomMargin には下限値があり、 PaperInfo.BottomMargin * 100 div PaperInfo.DPI.cy よりも 小さい値を指定する事は出来ません。 property Partition: Integer; 段組印刷を行なう場合の段数を 1〜256 の範囲で指定します。 property PartitionGap: Integer; 段組印刷を行なう場合の各段のピクセル単位の間隔を 0〜1024 の 範囲で指定します。 property PartitionWidth: Integer; 段組印刷における紙1枚分の中の印刷領域の1ページ分の横幅を ピクセル単位で返すリードオンリィのプロパティです。この値は、 おもに内部での計算に用いられます。 property PartitionHeight: Integer; 紙1枚分の中の印刷領域の高さをピクセル単位で返すリードオンリィ のプロパティです。この値は、おもに内部での計算に用いられます。 property PaperCount: Integer; 実際に印刷した場合の紙の枚数を返すリードオンリィのプロパティ property PageSize: Integer; 1ページのおおよそのサイズを保持するリードオンリィのプロパティ property ImageWidth: Integer; 1つのプレビューイメージの計算上の幅を返すリードオンリィの プロパティ property ImageHeight: Integer; 1つのプレビューイメージの計算上の高さを返すリードオンリィの プロパティ property PreviewWidth: Integer; 現在の ImageCount 個のプレビューイメージ全てを表示する為に 必要なコントロールの幅を返すリードオンリィのプロパティ property PreviewHeight: Integer; 現在の ImageCount 個のプレビューイメージ全てを表示する為に 必要なコントロールの高さを返すリードオンリィのプロパティ property PaperInfo: TPaperInfo; 現在の紙情報を返すリードオンリィのプロパティ TPaperInfo は、次の様に定義されています。 type TPaperInfo = record PrintableArea: TIntegerSize; // 印刷可能領域のサイズ MMPrintableArea: TDoubleSize; // 印刷可能領域のサイズ(mm) PaperSize: TIntegerSize; // 紙サイズ MMPaperSize: TDoubleSize; // 紙サイズ(mm) DPI: TSize; // DPI値 LeftMargin: Integer; // 余白 TopMargin: Integer; RightMargin: Integer; BottomMargin: Integer; PILeftMargin: TPercent; // 余白の1インチ当たりの%値 PITopMargin: TPercent; PIRightMargin: TPercent; PIBottomMargin: TPercent; MMLeftMargin: Double; // 余白(mm) MMTopMargin: Double; MMRightMargin: Double; MMBottomMargin: Double; ScaleFactor: Integer; // スケールファクタ(%) TrueMMPrintableArea: TDoubleSize; // 真の印刷可能領域のサイズ(mm) TrueMMPaperSize: TDoubleSize; // 真の紙サイズ(mm) TrueMMLeftMargin: Double; // 真の余白(mm) TrueMMTopMargin: Double; TrueMMRightMargin: Double; TrueMMBottomMargin: Double; end; property Pages[Index: Integer]: String; 各ページのテキストを返すリードオンリィの配列プロパティ Index は、1〜PageCount でなければなりません。 property PageLine[Index: Integer]: Integer; 各ページの先頭の行番号を返すリードオンリィの配列プロパティ Index は、1〜PageCount でなければなりません。 property Images[Index: Integer]: TImage; コントロール上に表示されているプレビューイメージを返す リードオンリィの配列プロパティ Index は、1〜ImageCount でなければなりません。 例えば、Images[Index] は (StartPage + Index - 1) ページ目 のプレビューイメージを表わしているという事になります。 【 メソッド 】 このコンポーネント TPreviewBox で追加されたメソッドは、以下の通りです。 procedure Print(Books: Integer); 現在の各設定で印刷をします。Books は、印刷の部数です。 procedure PrintPage(PageFrom: Integer; PageTo: Integer; Books: Integer); 現在の各設定でページを指定して印刷をします。Books は、印刷の部数です。 function GetPageMeta(PIndex: Integer): TMetafile; 指定したページのメタファイルイメージを返す関数です。 procedure DispPaperInfo; 現在の種々の紙情報を表示するメソッドです。 procedure Clear; Text と FileName を ''(空文字)にして全てのプレビューイメージを クリアーするメソッドです。 【 イベント 】 このコンポーネント TPreviewBox で追加されたイベントは、以下の通りです。 property OnPreview: TNotifyEvent; プレビューイメージを表示する直前に発生するイベント property OnPreviewed: TNotifyEvent; プレビューイメージを表示した直後に発生するイベント 【 テクニカル情報 】 バグが見つかった場合「まず自分自身を疑え」というのがプログラミングの鉄則で すが、画面表示が予想に反しておかしな表示をする場合があります。--- 印刷時に は常に正常に印刷されます。--- Windows のMetafile 関係のバグと思われますが、 以下に示しましたサンプルアプリケーションの「リフレッシュ」ボタンを押した 場合の様にフォントを設定し直したりすると正常に表示される場合もあります。 バグがあるのを承知で公開するのは、けしからんとお叱りを受けそうですが、この 様なバグの解決方法を誰か見つけることが出来るのではないかという期待を込めて TPreviewBox のソースを公開しています。 procedure TForm1.Button5Click(Sender: TObject); begin PreviewBox1.Font := FontDialog1.Font; end; 【 新しくなった点 】 // Version 0.2 // ・プレビューイメージ上でも以下の各イベントが発生する様に修正 しました。 OnClick, OnDblClick, OnDragDrop, OnDragOver, OnEndDock, OnEndDrag, OnMouseDown, OnMouseMove, OnMouseUp, OnStartDock, OnStartDrag ・TPreviewBox を使用したサンプルアプリケーションを添付しました。 // Version 0.3 // ・DrawMode プロパティを追加しました。この値によって印刷及び プレビューの各種の方法が決定されます。 // Version 0.4 // ・TabSize プロパティを追加しました。これによって印刷・プレビュー時の タブサイズを 0 〜 32 の範囲で指定する事が出来る様になりました。 ・DefaultExt プロパティを追加しました。これによって FileName プロパティ に含まれる拡張子の値によってタブサイズのディフォルト値を自動指定出来る 様になりました。(.pas .c .h .cpp .hpp を特定の拡張子として扱います。) ・タブサイズを指定する事が出来る様になったのにともない、とくに DrawMode プロパティの必要性がなりましたので廃止しました。 (DrawMode という名前の定数として残してはありますが。) // Version 0.5 // ・ImageWidth プロパティを追加しました。この値によってまだプレビューを表示 していない状態であっても一つのプレビューイメージの計算上の幅を知る事が 出来ます。 ・ImageHeight プロパティを追加しました。この値によってまだプレビューを表示 していない状態であっても一つのプレビューイメージの計算上の高さを知る事が 出来ます。 ・PreviewWidth プロパティを追加しました。この値によって現在表示されている ImageCount 個のプレビューイメージ全てを表示する為に必要なコントロールの 幅を知る事が出来ます。 ・PreviewHeight プロパティを追加しました。この値によって現在表示されている ImageCount 個のプレビューイメージ全てを表示する為に必要なコントロールの 高さを知る事が出来ます。 ・Clear メソッドを追加しました。Text と FileName を ''(空文字)にして全ての プレビューイメージをクリアーします。 ・OnPreview イベントを追加しました。プレビューイメージを表示する直前に発生 するイベントです。 ・OnPreviewed イベントを追加しました。プレビューイメージを表示した直後に 発生するイベントです。 ・PrintTxt ユニットに PrintPageText 関数を追加しました。この関数によって 印刷するページを指定して印刷する事が可能となりました。 // Version 0.6 // ・LineNumber プロパティを追加しました。これによって行番号を付加する事が 可能となりました。 ・Partition プロパティを追加しました。これによって段組印刷を行なう事が 可能となりました。 ・PartitionWidth プロパティを追加しました。この値によって 段組印刷における紙1枚分の中の印刷領域の1ページ分の横幅を 知る事が出来ます。 ・PartitionHeight プロパティを追加しました。この値によって 紙1枚分の中の印刷領域の高さを知る事が出来ます。 ・PaperCount プロパティを追加しました。この値によって 実際に印刷した場合の紙の枚数を知る事が出来ます。 // Version 0.7 // ・行サイズが長いテキストファイルでプレビューや印刷が正しく行なわれない 場合があった点を修正しました。これによって思わぬ副産物があり従来の約 2倍の速度でプレビューを表示出来る様になりました。 ・配列プロパティ PageLine を追加しました。これによって各ページの先頭の 行番号を知る事が出来ます。 ・LineCount プロパティを追加しました。この値によって印刷時の総行数を 知る事が出来ます。 // Version 0.8 // ・上下左右の余白のサイズを指定する事が可能になりました。(最大1インチ) // Version 0.9 // ・現在の紙情報を表示するメソッド DispPaperInfo で、余白の値を正しく 表示していなかった点を修正しました。 ・TPaperInfo に余白の1インチ当たりの%値の下限を示す以下のメンバを追加 しました。 PILeftMargin: TPercent; PITopMargin: TPercent; PIRightMargin: TPercent; PIBottomMargin: TPercent; // Version 1.0 // ・OptionFont プロパティを追加しました。これによって印刷時のオプション のフォントを指定する事が可能になりました。 ・印刷の部数を指定する事が可能となりました。印刷関数 procedure Print(Books: Integer); procedure PrintPage(PageFrom: Integer; PageTo: Integer; Books: Integer); の引数 Books に印刷する部数を指定して下さい。 【 収録ファイル 】 PrevBox.pas - TPreviewBox 本体のソースファイル PrevBox.dcr - TPreviewBox のアイコン用ファイル PrintTxt.pas - PrintText 関数を使用する為のユニットファイル Readme.txt - このファイル Test.exe - TPreviewBox を使用したサンプルアプリケーション Test.lzh - サンプルアプリケーションのソースファイル 【 TPreviewBox のインストール方法 】 適当なフォルダを作成して、そのなかに PrevBox.pas と PrevBox.dcr を コピーしてからコンポーネントのインストールで、その PrevBox.pas を 選択して下さい。 【 PrintText 及び PrintPageText 関数の使用方法 】 PrintText 及び PrintPageText 関数は以下の様に定義されています。 function PrintText(Text: String; TextName: String; Font: TFont; TabSize: Integer; LineNumber: Integer; PILeftMargin: TPercent; PIRightMargin: TPercent; PITopMargin: TPercent; PIBottomMargin: TPercent; Partition: Integer; PartitionGap: Integer; PrintOption: Integer; OptionFont: TFont; Books: Integer): Integer; function PrintPageText(Text: String; TextName: String; Font: TFont; TabSize: Integer; LineNumber: Integer; PILeftMargin: TPercent; PIRightMargin: TPercent; PITopMargin: TPercent; PIBottomMargin: TPercent; Partition: Integer; PartitionGap: Integer; PrintOption: Integer; OptionFont: TFont; PageFrom: Integer; PageTo:Integer; Books: Integer): Integer; 一般のアプリケーションでこれらの関数を使う場合は、アプリケーションと 同じフォルダに PrintTxt.pas をコピーしてから、アプリケーションの ソースファイルの uses 節に PrintTxt と記述して下さい。 例えば、該当アプリケーションが TMemo を使用しているとすれば PrintText(Memo1.Text, OpenDialog1.FileName, Memo1.Font, 8, 4, 76, 76, 76, 92, 1, 32, poFileName or poTimeStamp or poPageNumber, Memo1.Font, 1); PrintPageText(Memo1.Text, OpenDialog1.FileName, Memo1.Font, 8, 4, 76, 76, 76, 92, 1, 32, poFileName or poTimeStamp or poPageNumber, Memo1.Font, 1, 5, 1); の様な感じで Memo1 の内容を印刷する事が出来ます。 【 参考資料 】 中村 拓男 著(ソフトバンクパブリッシング発行) Delphi Graphic Secrets Know-how & Libraries 中村 拓男さん、有難うございました。 【 著作権 】 このプログラムの著作権は、seizo が有します。 【 ソフトウェア種別 】 このプログラムはフリーソフトウェアです。以下の事項を御承諾頂ければ、 自由にコピー、使用、配布を行なって頂いて構いません。 ◎このプログラムを使用した上でのいかなる損害、損失にも当方は一切 責任を負いません。このプログラムの使用は、使用者の責任において 行なって下さい。 ◎このプログラムを配布される場合は、このドキュメントファイルも含め 全てのファイルをオリジナルの状態で配布して下さい。 【 その他 】 御存知の様にテキストデータは、コンピュータにとって最も基本的で重要な データ型です。テキストデータは、UNIX や Mac 等の他の環境でも同じよう に扱う事が出来、テキストデータを編集するソフトウェアであるエディター は数多くありますが、テキストデータを思い通りに印刷出来るソフトウェア 意外と少ないのではないかと思います。Windows 以外の環境に Metafile の 様な便利なものがあるかどうかは知りませんが、もし TPreviewBox を他の コンピュータ環境に移植してやろうという方がおられましたら大歓迎です。 ◎seizoの連絡先 e-mail : seizo@mars.dti.ne.jp 他のコンポーネントやアプリ等をここで紹介しています。 http://www.vector.co.jp/vpack/browse/person/an003597.html