ボタンを押す度にテキストを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
> 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すれば済むのでは。
魔界の仮面弁士さん、丁寧なご回答ありがとうございます。
いろいろと説明不足ですみませんでした。
たしかに、毎回全文をプリントするのではなく、
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で改行を上手く行う方法はないのでしょうか?
お手数ですが、教えて頂けましたら幸いです。
付け忘れました。
bunと、Kugiri1,Kugiri2はいずれもString型です。
aはinteger型です。
> 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の位置を管理するための変数(表示上の行番号)」を、それぞれ
別々に管理しておかなければいけないかと。
こんばんは。お返事おそくなってすみません。
ご回答ありがとうございました。
魔界の仮面弁士さんのおっしゃるとおり、
bun(文章を読み込む変数)と表示位置がずれて
表示されてしまったため、別々の変数を新たに設定し、
CurrentYが画面の下まできたら、こちらの値だけを
一番上にもってくる方法でなんとかできました。
Scaleleftの方法も丁寧に教えて下さって本当に助かりました。
ありがとうございました。