我猜这是不可能的,但是就这样吧。
Java 和最近的 .Net 更新能够实现流布局——布局管理器重新排列表单控件以适应可用空间。
我只见过使用硬编码绝对位置的 VBA 和 WinForms。
有没有人在这种情况下遇到过流布局管理器?
我有一个这样布置的表格。我的所有控件都根据它们的垂直位置依次命名:txt_R1、txt_R2、txt_R3 等...
当表单加载时,它看起来像这样:
当我更新组合框时,将执行以下代码:
Dim s_tier As String
Dim s_rate As String
Dim s_lbl_Rate As String
Dim s_lbl_Tier As String
Dim s_obj As String
Me.TXT_Min.Visible = True
Me.LBL_MIN.Visible = True
Me.TXT_Min.Value = 0
Me.TXT_Scale.Visible = True
Me.lbl_Scale.Visible = True
Me.TXT_Scale.Value = 0
Me.txt_MinMax.Visible = True
Me.lbl_MinMax.Visible = True
Me.txt_MinMax.Value = 0
s_tier = "TXT_T"
s_rate = "TXT_R"
s_lbl_Rate = "LBL_R"
s_lbl_Tier = "LBL_T"
For i = 1 To numActive
'Tier Text Box
s_obj = s_tier & i
Me(s_obj).Visible = True
Me(s_obj).Value = "NULL"
'Tier Label
s_obj = s_lbl_Tier & i
Me(s_obj).Visible = True
'Rate Text Box
s_obj = s_rate & i
Me(s_obj).Visible = True
Me(s_obj).Value = "NULL"
'Rate Label
s_obj = s_lbl_Rate & i
Me(s_obj).Visible = True
Next i
'set last tier to infinite, since last tier typically goes on forever
s_obj = s_tier & numActive
Me(s_obj).Value = ChrW(&H221E)
Me(s_obj).FontSize = 16
'Make Test button visible and move to appropriate place
s_obj = s_lbl_Tier & (numActive + 1)
Me.Btn_Test.Top = Me(s_obj).Top
Me.Btn_Test.Left = Me(s_obj).Left
Me.Btn_Test.Visible = True
s_obj = s_tier & (numActive + 1)
'Make Test button visible and move to appropriate place
Me.btn_SQL.Top = Me(s_obj).Top
Me.btn_SQL.Left = Me(s_obj).Left
Me.btn_SQL.Visible = True
Me.Refresh
如果在组合框中选择了“1”,则刷新后的表单现在如下所示:
...或者如果在组合框中选择了“2”:
...或者如果在组合框中选择了“3”:
我的方法的关键是使用顺序命名约定来利用
for i = 1 to numactive
一段代码。循环结束后,所有静态控件都可见。我可以将 numactive 变量添加 1 以确定第一个不可见控件的位置,并将我的“浮动”控件锚定到该位置。
可以调整此方法以使用偏移量而不是其他控件的位置实际将任何控件放置到任何位置。让想象力自由驰骋!
Access 2007 及更高版本通过锚定实现此功能:使控件在调整窗体大小时拉伸、缩小或移动
如果您想在早期版本中执行此操作,您可以使用表单的 On Resize 事件自行滚动。
WinForms 当然有FlowLayoutPanel和TableLayoutPanel ..
MSDN 上有一个AutoLayout for Winforms 的示例。