Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Изменение размера формы / 9 сообщений из 9, страница 1 из 1
01.12.2004, 13:36:59
    #32807580
Vsevolod V
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение размера формы
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Private Sub Form_Load()
Dim ctl As Control

Set ctl = Screen.ActiveControl
    Call MoveSubMenu2(Me, ctl, - 2 . 5 , - 55 )
    Me!aa.Width = ctl.Width ' aa - ListBox
    Me.Width = ctl.Width
End Sub
Открываю форму под активным контролом при его изменении. Нужно чтобы ширина формы скорректировалась по ширине активного контрола. Приведенный код отрабатывает, а размер формы не меняется
...
Рейтинг: 0 / 0
01.12.2004, 15:47:18
    #32807900
lobodava
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение размера формы
Для формы надо использовать InsideHeight и InsideWidth
...
Рейтинг: 0 / 0
01.12.2004, 15:52:37
    #32807918
Vsevolod V
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение размера формы
Спасибо! Буду знать :)
...
Рейтинг: 0 / 0
01.12.2004, 17:13:38
    #32808117
Программист-Любитель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение размера формы
Но есть, как говориться, нюансы.

1. Если имеется указатель записи - от InsideWidth долой 270 твипов.

2. Если есть номера записи и скроллбары - от InsideWidth и InsideWidth доллой еще сколько-то, наизусть не помню.

3. InsideHeight должно хватать на сумму секций. Я почему-то всегда организую форму из одной секции Section(0), и на ней размещаю всю информацию. Тогда остальными Section можно перенебречь.

4. Порядок переразмещения элементов и изменения размеров формы имеет значение. Нельзя сделать Section(0).Height меньше, чем фактически занимают элементы. Поэтому алгоритм обычно такой:
а) поджать все эелементы в верхний левый угол, у кого можно - обнулить Height и Width.
б) Расчитать новые Top, Left, Height и Width элементов, постепенно располагая их сверху вниз и справа налево с учетом имеющихся InsideHeight и InsideWidth и 1) и 2).
в) Присвоить Section(0).Height = Me.InsideHeight

При этом надо иметь флажок, что бы при Section(0).Height = Me.InsideHeight не входить в Repaint два раза. Вернее сразу выходить, войдя второй раз.
...
Рейтинг: 0 / 0
01.12.2004, 17:41:56
    #32808200
Изменение размера формы
Только вчера решал такую задачу (давно хотелось, а то RunCommand acCmdSizeToFitForm не всегда можно применить).

Использовал я тот же подход, что и "Программист-Любитель" - через свойства формы InsideWidth и InsideHeight (пробовал я, кстати, ради интереса, то же сделать через WinAPI, но не вполне успешно - почему-то вычисляемые AdjustWindow координаты отличаются от ожидаемых на 2 пиксела каждая, да и определить высоту аксессовской панели с кнопками перехода по записям, чтобы прибавить её к сумме высот секций формы, я не смог).

Хотелось бы в этой связи кое-что уточнить.

1) Я тоже поломал голову над учётом ширины указателя записи. Но хорошее решение (лучше, чем абсолютная величина в твипах) нашлось - свойство CurrentSectionLeft формы. Согласно его описанию, оно служит не для этого и по логике вещей должно относиться к секции, в которой сейчас находится фокус, но, к счастью для нашей задачи, независимо от фокуса оно возвращает как раз ширину указателя записи.

2) Вот этого, признаться, я не понял. В моих тестах высота панели с навигационными кнопками учитывалась свойством InsideHeight автоматически и не требовалось ничего корректировать. Я что-то не учёл?

3) Сверившись с первым томом "Гетца", я написал простую функцию, которая возвращает текущую "высоту" формы как сумму высот отображаемых секций.

Вот мой код (ввиду тривиальности процедур обработчики ошибок я писать не стал):

Код: plaintext
Public Sub FormSizeToFit(frm As Access.Form)\n\n    frm.InsideHeight = FormHeight(frm)\n    frm.InsideWidth = frm.Width + frm.CurrentSectionLeft\n\nEnd Sub\n\nPrivate Function FormHeight(frm As Access.Form)\n\n    Dim iint As Integer\n    Dim intSection As Access.Section\n\n    On Error Resume Next \'самый простой способ обработать отсутствие той или иной секции\n\n    \'в форме максимум 5 секций, из них нас интересуют первые 3\n    \'(acDetail=0,acHeader=1,acFooter=2), поскольку колонтитулы на экране не отображаются\n    For iint =  0  To  2 \n\n        Set intSection = frm.Section(iint)\n\n        If Err.Number =  0  Then\n            If intSection.Visible Then\n                FormHeight = FormHeight + intSection.Height\n            End If\n        End If\n\n        Err.clear\n\n    Next iint
End Function
...
Рейтинг: 0 / 0
01.12.2004, 18:36:16
    #32808318
