Изменение размеров элементов управления при изменении размеров формы (MS Access 2003)
Профессионально разработанный пользовательский интерфейс должен одинаково хорошо смотреться и быть удобным для пользователя независимо от того, на каком дисплее он отображается. Давайте взглянем на изображенную ниже форму MS Access:

Первое желание пользователя, открывшего такую форму, попытаться растянуть диалоговое окно таким образом, чтобы весь текст помещался в текстовом поле. Однако волшебства не происходит: форма хоть и имеет изменяемые границы, но результат далек от ожидаемого.

Попытаемся исправить ситуацию. У формы есть событие Resize (Изменение размера), которое возникает при изменении размера формы. В обработчике события необходимо предусмотреть:
- Изменение ширины однострочных текстовых полей.
- Изменение ширины и высоты многострочного текстового поля.
- Изменение положения по вертикали и по горизонтали кнопки Close.
Обработчик события изменения размеров формы Resize может быть примерно следующим:
Private Sub Form_Resize()
On Error GoTo Er
Me.tbFirstName.Width = Me.InsideWidth - 1854
Me.tbLastName.Width = Me.InsideWidth - 1854
Me.tbTitle.Width = Me.InsideWidth - 1854
Me.tbNotes.Width = Me.InsideWidth - 1854
Me.tbNotes.Height = Me.InsideHeight - 2202
Me.btnClose.Top = Me.InsideHeight - 500
Me.btnClose.Left = (Me.InsideWidth - Me.btnClose.Width) / 2
Exit Sub
Er:
MsgBox Err.Description, vbOKCancel, "Error number: " & Err.Number
End Sub
Теперь элементы управления «подстраиваются» под размер формы, однако, есть нюанс: если попытаться растянуть форму по вертикали, получим ошибку «2100: Элемент управления или подчиненная форма не могут быть размещены в указанном месте«.

Дело в том, что форма состоит из трех областей:
- области заголовка (Header);
- области данных (Detail);
- области примечания (Footer).
Элементы управления на форме расположены в области данных, высоту которой также нужно изменять при изменении высоты формы. Поскольку на нашей форме область заголовка и область примечания отсутствуют, то достаточно в начало обработчика события Resize добавить строку:
Me.Section(acDetail).Height = Me.InsideHeight
Но и это еще не все. Необходимо обрабатывать ситуацию, когда окно формы сворачивается в область задач. MS Access 2003 не содержит средств для определения состояния окна формы (WindowState), но никто нам не запрещает воспользоваться Windows API. Добавляем новый модуль и помещаем туда единственную строку:
Declare Function IsIconic Lib "user32" (ByVal hwnd As Long) As Long
Окончательный вариант обработчика:
Private Sub Form_Resize()
On Error GoTo Er
If IsIconic(Me.hwnd) Then Exit Sub
Me.Section(acDetail).Height = Me.InsideHeight
Me.tbFirstName.Width = Me.InsideWidth - 1854
Me.tbLastName.Width = Me.InsideWidth - 1854
Me.tbTitle.Width = Me.InsideWidth - 1854
Me.tbNotes.Width = Me.InsideWidth - 1854
Me.tbNotes.Height = Me.InsideHeight - 2202
Me.btnClose.Top = Me.InsideHeight - 500
Me.btnClose.Left = (Me.InsideWidth - Me.btnClose.Width) / 2
Exit Sub
Er:
MsgBox Err.Description, vbOKCancel, "Error number: " & Err.Number
End Sub
Теперь окно с ошибкой «2100: Элемент управления или подчиненная форма не могут быть размещены в указанном месте» появляется только в том случае, когда форма уменьшается настолько, что контролы и в самом деле на ней не помещаются.

Таким образом, даже такая простая задача, как изменение положения и размеров элементов управления при изменении размеров формы в MS Access 2003, не лишена нюансов и тонкостей, которые нужно учитывать. Скачать демонстрационный пример: ControlResizing.rar

simply_sash,
А откуда берутся эти размеры?
1854,2202,500 кнопка Close/2.
Для определения этих значений я использую следующий трюк:
Пишу обработчик события изменения размеров формы:
Private Sub Form_Resize() Debug.Print "=========" Debug.Print "tbFirstName.Width: " & Me.InsideWidth - Me.tbFirstName.Width Debug.Print "tbNotes.Height: " & Me.InsideHeight - Me.tbNotes.Height Debug.Print "btnClose.Top: " & Me.InsideHeight - Me.btnClose.Top End SubПосле этого изменяю размер формы таким образом, чтобы оставить небольшой зазор справа для элементов tbLastName, tbFirstName, tbTitle, tbNotes и отступ снизу, достаточный для размещения кнопки.
Аналогичным образом определяю смещение от верхнего края формы для кнопки.
В окне Immediate смотрю последние значения:
Для определения горизонтального смещения кнопки от ширины формы вычитаем ширину кнопки и делим на 2 (для горизонтального центрирования кнопки).
После определения смещений код из Form_Resize() удаляю, он больше не нужен.