プログラムの概要
事務処理に於いて、集計結果等を印 刷して、確認等を行う事も多い為、 ペーパーレスオフィスが推奨される 昨今に於いても、矢張り印刷に関す る技術は必要で有る。 Visual Basic から印刷を行う方法 は、.NET 以降、PrintDocument オ ブジェクトを使用する方法が、標準 機 能 と 仕 て 一 般 的 で 有 る が 、 Professional 版等では ReportView やCrystalReport を利用する事も可 能で有る。亦、Power Packs 2 では 視覚的確認が容易な FormPrint が 機能を向上させて復活して居る。 此処では、Access のデータを、データセットに読み取り、此の情報を、動的に生成したラベルに表示す ると共に、FormPrint を用いて印刷を行う。印刷Ⅳ
VB 2005 ④□ 機能の追加(Visual Basic Power Packs 2.0、3.0)
□ フォームの印刷(FormPrint コントロール、Print メソッド) □ System.Data.OleDb 名前空間(Access データベースの操作) □ データベースの接続(OleDbConnection オブジェクト) □ データベースの操作(OleDbDataAdapter オブジェクト) □ テーブルデータの格納(DataSet オブジェクト) □ コントロールの実行時生成(Private・Dim ステートメント、New ステートメント) 今回の課題項目
□ 機能の追加(Visual Basic Power Packs 2.0、3.0)
□ フォームの印刷(FormPrint コントロール、Print メソッド)
□ コントロールの実行時生成(Private・Dim ステートメント、New ステートメント) 今回の重点項目
■ オブジェクト・プロパティ一覧 ■
※ PrintForm コントロールは、Microsoft Bisual Vasic Power Packs 2.0 をインストールしないと使用 する事は、出来ない。先ず、此れをインストールする必要が有る(6 頁参照)。 コントロールの種類 プロパティ プロパティの設定値 フォーム name PrintForm AutoScroll True BorderStyle FixedSingle StartPosition CenterScreen Text フォーム印刷 パネル name pnlBase BackColor White Size 794, 1123 ラベル1 オブジェクト名 lblTitle BackColor Black Font MS明朝、太字、20 ForeColor White Size 777, 41 Text サークル名簿 TextAlign MiddleCenter ピクチャボックス name picLogo Picture tai.ico ボタン name btnPrint BackColor White Font MS明朝、太字、12 Text 印刷 ラベル1 パネル ピクチャボックス ボタン ラベル8 ラベル2 ラベル9 ラベル10 PrintForm
ラベル2 name lblField1 Font MS明朝、太字、10 Location 8, 57 Text 登録番号 ラベル3 name lblField2 Font MS明朝、太字、10 Location 83, 57 Text 氏名 ラベル4 name lblField3 Font MS明朝、太字、10 Location 159, 57 Text フリガナ ラベル5 name lblField4 Font MS明朝、太字、10 Location 234, 57 Text 郵便番号 ラベル6 name lblField5 Font MS明朝、太字、10 Location 310, 57 Text 住所 ラベル7 name lblField6 Font MS明朝、太字、10 Location 537, 57 Text 電話番号 ラベル8 name lblField7 Font MS明朝、太字、10 Location 643, 57 Text 生年月日 ラベル9 name lblLine1 BackColor Black Location 8, 75 Size 777, 1 Text 空白 ラベル10 name lblLine2 BackColor Black Location 8, 77 Size 777, 1 Text 空白
PrintForm name prnForm
※ ラベル9と10は、横線を描く為に使用して居る。PrintForm を使用する為に追加インストールす るPower Packs 2 には、LineShape、OvalShape、RectangleShape と謂うデザイン時に簡易図形 を描く為のコントロールが含まれて居るので、此の横線を描く為に、LineShape を使用しても良い。 猶、此等のShape コントロールは、Graphics で図形を描画する場合と異なり、図形を移動する時に 元の場所を背景色(背景画)で塗り潰した後、移動先に再描画する必要は無く、単にコントロール をMove メソッド等で移動する丈で済む為、色々と利用すると面白いと思う。
■ プログラムリスト ■
Imports System.Data.OleDb
Public Class PrintForm
Private Const NP As Integer = 50 ' 1頁の行数
Private lblData( NP - 1, 6 ) As Label
' フォームが読み込まれた時の処理
Private Sub PrintForm_Load( ByVal sender As Object, ByVal e As System.EventArgs ) _ Handles Me.Load Dim I, J As Integer Dim X( ) As Integer = { 8, 83, 159, 234, 310, 537, 643 } Dim W( ) As Integer = { 56, 72, 72, 72, 223, 110, 132 } Dim Cn As OleDbConnection Dim Da As OleDbDataAdapter Dim Ds As DataSet Dim F As String Dim S As String ' データ表示域の生成 For I = 0 To ( NP - 1 ) For J = 0 To 6
lblData( I, J ) = New Label With lblData( I, J )
.Size = New Size( W( J ), 13 )
.Location = New Point( X( J ), I * 15 + 87 ) .BackColor = Color.White ' 確認用(色を付けると生成されたラベルが確認出来る) ' .BackColor = Color.Cyan End With Me.pnlBase.Controls.Add( lblData( I, J )) Next Next ' データファイル(MDB ファイル)のフルパスの設定
F = Application.StartupPath : If Not F.EndsWith( "¥" ) Then F &= "¥" F &= "サークル名簿.mdb"
F = "サークル名簿.mdb"
' データベースへの接続情報の設定
Cn = New OleDbConnection( "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & F )
' データアダプタの生成
Da = New OleDbDataAdapter( "SELECT * FROM サークル名簿", Cn )
此処で宣言した変数は宣言したサ ブプロシージャ内でしか値の参照 と設定を行う事が出来ない。 此処で宣言した変数は、宣言した クラスの総てのサブプロシージャ 内で値の参照と設定を行う事が出 来る。 上記でData.OleDb 名前空間をイ ンポートして居るので、名前空間 を省略した記述が可能で有る。 後で変更する可能性の有る数値は マジックナンバーを使用せずに、 定数で宣言して置くと良い。 生成したコントロールは、コンテ ナと成るコントロールのControls コレクションに追加する。 複数のプロパティを設定する場合 は、With ステートメントを用いる と、パフォーマンスが向上する。 ループの中にループを記述する等 入れ子状態に成る事をネスティン グと謂う。
' データセットの生成 Ds = New DataSet ' SQL の発行と取得したデータのデータセットへの格納 Da.Fill( Ds, "CIRCLE" ) ' データの出力
With Ds.Tables( "CIRCLE" )
For I = 0 To ( .Rows.Count - 1 ) If I = NP Then Exit For For J = 0 To 6
If J = 6 Then
S = CDate( .Rows( I ).Item( 7 )).ToString( "yyyy 年 MM 月 dd 日" ) Else
S = .Rows( I ).Item( J ).ToString End If lblData( I, J ).Text = S Next Next End With ' オブジェクト型変数の破棄 Ds.Dispose( ) Da.Dispose( ) Cn.Close( ) Cn.Dispose( ) End Sub ' ボタン(印刷)がクリックされた時の処理
Private Sub btnPrint_Click( ByVal sender As System.Object, ByVal e As System.EventArgs ) _ Handles btnPrint.Click ' ボタンの非表示(ボタンを印刷しない為) btnPrint.Visible = False ' 用紙サイズの設定 Dim PS As System.Drawing.Printing.PaperSize For Each PS In prnForm.PrinterSettings.PaperSizes If PS.Kind = Printing.PaperKind.A4 Then
prnForm.PrinterSettings.DefaultPageSettings.PaperSize = PS End If Next ' 印刷方向の設定(True:横向き、False:縦向き) prnForm.PrinterSettings.DefaultPageSettings.Landscape = False ' 印刷部数の設定(1部) prnForm.PrinterSettings.Copies = 1 ' 解像度の設定(高解像度) prnForm.PrinterSettings.DefaultPageSettings.PrinterResolution.Kind = Printing.PrinterResolutionKind.High 此処で設定して居るプロパティの 中には、デフォルトプロパティで 特に設定する必要の無い物も在る が、明示的に記述して置く事が望 ましい。 データセットは、複数のテーブル を格納する事が出来る為、各テー ブルに、任意の識別子(名前)を 付ける事が出来る。 同じオブジェクトを操作する場合 は、With ステートメントを用いる と、パフォーマンスが向上する。 レコード数は、DataSet 内の指定 したテーブルのRows.Count で取 得する事が出来る。 各フィールド値は、DataSet 内の 指定したテーブルの Rows.Item で取得する事が出来る。 ラベルにデータを表示して仕舞え ば、データセット等は不要と成る 為、此処で破棄して居る。 プロシージャ内で宣言した変数は Static で無い限り、プロシージャ を抜けると、自動的に破棄される が、此れは、変数領域が破棄され る丈で、インスタンスはメモリに 残存する為、破棄する必要が有る。
' カラーモードの設定(True:カラー印刷、False:モノクロ印刷) prnForm.PrinterSettings.DefaultPageSettings.Color = False ' マージン(余白)の設定
' プリンタが自動的にマージンを設定しない場合
' prnForm.PrinterSettings.DefaultPageSettings.Margins = New Printing.Margins( 20, 20, 25, 25 ) ' プリンタが自動的にマージンを設定する場合
prnForm.PrinterSettings.DefaultPageSettings.Margins = New Printing.Margins( 0, 0, 0, 0 )
' 印刷
prnForm.Print( Me, PowerPacks.Printing.PrintForm.PrintOption.Scrollable ) ' ボタンの再表示 btnPrint.Visible = True End Sub End Class PrintForm コントロールの Print メソッドは、フォームを印刷する メソッドで有る。
Microsoft Bisual Basic Power Packs
今回使用するPrintForm コントロールの他、LineShape、OvalShape、RectangleShape の図形系 コントロールを追加するMicrosoft Visual Basic 2005 Power Packs 2.0 は、2008 年 2 月 22 日現 在、下記のサイトよりダウンロードする事が出来る。 http://www.microsoft.com/downloads/details.aspx?FamilyID=92faa81e-e9c1-432c-8c29-813493 a04ecd&DisplayLang=en ダウンロードしたVisualBasicPowerPacksSetup.msi をダブルクリックして起動し、インストール する。猶、進行状況を表すプログレスバーが満杯に成った後、完了する迄に、可成りの時間を要す る事が有るので、途中でキャンセル等を仕無い様に注意され度い。
インストール後は、Professional 版の場合は、ツールボックスに、Power Packs 2.0 と謂うカテゴ リが自動生成され、上記のコントロールが総て表示されるが、Express 版では、手動でツールボッ クスに追加する必要が有る。
猶、上記の4 個のコントロールに DataRepeater コントロールが追加された Microsoft Visual Basic Power Packs 3.0 は、2008 年 2 月 22 日現在、下記のサイトよりダウンロードする事が出来る。新 たにインストールする場合は、此方を選択した方が良い。 http://www.microsoft.com/downloads/details.aspx?FamilyId=371368A8-7FDC-441F-8E7D-FE7 8D96D4063&displaylang=en 此の場合は、ダウンロードしたVisualBasicPowerPacks3Setup.exe をダブルクリックして起動し インストールする。
PrintForm クラス
PrintForm クラスは、実行時に Windows フォームのイメージを印刷出来る様にするクラスで有る。
Visual Basic 2005 で Microsoft Visual Basic Power Packs 2.0 を追加して、PrintForm コンポーネント を使用すると、実行時にフォームのイメージのプリンタへの印刷、印刷プレビューウィンドウへの表示、 又は、ファイルへの出力が可能で有る。此の動作は、Visual Basic の以前のバージョン(6.0 等)で使 用されて居たPrintForm メソッドの動作に代わる物で有る。
※ 猶、Visual Basic 2008 では、此の PrintForm コンポーネントは、標準で提供されて居る。
此のクラスの主なメソッドは、下記の通りで有る。
名前 説明
OnBeginPrint BeginPrint イベントを発生させる。 OnEndPrint EndPrint イベントを発生させる。
OnQueryPageSettings QueryPageSettings イベントを発生させる。
Print Windows フォームのイメージを、PrintAction プロパティで指定された 宛先に送信する。 此のクラスの主なプロパティは、下記の通りで有る。 名前 説明 DocumentName ドキュメントの印刷中に(例えば、印刷ステータスダイアログボックスやプリン タキューに)表示するドキュメント名を取得・設定する。 Form 印刷するフォームを取得・設定する。 PrintAction 印刷出力をプリンタ、印刷プレビューウィンドウ、ファイルの何れに送るかを指 示する値を取得・設定する。 PrinterSettings プリンタの各種プロパティを指定する時に使用する PrinterSettings オブジェク トを取得・設定する。
PrintFileName PrintAction プ ロ パ テ ィ が PrintToFile に 設 定 さ れ て 居 る 場 合 、 EPS (Encapsulated PostScript)ファイルの名前と保存場所のパスを取得・設定する。 此のクラスの主なイベントは、下記の通りで有る。 名前 説明 BeginPrint Print メソッドが呼び出された時、ドキュメントの最初のページが印刷される 前に発生する。 Disposed Dispose メソッドの呼び出しに依ってコンポーネントが破棄されると発生す る。 EndPrint ドキュメントの最後のページが印刷された時に発生する。 QueryPageSettings 各ページが印刷される直前に発生する。 PrintForm コンポーネントが使用する既定のプリンタは、オペレーティングシステムのコントロールパ ネル設定に依り決定される。亦、印刷が始まると、標準の PrintDocument 印刷ダイアログボックスが 表示される。此のダイアログボックスで、ユーザーは、印刷ジョブをキャンセルする事も出来る。
PrintForm コントロールの Print メソッド
フォームのイメージをPrintAction プロパティで指定された宛先に送信するメソッド
Object.Print( ) 書式1
Object.Print( Form, PrintForm.PrintOption ) 書式2
フォームのイメージを印刷する。 Print メソッドは、フォームのイメージをプリンタや、印刷プレビューウィンドウや、ファイルに出力 するPrintForm コンポーネントの主要なメソッドで有る。Print メソッドには、次の 2 種の形式が有る。 パラメータ無しの基本形式(書式1) 事前に設定されたPrintAction プロパティの設定に従い、現在フォーカスを持つフォームの印刷を行う が、既定では、フォームのクライアント領域丈が印刷される。 猶、実行時にフォームのサイズを変更した場合には、フォームの現在観えて居る部分丈が印刷されるが フォームが移動されてフォームの一部が画面の外に有る場合でも、全体が表示されて居るかの様に印刷 される。 亦、Form プロパティを別のフォームに設定して居る場合は、其のフォームのイメージが期待した通り に印刷されない事が有る為、Print メソッドを呼び出す前に、フォームの Focus メソッドを呼び出して 此の問題を回避する。 印刷動作を指定するパラメータを使用するオーバーロードされた形式(書式2) 引数Form には、印刷するフォームを指定し、引数 PrintOption には、フォームの印刷形式を下記に示 すMicrosoft.VisualBasic.PowerPacks.Printing.PrintForm.PrintOption 列挙体で指定する。 メンバ名 説明 CompatibleModeClientAreaOnly 互換性の有る印刷の実装を使用して、現在表示されて居るクライ アント領域を印刷する。 CompatibleModeFullWindow 互換性の有る印刷の実装を使用して、現在表示されて居るフォー ムを印刷する(此れにはタイトルバー、スクロールバー、境界線 も含まれる)。 ClientAreaOnly 新しい実装を使用して、現在表示されて居るクライアント領域を 印刷する。 FullWindow 新しい実装を使用して、現在表示されて居るフォームを印刷する (此れにはタイトルバー、スクロールバー、境界線も含まれる)。 Scrollable 新しい実装を使用して、一部がスクロールされて表示されて居な くてもクライアント領域全体を印刷する。
引数PrintOption が CompatibleModeClientAreaOnly か CompatibleModeFullWindow に設定されて 居る場合は、Visual Basic 6.0 の PrintForm メソッドと下位互換性の有る実装が使用される。此の引数 がClientAreaOnly、FullWindow、又は、Scrollable に設定されて居る場合は、フォームにフォーカス を設定する必要の無い別の実装が使用される。
機 能
書 式
PrintForm コントロールの Print メソッドの注意点 ■ オーバーロードされた Print メソッドとグラフィックス Graphics メソッドに依って描画されたテキストやグラフィックスがフォームに含まれる場合、此れを 印刷するには、基本的なPrint メソッドを使用する。オーバーロードされた Print メソッドを使用する と、オペレーティングシステムに依っては、グラフィックスが描画されない場合が有る。 即ち、オーバーロードされた Print メソッドでは、オペレーティングシステムに依っては、Graphics メソッドを使用して描画されたテキストやグラフィックスが正しく表示されないと謂う現象が発生す る事が有り、更に、PrintOption パラメータを ClientAreaOnly、FullWindow、Scrollable の孰れかに 設定した場合、Print メソッドを呼び出した直後に、フォームの Refresh メソッドを呼び出さなければ 成らない事が有る。此のメソッドを呼び出さない場合、フォームに塵埃が表示される事が有る。 ■ フォーム幅とプリンタ用紙幅 フォームの幅が、プリンタ用紙の幅より広い場合、フォームの右側が途切れる可能性が有る。印刷用の フォームをデザインする時には、標準的な用紙サイズにフォームが収まる事を確認する必要が有る。 ■ フォームのフォーカス オーバーロードされたPrint メソッドでは、引数 Form で指定されたフォームにフォーカスが設定され て居らず、引数PrintOption が CompatibleModeClientAreaOnly か CompatibleModeFullWindow に 設定されて居る場合は、例外が発生する為、引数Form で指定されるフォームは、フォーカスが設定さ れて居る必要が有る。此の問題を回避するには、Print メソッドを呼び出す前に、フォームの Focus メ ソッドを呼び出すと良い。
猶、引数PrintOption が ClientAreaOnly FullWindow か Scrollable に設定されて居る場合は、アプリ ケーション内のフォーカスが設定されて居ないフォームでも指定する事が出来る。 ■ 印刷領域 フォームの印刷時には、フォームのクライアント領域に有る物の総てが印刷される。此れには、総ての コントロール、及び、グラフィックスメソッドを使用してフォームに描画された総てのテキストやグラ フィックスも含まれる。既定では、フォームのタイトルバー、スクロールバー、及び、境界は印刷され ない。亦、既定では、PrintForm コンポーネントはフォーム内の表示されて居る部分丈を印刷する。例 えば、ユーザーが実行時にフォームのサイズを変更した場合、現在表示されて居るコントロールとグラ フィックス丈が印刷される。 ■ 印刷のキャンセル 印刷が始まると、標準の PrintDocument 印刷ダイアログボックスが表示される。此のダイアログボッ クスで、ユーザーは印刷ジョブをキャンセル出来る。 一般的に、PrintForm コンポーネントでは、紙の書類やレポートの様な書式のフォームを作成して、其のフォームのイメージを 印刷する。PrintDocument コンポーネントを使用して同様の事を行う事も出来るが、此の場合、多くのコードが必要に成る可能 性が有る。PrintForm コンポーネントを使用すると PrintDocument コンポーネントを使わなくても、フォームのイメージを、印 刷したり、ファイルに出力する事が出来る。
PrintForm コントロールの PrintAction プロパティ 印刷の出力先を取得・設定するプロパティ Object.PrintAction 印刷出力をプリンタ、印刷プレビューウィンドウ、ファイルの何れに送るかを指示する値を 取得、及び、設定する。 Object には、PrintForm コントロールを指定する。 設定値は、下記に示すPrintAction 列挙体で有る。 メンバ名 説明 PrintToFile 此の印刷操作はファイルへの出力で有る。 PrintToPreview 此の印刷操作は印刷プレビューで有る。 PrintToPrinter 此の印刷操作はプリンタへの出力で有る。 PrintToPrinter を選択した場合、出力はシステムの既定のプリンタに送られる。PrinterSettings プロ パティを使用すると、此の動作をオーバーライドして、プリンタとプリンタのプロパティを明示的に設 定出来る。既定のプリンタが使用出来ない場合、ユーザーがプリンタを選択する様に求められる。
PrintToPreview を選択した場合、フォームは標準の Windows フォーム PrintPreviewDialog コントロ ールに表示される。
PrintToFile を選択した場合、PrintFileName プロパティで指定されたパスの EPS(Encapsulated PostScript)ファイル(.eps、.ps、又は、.ai)にフォームのイメージが保存される。ファイル名を指定 しないと、ユーザーがファイル名を入力する様に求められる。 ※ ファイルは 8 ビットのグレースケール PostScript 形式で保存される。24 ビットの RGB PostScript はサポートされて居ない。 ※ ユーザーは、パスやファイル名拡張子の入力を求められない。ファイルのパスと拡張子が適切で有 る事を確認する為に、独自のダイアログボックスを実装出来る。此れを行うには、Print メソッドの 呼び出し前にSaveFileDialog コンポーネントを使用し、其の戻り値を PrintFileName プロパティ に割り当てる。 PrintForm コントロールの PrinterSettings プロパティ PrinterSettings オブジェクトを取得・設定するプロパティ Object.PrinterSettings プリンタの各種プロパティを指定する時に使用するPrinterSetting オブジェクトを取得、及 び、設定する。 PrinterSetting オ ブ ジ ェ ク ト の 各 プ ロ パ テ ィ の 取 得 ・ 設 定 は 、 PrintDocument ク ラ ス の DefaultPageSetting と同じで有る。 機 能 書 式 解 説 機 能 書 式 解 説
実行時に於けるコントロール配列の追加 Visual Basic 6.0 以前では、フォーム上のコントロールを管理する為に、コントロール配列を使用する 事が出来たが、Visual Basic.NET 以降では、イベントモデルが変更された為、コントロール配列はサ ポートされて居ない。 併し、コードで実行時にコントロールを追加する場合は、其れを格納するオブジェクト変数を配列にす る事に依り、Visual Basic 6.0 以前のコントロール配列と同等の事を行う事が出来る。亦、此の場合、 配列は、1 次元配列で有る必要は無く、多次元配列とする事も出来る。
Visual Basic 2005 でコントロールを実行時に追加するには、Dim ステートメントで New キーワードを 使用してインスタンスを生成し、コントロールを追加するコンテナと成るコントロールのAdd メソッド を使用してフォームに配置する。
下記に、lblTitle と謂う名前のラベルを生成し、フォームに配置するコード例を示す。
Private lblTitle As Label ' ①
Private Sub DynamicControl_Load(ByVal sender As Object, ByVal e As System.EventArgs) _ Handles Me.Load
lblTitle = New Label ' ②
With lblTitle
.Size = New Size(150, 100) ' ③
.Location = New Point(10, 10) ' ④ .BackColor = Color.White .Text = "烏賊の王様" ' ⑤ .TextAlign = ContentAlignment.MiddleCenter End With Me.Controls.Add(lblTitle) ' ⑥ End Sub ① クラスレベルでグローバルな変数と仕て Label クラスのオブジェクト変数を宣言する。但し、プロ シージャ(メソッド)内で完結する場合(他のプロシージャでアクセスしない場合)は、使用する プロシージャ内で宣言しても良い(此の場合でも、フォームに配置する事が出来る)。 ② Label クラスのオブジェクト変数に対してインスタンス(実体)を生成する。此れに依り、当該オブ ジェクト変数にアクセスが可能と成る。猶、インスタンスの生成は、オブジェクト変数の宣言時に New キーワードを用いて行う事も出来る。 ③ コントロールの大きさを Size プロパティに設定する。此れを省略すると、各コントロールの既定の 大きさと成る。 ④ コントロールの配置位置を Location プロパティに設定する。此れを省略すると、既定値の 0,0 が設 定され、コンテナの左上隅に配置される。 ⑤ 必要に応じて、各プロパティを設定する。 ⑥ コンテナと成るコントロールの Controls コレクションに追加する。 猶、実行時に追加したコントロールでイベント処理を行う場合は、イベントハンドラを定義する必要が 有る。此れは、AddHandler ステートメントを使用して行う事が出来る。