abc817で「トヨタセリカLB2000GT」(hachette)の組立が終わったことを報告したが、同シリーズは更に1/4スケールの「18R-Gエンジン」が追加となり150号まで続いた。エンジンモデルはスケルトン構造で、ピストンやクランクシャフト、バルブ、ラジエターファンが動くなど、ガソリンエンジンの構造がよく判る。この頃の車のエンジンはユーザー自身がカスタマイズ化するなど結構手入れをすることが当たり前だったのだが、今の車は電子化され、ユーザには手に負えない物となった。
車本体よりパーツが少ないのだが、組立には3日を要した。特にネジ止めにはヘッドが6角の専用ネジが多く採用され、これに合う工具がなく、ラジオペンチでこまめに回すしかなかった(ミニ6角BOXで合う物もあったが)。
このシリーズの問題点は、車本体の所でも述べたが、各号の付属パーツと組立時のタイミングが合わず、パーツの取り置きが多いことである。コロナの影響で生産計画がうまくいかなかったのかもしれないが、今後のシリーズには取り置きが無いようにして欲しいものである。
印刷はPrintDocumentクラスのPrintメソッドで開始するが、どのように印刷するかをPrintPageイベントハンドラ内に記述する。PrintPageイベントで受け取るPrintPageEventArgsオブジェクトのGraphicsプロパティにDrawImageやDrawStringメソッドなどを使って描画を行い、Printメソッドで印刷を実行する。
Public Class Form1 Private Sub TextBox1_Click(sender As Object, e As EventArgs) Handles TextBox1.Click Dim ofd As New OpenFileDialog() With { .Title = "ファイル選択", “画像ファイル|*.bmp;*.jpg;*.gif;*.png"} If ofd.ShowDialog() <> DialogResult.OK Then Return End If TextBox1.Text = System.IO.Path.GetFileName(ofd.FileName) Dim img = Image.FromFile(ofd.FileName) If img Is Nothing Then MessageBox.Show("ファイルが開けません") Return Else PictureBox1.Image = img End If End Sub Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click If PictureBox1.Image Is Nothing Then MessageBox.Show("印刷する画像がありません") Return End If Dim prd As New System.Drawing.Printing.PrintDocument Dim pdg As New PrintDialog AddHandler prd.PrintPage, AddressOf prd_PgPrint pdg.Document = prd If pdg.ShowDialog() = DialogResult.OK Then prd.Print() End If End Sub Private Sub prd_PgPrint(sender As Object, e As System.Drawing.Printing.PrintPageEventArgs) Dim img As Image = PictureBox1.Image Dim mgw As Single = e.MarginBounds.Width Dim igw As Single = img.Width Dim igh As Single = img.Height e.Graphics.DrawImage(img, 0, 0, mgw, mgw * igh / igw) e.HasMorePages = False End Sub End Class |
印刷デザイン画面 | 印刷実行(印刷設定)画面 |
Public Class Form1 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click If PrintDialog1.ShowDialog() = DialogResult.OK Then PrintDocument1.Print() End If End Sub Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click PageSetupDialog1.ShowDialog() ' End Sub Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click PrintPreviewDialog1.ShowDialog() End Sub Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) _ Handles PrintDocument1.PrintPage Dim mgx As Integer = e.MarginBounds.X Dim mgy As Integer = e.MarginBounds.Y e.Graphics.FillRectangle(Brushes.YellowGreen, 0, 0, 200, 100) Dim f As New Font("MS明朝", 64, FontStyle.Bold) e.Graphics.DrawString("VisualBasicで印刷をテスト", f, Brushes.Red, mgx, mgy + 300) End Sub End Class |
デザイン画面でコントロールを配置 (印刷ツールはコンポーネントトレイに) |
プリンタの設定画面 | ページの設定画面 |
プレビュー画面 | 印刷出力例(周囲に空白がある) |
Public Class Form1 Private ptx As String ' 印刷するテキスト Private pps As Integer = 0 ' 印刷文字位置 Private pfn As Font = New Font("MS明朝", 48, FontStyle.Bold) ' 印刷文字フォント Private x As Integer = 0 ' 印刷する初期位置(左上)を指定 Private y As Integer = 0 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click If PrintDialog1.ShowDialog() = DialogResult.OK Then PrintDocument1.Print() End If End Sub Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click PageSetupDialog1.ShowDialog() End Sub Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click PrintPreviewDialog1.ShowDialog() End Sub Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) _ Handles PrintDocument1.PrintPage ptx = TextBox1.Text ' 印刷する文字列 If pps = 0 Then ' 文字位置が先頭なら、 ptx = ptx.Replace(vbCrLf, vbLf) ' 改行記号を'\n'に統一する ptx = ptx.Replace(vbCr, vbLf) End If txt_PrintPage(e) ' ptxをe.Graphicに描画する関数 End Sub Private Sub txt_PrintPage(e As System.Drawing.Printing.PrintPageEventArgs) While e.MarginBounds.Bottom > y + pfn.Height AndAlso pps < ptx.Length Dim lin As String = "" While True If pps >= ptx.Length OrElse ptx.Chars(pps) = vbLf Then pps += 1 ' 改行なら1文字進める Exit While End If lin += ptx.Chars(pps) ' 1文字追加し、印刷幅を超えるか? If e.Graphics.MeasureString(lin, pfn).Width > e.MarginBounds.Width Then lin = lin.Substring(0, lin.Length - 1) ' 追加しすぎたので1文字戻す Exit While End If pps += 1 ' 印刷文字位置を次へ End While e.Graphics.DrawString(lin, pfn, Brushes.Black, x, y) ' 1行分をe.Graphicsに描画する y += pfn.GetHeight(e.Graphics) ' 次の行の印刷位置を計算 End While If pps >= ptx.Length Then ' 次のページがあるか調べる e.HasMorePages = False ' 次ページがない pps = 0 ' 文字列位置を0に初期化する Else e.HasMorePages = True ' 次ページが残っている pps += 1 ' 印刷文字位置を次へ End If y = 0 ' 印刷行位置を0に初期化する End Sub End Class |
印刷デザイン画面 | 印刷プレビュー例 |
プレビュー(1頁目) | プレビュー(2頁目) | 印刷出力例 |
※HasMorePagesプロパティは、Trueにすると、次ページが残っていることを表し、1頁分のDocumentをPrint後、PrintPageイベントを発生させ、PrintDocument1_PrintPageが再び実行される。
※PrintDialog(プリンタ設定)には以下のプロパティなどがあるが、ここでは、まだ対応していない
AllowSelection: | 選択した印刷範囲のページ指定を有効にする(初期値False) |
AllowSomePages: | 印刷範囲のページ指定を有効にする(初期値False) |
※文字列のReplaceメソッド: 検索文字列があれば置換文字列に変換した文字列を返す
Strings.Replace(検索文字列、置換文字列)
※文字列のSubstringメソッド: 文字列から指定された部分文字列を返す(文字列の先頭位置は0)
String.Substring(開始文字位置[, 文字数])