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 пп

Leave a Reply