いつもお世話になります。
MsgBox関数で表示されるダイアログと全くデザインで
自作のメッセージボックスを作成したのですが、
フォームの幅と高さをメッセージ(ラベル)の長さ・高さに
合わせて調節にするにはどのようにすれば良いでしょうか?
フォーム上には最大日本語30文字*最大5行のメッセージが
表示できるように、ラベルが5つ貼り付けてあります。
メッセージによって1行の長さも、何行になるかも
まちまちなので、それに合わせてフォームの大きさを変え、
ボタンの位置も再配置出来るようにしたいのです。
その方法を具体的にご教授して頂けないでしょうか。
宜しくお願いします。
因みに今は、最大文字数が表示できる幅に固定してあります。
高さは表示される行数に合わせて、その都度固定の値をセットする
ようにしてあります。
ボタンもいくつ表示させるかによって、固定で値をセットしています。
ラベルのAutoSizeをTrueにして変わったサイズに合わせてフォームを広げてあげれば良いんじゃないでしょうか?
私も自作のメッセージボックスを使ってますが、そのようにしています。
前に書いた分では分かり難かったのかも・・・。すみません。
ラベルは一つでOKです。
nanashiさんの言うように、AutoSizeをTrueに設定しておきます。
ラベルのCaptionを設定する際に、
StrConv(MidB$(StrConv("文字列", vbFromUnicode), 開始位置, 一行の文字長), vbUnicode)
で文字列を整形(VbCrLfを追加)しておきます。(そうしないと、横に長くなるはず・・・)
但し、VbCrLfが途中にあったら、開始位置はVbCrLf以降になります。
この辺はInStr関数を使えば検索できます。
後は、ラベルの幅と高さは自動で設定されるので、Caption設定後、フォームの幅、高さ、コマンドボタンの配置を行えば良いのです。
下のコードを貼り付けて実行してみて下さい。
雰囲気的なものは分かると思います。
'* Form1 ******************************************************
Private Sub Form_Click()
myMsgBox "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
myMsgBox "A" & vbCrLf & _
"A" & vbCrLf & _
"A" & vbCrLf & _
"A" & vbCrLf & _
"A" & vbCrLf & _
"A" & vbCrLf & _
"A" & vbCrLf & _
"A" & vbCrLf & _
"A" & vbCrLf
End Sub
'* Form2 ******************************************************
' Label1, Command1, Command2 をフォーム上に
Public wButton As VbMsgBoxResult
Private Sub Command1_Click()
wButton = vbOK
Unload Me
End Sub
Private Sub Command2_Click()
wButton = vbCancel
Unload Me
End Sub
'* Module1 ****************************************************
Public Function myMsgBox(Prompt, _
Optional Buttons As VbMsgBoxStyle = vbOKOnly, _
Optional Title, _
Optional HelpFile, _
Optional Context) As VbMsgBoxResult
Dim oMsgBox As Form2
Set oMsgBox = New Form2
With oMsgBox
.Label1.AutoSize = True
.Label1.Caption = CStr(Prompt)
.Width = .Label1.Left + .Label1.Width + 3000
.Height = .Label1.Top + .Label1.Height + 3000
End With
oMsgBox.Show vbModal
myMsgBox = oMsgBox.wButton
Set oMsgBox = Nothing
End Function
nanashi様、吉野様
早速のご教授ありがとうございます。
吉野様には前回教えて頂いた時に、すぐにお伺いすれば良かったんですが、
とりあえず自分で頑張ってみようと思いまして…玉砕しました。
ただ説明が足りませんでしたが、メッセージはDBに5つのフィールドに
分けて登録されているので、ラベルも5つ用意してあるのです。
それで行数による高さの制御も必要になってしまうのですが、
逆に最大5つのメッセージをひとつの文字列に直してしまう方が
結果的に楽に制御できるという事ですよね?
それともラベルは5つのままでも、簡単に出来るのでしょうか?
何度もお尋ねして申し訳ありません。
メッセージは、順次フィールドに入っているのなら、
別けても簡単に出来ます。
Nullであれば、それ以降の行のVisibleをFalseにすれば良いだけですから。
Nullで無いラベルのTopとHeightを足した分から、コマンドボタンのTopプロパティを設定すれば良いのです。
ただ、後々の修正(例えば、フィールドの追加など)を考えると、分ける方法はお勧めできません。文字列連結で作成する方が、後々の修正が楽です。
>1412様、吉野様
いつもわかりやすく解説して下さってありがとうございます。
とりあえず教えて頂いたようにやってみます。
また質問をしてしまうかもしれませんが、その時は
宜しくお願い致します。
度々お世話になります。
もう一点、ご教授願いたいのですが、
ラベルの高さ・幅からフォームの大きさを決定する事は理解出来ましたが、
例えばボタンを3つ表示する場合で、メッセージが短い場合、
要はボタンを並べる幅にフォームの幅が満たない場合も
考えられます。
そのような場合はどのようにするのでしょうか。
一度決めたフォームの幅を、ボタンを3つ並べた幅と比較して
再度決め直すのでしょうか?
再度ご教授願えれば幸いです。
宜しくお願い致します。
単純に
・ラベルの幅
・ボタンの幅
の大きい方にフォームの幅を合わせればよいのでは?
書込みが遅くなりましたが、自己解決しました。
1412様、どうもありがとうございました。
ツイート | ![]() |