Printerオブジェクトの行間設定

解決


お願いします  2010-03-30 10:08:17  No: 102320  IP: [192.*.*.*]

VB6.0
WindowsXP

Printerオブジェクトで印刷をするプログラムを作成しています。
行間を設定する方法がわからないので教えてください。

編集 削除
魔界の仮面弁士  2010-03-30 12:50:12  No: 102321  IP: [192.*.*.*]

文字列は 1 行ずつ Print で描画するようにし、
各行の開始位置は CurrentY プロパティで位置調整してみてください。
文字列の本来の高さは、TextHeight メソッドで測定できます。

編集 削除
お願いします  2010-03-31 13:42:35  No: 102322  IP: [192.*.*.*]

魔界の仮面弁士さん
回答ありがとうございます。

CurrentYで設定するということは、少しやってみましたが
1行ずつずれてしまいます。それは、現状ScaleMode=vbCharacters
で設定しているからだと思われます。

行間を設定するプロパティは存在しないのでしょうか。
探してみたけどわかりませんでした。

編集 削除
魔界の仮面弁士  2010-03-31 16:42:36  No: 102323  IP: [192.*.*.*]

> CurrentYで設定するということは、少しやってみましたが
> 1行ずつずれてしまいます。それは、現状ScaleMode=vbCharacters
> で設定しているからだと思われます。

vbCharacters であろうとなかろうと、特に関係ないと思いますよ。

たとえ、1行ずつずれてしまうような事があったとしても、CurrentY には
小数値も設定できますので、「1行ずつずれる」事が分かっているのであれば、
それを踏まえて、そこから -0.5 行なり、+0.3 行なりの補正を加えれば良いかと。


で、その「1行ずれ」ですが…もしかして、Tab 関数を併用していませんか?

たとえば
  For n = 1 To 10
    Printer.Print Tab(1); n, n; "TEST",
  Next
などのように、Tab 関数によって次行送りが発生するようなケースにおいては、
既定の行間で描画されることになります。


もし、Tab関数などを使っているわけでも、データに改行等があるのでも無いなら、
Print メソッドの利用時に、末尾改行を抑制しているかどうかを確認してみてください。


一応サンプル。

Option Explicit

Private Sub Form_Load()
    '行の高さ(%)
    HScroll1.Min = 50
    HScroll1.Max = 200
    HScroll1.Value = 100
    HScroll1.LargeChange = 10
    HScroll1.SmallChange = 1
   
    'プレビュー代わりのPictureBox
    Picture1.ScaleMode = vbCharacters
    Picture1.Font.Size = 12
    Picture1.FontTransparent = True

    '印刷用
    Text1.Text = "一行目" & vbCrLf & "二行目" & vbCrLf & "終わり"
    Command1.Caption = "印刷"
End Sub

Private Sub HScroll1_Change()
    Caption = CStr(HScroll1.Value) & "%"
    Picture1.Refresh
End Sub

Private Sub HScroll1_Scroll()
    Caption = CStr(HScroll1.Value) & "%"
    Picture1.Refresh
End Sub

Private Sub Text1_Change()
    Picture1.Refresh
End Sub

Private Sub Picture1_Paint()
    Dim rows() As String
    rows = Split(Text1.Text, vbCrLf)
    Dim h As Single
    h = Picture1.TextHeight("X") * CSng(HScroll1.Value) / 100!
    Dim y As Single, s As Variant
    Picture1.Cls
    y = 0!
    For Each s In rows
        Picture1.CurrentY = y
        Picture1.CurrentX = 0!
        Picture1.Print Tab(1); s;
        y = Picture1.CurrentY + h
    Next
End Sub

Private Sub Command1_Click()
    Dim rows() As String
    rows = Split(Text1.Text, vbCrLf)
    Printer.ScaleMode = vbCharacters
    
    Dim h As Single
    h = Printer.TextHeight("X") * CSng(HScroll1.Value) / 100!
    Dim y As Single, s As Variant
    y = 0!
    For Each s In rows
        Printer.CurrentY = y
        Picture1.CurrentX = 0!
        Printer.Print s;
        y = Printer.CurrentY + h
        If y > Printer.ScaleHeight Then
            y = 0!
            Printer.NewPage
        End If
    Next
    Printer.EndDoc
End Sub

編集 削除
お願いします  2010-04-14 13:36:15  No: 102324  IP: [192.*.*.*]

魔界の仮面弁士さん
回答ありがとうございます。お礼の書込みを忘れていました。
申し訳ありません。

教えていただいたサンプルをアレンジして、思った動作をさせることができました。

ありがとうございます。

編集 削除