フォームのサイズが変更されたときにコントロールのサイズ変更と移動を処理するコードを作成しようとしています。
私のアプローチは、コントロール名とアンカー ディメンション (lstAccounts_Height など) であるキーを使用して、アンカーする必要がある各コントロール ディメンション (つまり、上/左/幅/高さ) の Dictionary オブジェクトを作成し、これらをフォーム レベルに追加することです。コレクション。フォームResize
イベントで Collection が繰り返され、必要に応じて各 Control が調整されます。
コントロールを追加するルーチン:
Private Sub AddFormResizeControl(ControlName As String, _
Dimension As String)
Dim strKey As String
Dim sngValue As Single
Dim dictCtrl As Dictionary
strKey = ControlName & "_" & Dimension
Select Case Dimension
Case "Left": sngValue = Controls(ControlName).Left
Case "Top": sngValue = Controls(ControlName).Top
Case "Width": sngValue = Controls(ControlName).Width
Case "Height": sngValue = Controls(ControlName).Height
End Select
Set dictCtrl = New Dictionary
dictCtrl.Add strKey, sngValue
If colResizeControls Is Nothing Then _
Set colResizeControls = New Collection
colResizeControls.Add dictCtrl, strKey
End Sub
Initialize
イベントにコントロールを追加します。
AddFormResizeControl "lst_AccountSelection", "Width"
AddFormResizeControl "lst_AccountSelection", "Height"
AddFormResizeControl "cmd_Cancel", "Left"
AddFormResizeControl "cmd_Cancel", "Top"
AddFormResizeControl "cmd_Confirm", "Left"
AddFormResizeControl "cmd_Confirm", "Top"
そしてResize
イベント:
Private Sub UserForm_Resize()
Dim sngHeightAdjust As Single
Dim sngWidthAdjust As Single
Dim dict As Dictionary
Dim strCtrl As String
Dim ctrl As Control
Dim strDimension As String
If Me.Width < sngFormMinimumWidth Then Me.Width = sngFormMinimumWidth
If Me.Height < sngFormMinimumHeight Then Me.Height = sngFormMinimumHeight
sngHeightAdjust = (Me.Height - 4.5) - sngFormMinimumHeight
sngWidthAdjust = (Me.Width - 4.5) - sngFormMinimumWidth
If Not colResizeControls Is Nothing Then
For Each dict In colResizeControls
strCtrl = dict.Keys(0)
Set ctrl = Controls(Left(strCtrl, InStrRev(strCtrl, "_") - 1))
If Right(strCtrl, 5) = "_Left" Then
ctrl.Left = dict.Item(strCtrl) + sngWidthAdjust
ElseIf Right(strCtrl, 4) = "_Top" Then
ctrl.Top = dict.Item(strCtrl) + sngHeightAdjust
ElseIf Right(strCtrl, 6) = "_Width" Then
ctrl.Width = dict.Item(strCtrl) + sngWidthAdjust
ElseIf Right(strCtrl, 7) = "_Height" Then
ctrl.Height = dict.Item(strCtrl) + sngHeightAdjust
End If
Next dict
End If
End Sub
私が直面している問題は、最初の移動イベントに小さな「ジャンプ」があり、その結果、実行時のコントロールが設計時のように完全に調整されていないことです。返されたフォームの高さと幅を 4.5 ずつ変更することで、この効果に対抗しようとしましたが、これは役に立ちます。
sngFormMinimumHeight
とは、イベントsngFormMinimumWidth
の開始幅/高さまたはフォームとして設定されており、チップ ピアソンのコードを使用してフォームをサイズ変更可能にしています。Initialize
フォームには調整が必要なある種の境界線があると思います(したがって、4.5秒が問題を助けます)-調整する必要がある値を誰か説明できますか?
解決BonCodigo から提供されたリンクのおかげで、問題は解決さMe.Height
れましMe.Width
た。4.5の調整が不要になり、「ジャンプ」がなくなりましたMe.InsideHeight
Me.InsideWidth