Волею судеб, пришлось создать процедурку(ки) для «правильного» изменения размеров простой формы, т.е. кнопки, поля, рисунки будут разъезжаться/сжиматься как то угодно. Не пробовал для ленточных и остальных, да и при большом количестве контролов будет тормозить. Но идея есть и работает. Контролу в свойстве tag (дополнительные сведения) надо указать «якоря»: @T,@B,@R,@L для закрепления в верхней, нижней, правой, левой части соответственно. Например @B@R привяжет кнопку к правому нижнему углу, а @
T@B@R@L позволит растягивать ее вместе с формой. Последовательность якорей не имеет значения. Да, в форму надо добавить следующие строки в обработчики событий:
1.
2.
3.
4.
5.
6.
7.
Private Sub Form_Load()
nSetControlAnchors Me.Name
End Sub
Private Sub Form_Resize()
nReDrawForm Me.Name, "dArea"
End Sub
, где "dArea" – наименование раздела области данных ,необходимо для нормального расположения контролов (по умолчанию в русской версии «Область данных»)
Ну и, конечно, основной модуль:
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.
Option Compare Database
Option Explicit
Public Declare Function GetWindowRect Lib "user32" (ByVal hWnd As Long, lpRect As RECT) As Long
Public Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Public Const br = 15 ' minimal border width
Public Const sRatio = 14 . 85 ' screen ratio
'-------------------------------------
' (C) Nafigator, 2005
'-------------------------------------
Public Sub nReDrawForm(stFormName As String, stDataAreaName As String)
Dim i, j As Single, ps As Single, st As String
Dim sB As Single, Xn As Integer, Yn As Integer, Rn As RECT
GetWindowRect Forms(stFormName).Form.hWnd, Rn
Xn = Rn.Right - Rn.Left
Yn = Rn.Bottom - Rn.Top
Forms(stFormName).Section(stDataAreaName).Height = Yn * 14 . 85
For Each i In Forms(stFormName).Controls
st = i.Tag
If InStr(st, "@R") > 0 Then
j = InStr(i.Tag, "@X")
If j > 0 Then ps = Val(Mid(st, j + 2 , 9 ))
sB = Xn * sRatio - ps
If InStr(st, "@L") > 0 Then
If sB - i.Left > br Then i.Width = sB - i.Left Else i.Width = i.Left + br
Else
If sB - i.Width > br Then i.Left = sB - i.Width Else i.Left = br
End If
End If
If InStr(st, "@B") > 0 Then
j = InStr(i.Tag, "@Y")
If j > 0 Then ps = Val(Mid(st, j + 2 , 9 ))
sB = Yn * sRatio - ps
If InStr(st, "@T") > 0 Then
If sB - i.Top > br Then i.Height = sB - i.Top Else i.Height = i.Top + br
Else
If sB - i.Height > br Then i.Top = sB - i.Height Else i.Top = br
End If
End If
Next
End Sub
'----------------------------------------------------------
Public Sub nSetControlAnchors(stFormName As String)
Dim i, st As String, r As RECT
Dim sX As Integer, sY As Integer
GetWindowRect Forms(stFormName).hWnd, r
sX = r.Right - r.Left
sY = r.Bottom - r.Top
For Each i In Forms(stFormName).Controls
st = Trim(Str(Round(sX * sRatio - i.Width - i.Left, 2 )))
i.Tag = i.Tag & "@X" & st & String( 10 - Len(st), " ")
st = Trim(Str(Round(sY * sRatio - i.Height - i.Top, 2 )))
i.Tag = i.Tag & "@Y" & st & String( 10 - Len(st), " ")
Next
End Sub