- PR -

ListBoxの動作とAnchor

1
投稿者投稿内容
よっこらしょ
常連さん
会議室デビュー日: 2006/11/18
投稿数: 24
投稿日時: 2007-03-23 12:21
フォームにフォームを2分割するようにListBoxを2個貼り付けます。
Anchorを設定します。
ListBox1:Top,Bottom,Left
ListBox2:Top,Bottom,Right

常に画面を2分していて欲しいので、Resizeイベントを設定します。
ListBox1.Width = Me.Size.Width / 2
ListBox2.Left = Me.Size.Width / 2 + 1

ListBox2については、AnchorにRightを設定しているにかかわらずフォームのサイズを
変化させるとフォームの端に追従していきません。
しかも、高さについてはResizeイベントで何も記入していないのに全く追従しません。

同じ事をButtonでやると高さについては普通の動きですが、やはり右端には追従しません。

これってバグ?
KI
大ベテラン
会議室デビュー日: 2007/01/10
投稿数: 239
投稿日時: 2007-03-23 13:04
パッと見た感じですが、ListBox2.Left を設定していますが、
ListBox2.Width は設定していないのが気になりました。
例えばフォームのWidthが100から200にリサイズされた場合、
ListBox2.Left が 101、ListBox2.Width は50のままになると思いますので、
右が49不足するんじゃないでしょうか。
もっとも Dock しているのだから追従してくるはずだという考え方もありますが。
その辺りがバグなのか仕様なのかは、情報持っていませんので、私にはわかりません。

本題からは少しずれますが、通常は TableLayoutPanel を使うところだと思います。
よっこらしょ
常連さん
会議室デビュー日: 2006/11/18
投稿数: 24
投稿日時: 2007-03-23 17:00
引用:

KIさんの書き込み (2007-03-23 13:04) より:

本題からは少しずれますが、通常は TableLayoutPanel を使うところだと思います。



その様なクラスがあるのですか。
調べてみます。

widthについてはまだ許せるのですが、問題は縦方向です。
Buttonコントロールの場合は大丈夫でしたが、Listboxコントロールの場合
フォームを伸ばし縮みさせているとListboxコントロールが縮んでいき、
最終的には無くなってしまいます。
Height=0になっているのでしょう。
これはどう考えてもバグとしか考えられないのですが。

試してみてください。
KI
大ベテラン
会議室デビュー日: 2007/01/10
投稿数: 239
投稿日時: 2007-03-23 17:52
試してみました。バグっぽいですね。
ウィンドウリサイズ時に、ウィンドウ右下にマウスカーソルをあわせて
斜め方向のリサイズのカーソルでリサイズするとおかしな動きになります。
垂直方向のリサイズのカーソルでリサイズすれば問題は発生しません。

少し調べてみてわかった条件は以下の通り。

(1) リストボックスのAnchor に Top, Bottom を両方含む。
(2) Resizeイベントハンドラ内でリストボックスのWidthを変更する。(固定値ではダメなようです)
(3) Button では発生しない。(それ以外のコントロールは試していません)

以下のコードで再現可能です。
環境はVB2005です。

コード:
'Form1.vb
'-------------------------------------------------------------------------------
Public Class Form1

    Private Sub Form1_Resize(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Resize
        ListBox1.Width = Me.Width
    End Sub

End Class


'Form1.Designer.vb
'-------------------------------------------------------------------------------
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Partial Class Form1
    Inherits System.Windows.Forms.Form

    'フォームがコンポーネントの一覧をクリーンアップするために dispose をオーバーライドします。
    <System.Diagnostics.DebuggerNonUserCode()> _
    Protected Overrides Sub Dispose(ByVal disposing As Boolean)
        If disposing AndAlso components IsNot Nothing Then
            components.Dispose()
        End If
        MyBase.Dispose(disposing)
    End Sub

    'Windows フォーム デザイナで必要です。
    Private components As System.ComponentModel.IContainer

    'メモ: 以下のプロシージャは Windows フォーム デザイナで必要です。
    'Windows フォーム デザイナを使用して変更できます。  
    'コード エディタを使って変更しないでください。
    <System.Diagnostics.DebuggerStepThrough()> _
    Private Sub InitializeComponent()
        Me.ListBox1 = New System.Windows.Forms.ListBox
        Me.SuspendLayout()
        '
        'ListBox1
        '
        Me.ListBox1.Anchor = CType((System.Windows.Forms.AnchorStyles.Top Or _
            System.Windows.Forms.AnchorStyles.Bottom), System.Windows.Forms.AnchorStyles)
        Me.ListBox1.FormattingEnabled = True
        Me.ListBox1.ItemHeight = 12
        Me.ListBox1.Location = New System.Drawing.Point(0, 0)
        Me.ListBox1.Name = "ListBox1"
        Me.ListBox1.Size = New System.Drawing.Size(120, 268)
        Me.ListBox1.TabIndex = 0
        '
        'Form1
        '
        Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 12.0!)
        Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
        Me.ClientSize = New System.Drawing.Size(292, 266)
        Me.Controls.Add(Me.ListBox1)
        Me.Name = "Form1"
        Me.Text = "Form1"
        Me.ResumeLayout(False)

    End Sub
    Friend WithEvents ListBox1 As System.Windows.Forms.ListBox
End Class

1

スキルアップ/キャリアアップ(JOB@IT)