Изменение размера формы
Я тут заметил у себя ошибку в венгерской нотации:

Код: plaintext
    Dim intSection As Access.Section

Смысл переменной в процессе разработки изменил, а префикс скорректировать забыл. Извиняюсь.
...
Рейтинг: 0 / 0
01.12.2004, 21:01:29
    #32808469
Программист-Любитель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение размера формы
По поводу 2).

Пусть Section(0) единственная основная секция формы без вяких header'ов и прочего. У меня типичные ситуации когда не форма натягивается на нарисованную в дизайнере раскладку, а наоборот, при изменении резиновой формы надо вписать в нее гриды и др. элементы.

Вот тут если форма уменьшается и попробовать сделать Section(0).Height меньше .Top + .Height самого низкого/высокого контрола, то не выйдет. Сама по себе InsightHeight может стать меньше этой величины и меньше Section(0).Height, но при этом будет некрасивый эффект - по PdDn часть формы уйдет под верхнюю рамку, что бы показать невлезшее в нижней части.

Отсюда и последовательность 4. а), б), в).

После того, как это сделал я в Developers Handbook специальный класс нашел. Минусы этого класса

- нельзя задавать пропорции (чего-то 30% от ширины, чего-то - 40%, чего-то остальное), только фиксировано в одну/другую сторону.

- в сиду универсализма работает медленно на сложных формах (с табстрипами, да на каждом табстрипе по куче элементов).

