5 строк кода

Как писать приложения на MS Access

Динамеческое изменение размеров элементов управления

Один комментарий

Я хочу поделиться очень полезными функциями CM_ResizeCtl() и CM_ResizeWidth(), которые подгоняют элемент управления при изменении размеров форм. В основном я использую их для подчиненных форм в табличном виде.

Что нужно сделать:

  • Создать новую форму.
  • Убрать область выделения, полосы прокрутки, область выбора записей.
  • Разместить в области данных элемент управления в левом верхнем углу. Назовем его f_spis_. Элементом управления может быть любой тип. Я чаще использую для подобных случаев подчиненную форму в табличном виде. Элемент управления можно размещать и в заголовке или примечании формы, но в этом случае элемент управления будет меняться только по ширине.
  • Создать событие формы «Изменение размера» следующего вида:

Private Sub Form_Resize()
    Call mc_Form.VC_ResizeCtl(Me.f_spis_)
End Sub

Код функций:

Public Sub VC_ResizeCtl(ByRef ctl As Control)
' Скоков С.А. 2006-12-16
' Изменяет размер элемента управления под оконные размеры формы.
' функция должна вызываться на событие Form_Resize()
' Элемент управления должен находится в области данных.
' Предполагается что он один и должен занимать всю облатсь данных.
' 0.6 * c_lTvipInSm и 1 * c_lTvipInSm константы, определенные опытным путем,
' чтобы элемент управления не прилипал к правой и ниженй части формы
On Error GoTo Err_
    Dim frm As Form
    Dim lCtlWidth As Long, lCtlHeight As Long
    Dim lDetailHeight As Long
    
    Set frm = ctl.Parent
    '-- изменение размеров "поверхности" формы
    frm.Width = frm.WindowWidth
    lDetailHeight = frm.WindowHeight - frm.Section(acHeader).Height - frm.Section(acFooter).Height
    '-- если форму свернуть, то произойдет ошибка
    If lDetailHeight < 0 Then
        Exit Sub
    End If
    
    frm.Section(acDetail).Height = lDetailHeight
    '-- изменение размеров элемента управления
    lCtlWidth = frm.WindowWidth - ctl.Left * 2 - 0.4 * c_lTvipInSm
    lCtlHeight = frm.WindowHeight - ctl.Top * 2 - 1 * c_lTvipInSm _
                - frm.Section(acHeader).Height - frm.Section(acFooter).Height

    If lCtlWidth > c_lTvipInSm Then ctl.Width = lCtlWidth
    If lCtlHeight > c_lTvipInSm Then ctl.Height = lCtlHeight
Exit_:
    Exit Sub
Err_:
    MsgBox Err.Description
    Resume Exit_
    Resume
End Sub
Public Sub CM_ResizeWidth(ByRef frm As Form, ByRef ctl As Control)
' Скоков С.А. 2008-03-12
' Изменяет размер элемента управления под оконные размеры формы по ШИРИНЕ.
' функция должна вызываться на событие Form_Resize()
' Элемент управления должен находится в области данных.
' Предполагается что он один и должен занимать всю облатсь данных.
' 0.6 * c_lTvipInSm и 1 * c_lTvipInSm константы, определенные опытным путем,
' чтобы элемент управления не прилипал к правой и ниженй части формы
On Error GoTo Err_
    Const c_lTvipInSm As Long = 567

    Dim lCtlWidth As Long, lCtlHeight As Long

    '-- изменение размеров элемента управления
    lCtlWidth = frm.WindowWidth - ctl.Left - 0.6 * c_lTvipInSm

    If lCtlWidth > c_lTvipInSm Then ctl.Width = lCtlWidth
Exit_:
    Exit Sub
Err_:
    MsgBox Err.Description
    Resume Exit_
End Sub

До встречи!

(с) Скоков Сергей

Подписаться на: RSS или e-mail рассылку или добавить в ЖЖ друзья.

Written by Сергей Скоков

Ноябрь 4th, 2011 at 11:39 пп

Один комментарий to 'Динамеческое изменение размеров элементов управления'

Subscribe to comments with RSS or TrackBack to 'Динамеческое изменение размеров элементов управления'.

  1. Большое спасибо! Очень полезная штука!

    Валерий

    26 Мар 17 at 07:45

Leave a Reply