タイトル : 改ページ 投稿日 : 2006/03/17(Fri) 02:03 投稿者 : 魔界の仮面弁士
No.3270 の、元の内容ってどうなっていましたっけ? (中途半端に編集されてしまっていて、話の流れが分かりにくくなっているような…) > しようかと思いあぐねましたが, VB 6.0 のようにサブルーチンして > Callで呼び出すことができるとわかって、本当にありがたい思いでしたが、 # VB6 でサブルーチンというと、(On...)GoSub / Return の事を指す場合もあるので、 # Sub プロシージャという言い方の方が誤解が少ないかも。 > これから先が、まったくわかりません。 具体的なサンプルは、YASさんが書いてくださっていますので……印刷の考え方について。 どうやら、VB6 での開発経験がおありのようですね。 ならば、VB.NET の印刷処理を考える前に、「VB6 の Timer イベントの処理」を 思い出してみてください。 たとえば、「1 秒ごとに現在時刻を表示」し、それを「5 秒間続けるアプリ」を作る場合、 VB6 では、Timer を使って、このようなコードを書く事ができますよね。 ======================================== Option Explicit Private FinishTime As Date Private Sub Command1_Click() FinishTime = DateAdd("s", 5, Now) '5秒後の時刻を取得(終了条件) Timer1.Interval = 1000 Timer1.Enabled = True '★時計の開始★ End Sub '☆繰り返し呼ばれるイベント☆ Private Sub Timer1_Timer() Call DrawTime(Now) '★描画処理を Call★ If Now >= FinishTime Then Timer1.Enabled = False '★終了条件を満たしたら、このイベントの発生を止める★ End If End Sub '☆画面への描画処理☆ Private Sub DrawTime(ByVal D As Date) Label1.Caption = FormatDateTime(D, vbLongTime) End Sub ======================================== 上記では、Timer イベント自体が呼ばれるたびに、描画処理を Call して、 時刻表示を更新するといった作りになっています。 そして VB.NET の印刷処理も、これと同じような流れで記述する事ができます。 たとえば、「1 ページごとに、現在のページ番号を印字」して、 それを「5 ページ繰り返すアプリ」は、下記のように書けます。 (実行すると、左上に 1〜5 のページ番号が書かれた 5 ページの文書が出力されます) ======================================== Private 現在のページ番号 As Integer Private 終了ページ番号 As Integer Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click 現在のページ番号 = 1 終了ページ番号 = 5 '5ページ目が終了条件 '印刷の場合 'PrintDocument1.Print() '★印刷の開始★ 'プレビューの場合 PrintPreviewDialog1.Show() End Sub '☆繰り返し呼ばれるイベント☆ Private Sub PrintDocument1_PrintPage(ByVal sender As Object, ByVal e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage Call DrawPage(現在のページ番号, e) '★描画処理を Call★ 現在のページ番号 += 1 If 現在のページ番号 > 終了ページ番号 Then e.HasMorePages = False '★終了条件を満たしたら、このイベントの発生を止める★ Else e.HasMorePages = True End If End Sub '☆ Grahpics への描画処理☆ Private Sub DrawPage(ByVal ページ As Integer, ByVal e As Printing.PrintPageEventArgs) Dim G As Graphics = e.Graphics Dim myFont As Font = New Font("MS ゴシック", 220, FontStyle.Bold, GraphicsUnit.Pixel) Dim bluePen As Brush = Brushes.Blue.Clone() Dim bmpPen As Brush = New TextureBrush(Icon.ToBitmap(), Drawing2D.WrapMode.TileFlipXY) G.FillEllipse(bmpPen, 0, 0, 300, 300) G.DrawString(CStr(ページ), myFont, bluePen, 40, 40) bmpPen.Dispose() bluePen.Dispose() myFont.Dispose() End Sub ======================================== 先の VB6 の Timer イベントの処理と、上記の VB.NET の PrintPage イベントの 処理とを、よく見比べて見てください。使っているメソッドやオブジェクトこそ異なりますが、 処理の流れとしては、さほど大きな違いはありませんよね。 なお、5ページ分印刷するからといって、 Private Sub PrintDocument1_PrintPage(…… For 現在のページ番号 = 1 To 終了ページ番号 Call DrawPage(現在のページ番号, e) If 現在のページ番号 > 終了ページ番号 Then e.HasMorePages = False Else e.HasMorePages = True End If Next End Sub といった書き方はできません。 |