Вот пример простой в этом отношении формы:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
Private Sub Form_Resize()
    
    If bResize Then Exit Sub
    bResize = True
    Me.Painting = False
    
    If bFirstTime Then
        bFirstTime = False
        '
        ' Ðàçìåùåíèå ïîëîñ lbl1, rect1, lbl2
        '
        With Me.lbl1
            .Left =  15 
            .Top =  15 
            .Width = Me.InsideWidth -  30 
        End With
        With Me.rect1
            .Left =  15 
            .Top = Me.lbl1.Top + Me.lbl1.Height
            .Width = Me.InsideWidth -  30 
            .Height =  90  + Me.lblLetter.Height _
                    +  60  +  2  * Me.btnPersonFindLetter01.Height _
                    +  90 
        End With
        With Me.lbl2
            .Left = Me.lbl1.Left
            .Top = Me.rect1.Top + Me.rect1.Height
            .Width = Me.lbl1.Width
        End With
        '
        ' Óïðàâëÿþùèå ýëåìåíòû âíóòðè âåðõíåé ïîëîñû rect1
        '
        ' Ïåðâàÿ ñëåâà ãðóïïà Ïîêàçûâàòü: Òîëüêî êëèåíòîâ;VIP êëèåíòîâ
        '
        With Me.lblFilter
            .Left =  100 
            .Top = Me.rect1.Top +  90 
        End With
        With Me.bPersonIsClient
            .Left = Me.lblFilter.Left
            .Top = Me.lblFilter.Top + Me.lblFilter.Height +  90 
        End With
        With Me.lblPersonIsClient
            .Left = Me.bPersonIsClient.Left + Me.bPersonIsClient.Width
            .Top = Me.bPersonIsClient.Top -  30 
        End With
        With Me.bPersonIsVipClient
            .Left = Me.bPersonIsClient.Left
            .Top = Me.lblPersonIsClient.Top + Me.lblPersonIsClient.Height +  90 
        End With
        With Me.lblPersonIsVipClient
            .Left = Me.bPersonIsVipClient.Left + Me.bPersonIsVipClient.Width
            .Top = Me.bPersonIsVipClient.Top -  30 
        End With
        
        With Me.bPersonGroup
            .Left = Me.lblPersonIsClient.Left + Me.lblPersonIsClient.Width +  100 
            .Top = Me.bPersonIsClient.Top
        End With
        With Me.lblPersonGroup
            .Left = Me.bPersonGroup.Left + Me.bPersonGroup.Width
            .Top = Me.lblPersonIsClient.Top
        End With
        With Me.bPersonNotGroup
            .Left = Me.bPersonGroup.Left
            .Top = Me.bPersonIsVipClient.Top
        End With
        With Me.lblPersonNotGroup
            .Left = Me.bPersonNotGroup.Left + Me.bPersonNotGroup.Width
            .Top = Me.lblPersonIsVipClient.Top
        End With
        
        '
        ' Âòîðàÿ ñëåâà ãðóïïà Ïîêàçûâàòü òèï êîíòàêòà; â ò.÷. ïóñòûå
        '
        With Me.lblContactTypeID
            .Left = Me.lblPersonGroup.Left + Me.lblPersonGroup.Width +  200 
            .Top = Me.lblFilter.Top
        End With
        With Me.iContactTypeID
            .Left = Me.lblContactTypeID.Left
            .Top = Me.lblContactTypeID.Top + Me.lblContactTypeID.Height +  100 
        End With
        With Me.bContactTypeIsZero
            .Left = Me.lblContactTypeID.Left + Me.lblContactTypeID.Width _
                  - .Width +  30 
            .Top = Me.iContactTypeID.Top
        End With
        With Me.lblContactDictionary
            .Left = Me.lblContactTypeID.Left + Me.lblContactTypeID.Width +  100 
            .Top = Me.lblFilter.Top
        End With
        With Me.btnContactTypeDictionary
            .Left = Me.lblContactDictionary.Left _
                 + (Me.lblContactDictionary.Width - .Width) /  2 
        End With
        
        With Me.lblPersonFind
            .Left = Me.lblContactDictionary.Left + Me.lblContactDictionary.Width +  200 
            .Top = Me.lblContactDictionary.Top
        End With
        
        Me.txtPersonFind.Left = Me.lblPersonFind.Left
        Me.btnPersonFind.Left = Me.lblPersonFind.Left + Me.lblPersonFind.Width _
                              - Me.btnPersonFind.Width
        '
        ' Òðåòüÿ ñëåâà ãðóïïà Ïîèñê ïî àëôàâèòó
        '
        With Me.lblLetter
            .Left = Me.lblPersonFind.Left + Me.lblPersonFind.Width +  200 
            .Top = Me.lblPersonFind.Top
        End With
        Dim i As Integer, s As String
        For i =  1  To  15 
            s = "btnPersonFindLetter" & Format(i, "00")
            With Me.Controls(s)
                .Left = Me.lblLetter.Left _
                      + Me.btnPersonFindLetter01.Width * (i -  1 )
                .Top = Me.lblLetter.Top + Me.lblLetter.Height +  60 
                .Width = Me.btnPersonFindLetter01.Width
                .Height = Me.btnPersonFindLetter01.Height
            End With
        Next i
        For i =  16  To  30 
            s = "btnPersonFindLetter" & Format(i, "00")
            With Me.Controls(s)
                .Left = Me.lblLetter.Left _
                      + Me.btnPersonFindLetter01.Width * (i -  15  -  1 )
                .Top = Me.btnPersonFindLetter01.Top _
                     + Me.btnPersonFindLetter01.Height
                .Width = Me.btnPersonFindLetter01.Width
                .Height = Me.btnPersonFindLetter01.Height
            End With
        Next i
        
        Me.btnPersonFind.Top = Me.btnPersonFindLetter16.Top _
                             + Me.btnPersonFindLetter16.Height _
                            - Me.btnPersonFind.Height
        Me.txtPersonFind.Top = Me.btnPersonFind.Top _
                            + (Me.btnPersonFind.Height - Me.txtPersonFind.Height) /  2 
        Me.btnContactTypeDictionary.Top = Me.btnPersonFind.Top
        Me.iContactTypeID.Top = Me.txtPersonFind.Top
        Me.bContactTypeIsZero.Top = Me.iContactTypeID.Top
        
    Else 'If bFirstTime Then
    
        With Me.lbl1
            .Width = Me.InsideWidth -  30 
        End With
        With Me.rect1
            .Width = Me.lbl1.Width
        End With
        With Me.lbl2
            .Width = Me.lbl1.Width
        End With
        
    End If 'If bFirstTime Then
    
    Dim h As Integer
    With Me.grPersonContact
        .Width =  0 
        .Height =  0 
        .Left =  0 
        .Top = Me.lbl2.Top + Me.lbl2.Height
        .Width = Me.InsideWidth
        h = Me.InsideHeight - .Top
        If h <  1000  Then h =  1000 
        .Height = h
    End With
    
    Me.Section( 0 ).Height = Me.InsideHeight
    bResize = False
    Me.Painting = True

End Sub
...
Рейтинг: 0 / 0
02.12.2004, 11:33:55
    #32809123
Изменение размера формы
На самом деле я имел в виду вот это:

Программист-Любитель2. Если есть номера записи и скроллбары - от InsideWidth и InsideWidth доллой еще сколько-то, наизусть не помню.

Дело в том, что по моим наблюдениям, свойства InsideWidth и InsideWidth автоматически учитывают (в отличие от указателя записи) размеры и навигационных кнопок с номером записи, и скроллбаров, так что никакой ручной коррекции не требуется (MS Access 2000 SP3). Я хотел бы знать, в чём причина такого расхождения в наших наблюдениях.
...
Рейтинг: 0 / 0
02.12.2004, 12:29:02
    #32809317
Программист-Любитель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение размера формы
Причина простейшая - у меня на всех таких резиновых формах с пересчетом указатели бывают, а скроллбаров и полей номера записи - никогда.

Поэтому на данное утверждение можно наплевать. :)
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Изменение размера формы / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]