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

Пример формы MS Access

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

При изменении размера формы нужно изменять положение и размеры контролов

Попытаемся исправить ситуацию. У формы есть событие Resize (Изменение размера), которое возникает при изменении размера формы. В обработчике события необходимо предусмотреть:

  1. Изменение ширины однострочных текстовых полей.
  2. Изменение ширины и высоты многострочного текстового поля.
  3. Изменение положения по вертикали и по горизонтали кнопки 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: Элемент управления или подчиненная форма не могут быть размещены в указанном месте«.

Элемент управления или подчиненная форма не могут быть размещены в указанном месте

Дело в том, что форма состоит из трех областей:

  1. области заголовка (Header);
  2. области данных (Detail);
  3. области примечания (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