フォームの幅と高さを調節するには?

解決


さとこ  2003-10-24 23:43:41  No: 79971

いつもお世話になります。

MsgBox関数で表示されるダイアログと全くデザインで
自作のメッセージボックスを作成したのですが、
フォームの幅と高さをメッセージ(ラベル)の長さ・高さに
合わせて調節にするにはどのようにすれば良いでしょうか?

フォーム上には最大日本語30文字*最大5行のメッセージが
表示できるように、ラベルが5つ貼り付けてあります。
メッセージによって1行の長さも、何行になるかも
まちまちなので、それに合わせてフォームの大きさを変え、
ボタンの位置も再配置出来るようにしたいのです。
その方法を具体的にご教授して頂けないでしょうか。
宜しくお願いします。

因みに今は、最大文字数が表示できる幅に固定してあります。
高さは表示される行数に合わせて、その都度固定の値をセットする
ようにしてあります。
ボタンもいくつ表示させるかによって、固定で値をセットしています。


nanashi  2003-10-25 00:02:54  No: 79972

ラベルのAutoSizeをTrueにして変わったサイズに合わせてフォームを広げてあげれば良いんじゃないでしょうか?
私も自作のメッセージボックスを使ってますが、そのようにしています。


吉野  2003-10-25 00:33:18  No: 79973

前に書いた分では分かり難かったのかも・・・。すみません。
ラベルは一つでOKです。
nanashiさんの言うように、AutoSizeをTrueに設定しておきます。
ラベルのCaptionを設定する際に、
StrConv(MidB$(StrConv("文字列", vbFromUnicode), 開始位置, 一行の文字長), vbUnicode)
で文字列を整形(VbCrLfを追加)しておきます。(そうしないと、横に長くなるはず・・・)
但し、VbCrLfが途中にあったら、開始位置はVbCrLf以降になります。
この辺はInStr関数を使えば検索できます。

後は、ラベルの幅と高さは自動で設定されるので、Caption設定後、フォームの幅、高さ、コマンドボタンの配置を行えば良いのです。


1412  2003-10-25 00:42:18  No: 79974

下のコードを貼り付けて実行してみて下さい。
雰囲気的なものは分かると思います。

'* 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


さとこ  2003-10-25 00:55:06  No: 79975

nanashi様、吉野様
  早速のご教授ありがとうございます。
  吉野様には前回教えて頂いた時に、すぐにお伺いすれば良かったんですが、
  とりあえず自分で頑張ってみようと思いまして…玉砕しました。

ただ説明が足りませんでしたが、メッセージはDBに5つのフィールドに
分けて登録されているので、ラベルも5つ用意してあるのです。
それで行数による高さの制御も必要になってしまうのですが、
逆に最大5つのメッセージをひとつの文字列に直してしまう方が
結果的に楽に制御できるという事ですよね?
それともラベルは5つのままでも、簡単に出来るのでしょうか?
何度もお尋ねして申し訳ありません。


吉野  2003-10-25 01:11:29  No: 79976

メッセージは、順次フィールドに入っているのなら、
別けても簡単に出来ます。
Nullであれば、それ以降の行のVisibleをFalseにすれば良いだけですから。
Nullで無いラベルのTopとHeightを足した分から、コマンドボタンのTopプロパティを設定すれば良いのです。
ただ、後々の修正(例えば、フィールドの追加など)を考えると、分ける方法はお勧めできません。文字列連結で作成する方が、後々の修正が楽です。


さとこ  2003-10-25 03:06:52  No: 79977

>1412様、吉野様
  いつもわかりやすく解説して下さってありがとうございます。
  とりあえず教えて頂いたようにやってみます。

  また質問をしてしまうかもしれませんが、その時は
  宜しくお願い致します。


さとこ  2003-10-28 00:21:46  No: 79978

度々お世話になります。

もう一点、ご教授願いたいのですが、
ラベルの高さ・幅からフォームの大きさを決定する事は理解出来ましたが、
例えばボタンを3つ表示する場合で、メッセージが短い場合、
要はボタンを並べる幅にフォームの幅が満たない場合も
考えられます。
そのような場合はどのようにするのでしょうか。
一度決めたフォームの幅を、ボタンを3つ並べた幅と比較して
再度決め直すのでしょうか?

再度ご教授願えれば幸いです。
宜しくお願い致します。


1412  2003-10-28 01:00:23  No: 79979

単純に
・ラベルの幅
・ボタンの幅
の大きい方にフォームの幅を合わせればよいのでは?


さとこ  2003-10-28 03:32:53  No: 79980

書込みが遅くなりましたが、自己解決しました。
1412様、どうもありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加