Printで一度に複数行を表示するには?

解決


ソン  2004-02-11 04:35:02  No: 111770  IP: [192.*.*.*]

ボタンを押す度にテキストを1行ずつ増やして、
Printにてピクチャーに表示させるものを作っています。
bの回数を増やすことで行数を増やしているのですが、
CurrentX,CurrentYの値が反映されず、うまくいきません。
全行のprint位置を指定するにはどのようにしたら良いのでしょうか?
どなたかご教示お願いいたします。
ちなみに、以下のやり方でしています。

Sub Button1_click()
Picture1.Cls

For a = 0 To b

Picture1.CurrentX = 10
Picture1.CurrentY = 20 * a 

Picture1.Print Bun(a)

Next a
b = b + 1
End Sub

編集 削除
魔界の仮面弁士  2004-02-11 10:29:52  No: 111771  IP: [192.*.*.*]

> bの回数を増やすことで行数を増やしているのですが、
コード中のBun()というのは、恐らくString配列(またはStringを返す関数)と
思いますが、その各行のデータ中に「改行文字」は含まれていますか?
もし含まれているなら、CurrentXの指定は、先頭行にしか反映されません。
(2行目の出力時には、CurrentXが0に戻ってしまいます)
改行データが含まれないようにデータを区切る必要があります。


> CurrentX,CurrentYの値が反映されず、うまくいきません。
CurrentXの値を、100 とか 1000 などと大きく変化させてみても、
「値が反映されない」のでしょうか?

例えば、「CurrentX,CurrentYの値が反映されない」のではなく、
Picture1.ScaleModeの設定が適切では無いか、もしくは、CurrentX = 10という
設定値が小さすぎて、画面上の変化が見て取れない…という事はありませんか?


> 全行のprint位置を指定するにはどのようにしたら良いのでしょうか?
CurrentYの方は、今回の使い方だと「行間」の指定を行うイメージになりますよね。
もし、標準の行間のままで良いなら、毎回CurrentYを指定する必要はありません。
(Print後には、自動的に「次行の出力位置」にCurrentX/Yが設定されるますから)

一方、CurrentXの方は、今回の使い方だと「左余白」の指定となりますね。
左余白を設定するのであれば、CurrentXで各行ごとに制御するのではなく、
ScaleLeftなどを使って、原点座標の位置を変更しておいた方が簡単ですよ。


> Sub Button1_click()
あれ? 特に変更しなければ、「Button1_click」ではなく、「Command1_Click」という
名前になるはずですが…。(VB.NETというわけでも無さそうですし)


> Picture1.Cls
『ボタンを押す度にテキストを1行ずつ増やす』仕様なのですよね。
ならば、毎回Cls (CLSって、Clear Screenの意味らしいですね) してから
Printしなおすのではなく、最後の1行分だけをPrintすれば済むのでは。

編集 削除
ソン  2004-02-11 23:45:44  No: 111772  IP: [192.*.*.*]

魔界の仮面弁士さん、丁寧なご回答ありがとうございます。
いろいろと説明不足ですみませんでした。
たしかに、毎回全文をプリントするのではなく、
For NextとPicture1.Clsをはずし、
最期の行だけをプリントすることでとてもシンプルにできました。
これによって、CurrentXは常に反映されるようになりました。
ありがとうございました。

CurrentYは、おっしゃるとおり行間を指定したかったのです。
しかし、そこで新たに問題が出てきました。
Printは画面の右端で切れてしまうので、
Bun(a)を表示させるときに、25文字で区切ろうと思い、

Picture1.CurrentX = 10

if Len(Bun(a))>25 then           '25文字でより大きかったら、
   Picture1.CurrentY = 10
   Kugiri1 = Mid(bun(a),1,25)     '25文字で区切る
   Kugiri2 = Mid(bun(a),26, Len(bun(a))-25)
   Picture1.Print Kugiri1
   Picture1.CurrentX = 10          'CurrentXを新たに指定
   Picture1.Print Kugiri2
else
   Picture1.CurrentY = 20 * (a+1)
   Picture1.Print bun(a)
end if

と2行に分けてPrintしました。ここまでは良かったのですが、
次に25文字以下の文をPrintしたとき、
その文が2行表示した文と重なって表示されてしまいました。

Printで改行を上手く行う方法はないのでしょうか?
お手数ですが、教えて頂けましたら幸いです。

編集 削除
ソン  2004-02-11 23:48:16  No: 111773  IP: [192.*.*.*]

付け忘れました。
bunと、Kugiri1,Kugiri2はいずれもString型です。
aはinteger型です。

編集 削除
魔界の仮面弁士  2004-02-12 01:50:58  No: 111774  IP: [192.*.*.*]

> if Len(Bun(a))>25 then           '25文字でより大きかったら、
そのコードだと、50文字以上の行があった時に困りませんか?
25文字単位でループ処理した方が良いかもしれません。

>   Picture1.CurrentX = 10          'CurrentXを新たに指定
先にも書きましたが、ScaleLeftプロパティ(もしくはScaleメソッド)で
  Private Sub Form_Load()
    Picture1.ScaleLeft = -10
    Picture1.Cls
  End Sub
などと座標系を変更しておけば、毎回 CurrentX を指定せずとも済みますよ。

>   Picture1.CurrentY = 20 * (a+1)
>   Picture1.Print bun(a)
25文字単位で区切るということは、1行分のデータ( Bun(x) )が、
複数行にまたがって書かれる可能性があるという事ですよね。

という事は、「Bun配列のインデックスを表す変数(データの行番号)」と、
「CurrentYの位置を管理するための変数(表示上の行番号)」を、それぞれ
別々に管理しておかなければいけないかと。

編集 削除
ソン  2004-02-13 22:51:52  No: 111775  IP: [192.*.*.*]

こんばんは。お返事おそくなってすみません。
ご回答ありがとうございました。
魔界の仮面弁士さんのおっしゃるとおり、
bun(文章を読み込む変数)と表示位置がずれて
表示されてしまったため、別々の変数を新たに設定し、
CurrentYが画面の下まできたら、こちらの値だけを
一番上にもってくる方法でなんとかできました。
Scaleleftの方法も丁寧に教えて下さって本当に助かりました。
ありがとうございました。

編集 削除