powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Управление формами
25 сообщений из 121, страница 1 из 5
Управление формами
    #39298894
GVOV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имеется приложение которое при запуске выводит Форму 1 которая должна иметь некоторый размер, возможность передвигаться по экрану, минимизироваться на панель задач и восстанавливаться до своего фиксированного размера (вместе с окном Access потому как по другому минимизировать на панель задач не получается). Из этой формы открывается Форма 2 которая по умолчанию разворачивается на весь экран и тоже должна минимизироваться и восстанавливаться. При закрытии кнопкой закрытия Access Формы 2, она закрывается, передавая управление на Форму 1 а при её закрытии закрывается всё приложение.
Всё это удалось реализовать более-менее нормально. Но осталась одна проблема. Как сделать чтобы невозможно было развернуть или изменить размеры Формы 1 а у Формы 2 эти возможности оставались. То есть в режиме когда на экране Форма 1, была не активна кнопка разворачивания окна и мышкой невозможно было вцепится для изменения размера формы.
...
Рейтинг: 0 / 0
Управление формами
    #39298908
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GVOV,
...
Рейтинг: 0 / 0
Управление формами
    #39298909
MrShin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GVOVкогда на экране Форма 1, была не активна кнопка разворачивания окна и мышкой невозможно было вцепится для изменения размера формы.

Поменяйте тип границы окна с изменяемого на другой и отключите кнопки минимизации-максимизации в свойствах окна.
...
Рейтинг: 0 / 0
Управление формами
    #39298942
GVOV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Панург,

Похожим вариантом для решения технического задания на данный момент пользуюсь и я но есть очень существенный недостаток из за которого и пытаюсь отказаться от скрытого окна Access.
В вашем примере минусы:
1. Невозможно минимизировать формы на панель задач, в лучшем случае в левый нижний угол
2. Проблемы с максимизацией Формы 2. Она не держит весь экран, и надо или точно задавать размеры или будут варианты нежелательного восстановления при получении фокуса программы.
Один плюс этого способа в том что получается более красивая рамка формы потому как окно самого Accessа имеет вдавленый контур. Но минусы в сравнении с этим огромные.
...
Рейтинг: 0 / 0
Управление формами
    #39298943
GVOV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MrShin,

Ваше предложение не проходит из за того что в моём примере имеем дело не с окном формы а окном самого Accessa. В том то и задача чтобы это сделать с его окном.
...
Рейтинг: 0 / 0
Управление формами
    #39298956
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GVOV, я не стесняюсь Access и не пользуюсь скрытием окна приложения. Чего и тебе желаю.
...
Рейтинг: 0 / 0
Управление формами
    #39298957
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GVOV, да, остальное мелочи и решаемо.
...
Рейтинг: 0 / 0
Управление формами
    #39298960
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GVOV2. Проблемы с максимизацией Формы 2. Она не держит весь экран, и надо или точно задавать размеры или будут варианты нежелательного восстановления при получении фокуса программы.С этим проблем в сделанном мной примере не обнаружил (только что посмотрел)
...
Рейтинг: 0 / 0
Управление формами
    #39298962
GVOV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Панург,

Согласен на 100%. Я тоже не стесняюсь. Но со временем уже начинаю замечать эти мелочи. К примеру пользователь хочет скрыть программу чтобы временно перейти в другую. В принципе есть много способов это сделать и это не проблема, но я замечал что большинство пользователей моей программы лезут в правый верхний угол её свернуть (хотя можно минимизировать все окна или просто переключится в другую интересующую программу). Если не скрывать окно Access (а по факту у меня сейчас так и есть) то программа минимизируется в окне но рабочее пространство не очищается, потому как надо ещё минимизовать и сам Access, а это опять щёлкать, пользователи начинают нервничать и теряться (ну они не сильно продвинутые в таком деле). То же и при разворачивании. Почему так действуют пользователи трудно сказать, возможно потому что остальные программы таким образом отлично улетают на панель задач а потом так же красиво возвращаются.
Из за этого и решил каким-то образом побороть это неудобство (конечно же оно не критическое но всё равно имеет своё влияние на субъективное восприятие программы)
...
Рейтинг: 0 / 0
Управление формами
    #39298964
GVOV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ПанургGVOV2. Проблемы с максимизацией Формы 2. Она не держит весь экран, и надо или точно задавать размеры или будут варианты нежелательного восстановления при получении фокуса программы.С этим проблем в сделанном мной примере не обнаружил (только что посмотрел)

В вашем примере она принимает размер экрана но не минимизируется из за чего у меня чуточку вылазит за левую кромку монитора и немного перекрывает панель задач. Вин 7
...
Рейтинг: 0 / 0
Управление формами
    #39298969
GVOV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Поиском нашёл способ заблокировать изменение окна Access с помошью АРI но то ли криво прицепил (к сожалению в АРI не разбираюсь) то ли сам способ кривоватый но вылезли побочные эффекты.
При запуске всё отлично. Форма стабильного размера и ведёт себя как и надо, минимизируется и восстанавливается как по кнопке минимизации так и по щелчку на панели задач. Но когда запустить Форму 2 то она почему то не максимизируется а опять таки принимает форму разрешения экрана. А когда её закрыть то у Формы 1 появляются проблемы с перемещением по экрану.
Соответственно задача почти решена но появилась нестабильность поведения форм в процессе пользования ими. Как стабилизовать эти две формы чтобы их открытие- закрытие и перемещение первой происходило без посторонних эффектов.
...
Рейтинг: 0 / 0
Управление формами
    #39299039
MrShin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GVOVВаше предложение не проходит из за того что в моём примере имеем дело не с окном формы а окном самого Accessa
Ну и где было упоминание того, что речь идет об окне Акцесса, а не о Форме 1?
Спрячьте окно Акцесса за формой 1. Я буквально на днях публиковал код для этого
...
Рейтинг: 0 / 0
Управление формами
    #39299049
GVOV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MrShinGVOVВаше предложение не проходит из за того что в моём примере имеем дело не с окном формы а окном самого Accessa
Ну и где было упоминание того, что речь идет об окне Акцесса, а не о Форме 1?
Спрячьте окно Акцесса за формой 1. Я буквально на днях публиковал код для этого

Об окне Акцесса было упоминание в первом посте.
Прятать за формой 1 неплохая идея, надо бы попробовать, будут ли побочные эффекты.
А в какой теме код, не подскажите?
...
Рейтинг: 0 / 0
Управление формами
    #39299050
GVOV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Но как будет с минимизациями на панель задач если окно будет спрятано?
...
Рейтинг: 0 / 0
Управление формами
    #39299063
MrShin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GVOVА в какой теме код, не подскажите?
Сорри, это я не здесь публиковал. Вот сам код, только объявления API функций отсутствуют, долго было вычленять их из общего списка объявлений. Приложил полный список объявлений для 64 битной версии, может пригодиться. Легко преобразовать в 32-х разрядную форму. Если не справитесь, выдерну эти несколько функций завтра.

Минимизации-максимизации также обрабатываются.

Private Sub Form_Resize()
'main form
'Let us know when Form is Maximized...

If CBool(IsZoomed(Me.hwnd)) = True Then
funSetAccessWindow (SW_SHOWMAXIMIZED)
DoCmd.Maximize
Me.TimerInterval = 0
ElseIf CBool(IsIconic(Me.hwnd)) = True Then
funSetAccessWindow (SW_SHOWMINIMIZED)
Me.TimerInterval = 0
Else
'enable constant size sync
Me.TimerInterval = 100
SyncMainWindowSize Me, True
End If
End Sub

Private Sub Form_Timer()
SyncMainWindowSize Me
End Sub

Public Function SyncMainWindowSize(frm As Form, Optional blnForce As Boolean = False)
Dim rctForm As RECT
Dim iRtn As Integer
Dim blnMoved As Boolean

Static x As Integer
Static y As Integer
Static cx As Integer
Static cy As Integer

#If VBA7 And Win64 Then
Dim hWndAccess As LongPtr
#Else
Dim hWndAccess As Long
#End If

If GetWindowRect(frm.hwnd, rctForm) Then
If x <> rctForm.Left Then
x = rctForm.Left
blnMoved = True
End If

If y <> rctForm.Top Then
y = rctForm.Top
blnMoved = True
End If
If cx <> rctForm.Right - rctForm.Left Then
cx = rctForm.Right - rctForm.Left
blnMoved = True
End If
If cy <> rctForm.Bottom - rctForm.Top Then
cy = rctForm.Bottom - rctForm.Top
blnMoved = True
End If

If blnMoved Or blnForce Then
'move/resize main window
hWndAccess = Application.hWndAccessApp
iRtn = apiShowWindow(hWndAccess, WM_SW_RESTORE)
Call SetWindowPos(hWndAccess, 0, x, y, cx, cy, WM_SWP_NOZORDER Or WM_SWP_SHOWWINDOW)
End If
End If
End Function

Function funSetAccessWindow(nCmdShow As Long)
'Usage Examples
'Maximize window:
' ?funSetAccessWindow(SW_SHOWMAXIMIZED)
'Minimize window:
' ?funSetAccessWindow(SW_SHOWMINIMIZED)
'Hide window:
' ?funSetAccessWindow(SW_HIDE)
'Normal window:
' ?funfSetAccessWindow(SW_SHOWNORMAL)
Dim loX As Long
On Error GoTo ErrorHandler

loX = apiShowWindow(hWndAccessApp, nCmdShow)
funSetAccessWindow = (loX <> 0)
End Function
...
Рейтинг: 0 / 0
Управление формами
    #39299064
MrShin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот так покрасивее будет:

Код: vbnet
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.
Private Sub Form_Resize()
'main form
'Let us know when Form is Maximized...

If CBool(IsZoomed(Me.hwnd)) = True Then
    funSetAccessWindow (SW_SHOWMAXIMIZED)
    DoCmd.Maximize
    Me.TimerInterval = 0
ElseIf CBool(IsIconic(Me.hwnd)) = True Then
    funSetAccessWindow (SW_SHOWMINIMIZED)
    Me.TimerInterval = 0
Else
    'enable constant size sync
    Me.TimerInterval = 100
    SyncMainWindowSize Me, True
End If
End Sub

Private Sub Form_Timer()
SyncMainWindowSize Me
End Sub

Public Function SyncMainWindowSize(frm As Form, Optional blnForce As Boolean = False)
Dim rctForm As RECT
Dim iRtn As Integer
Dim blnMoved As Boolean

Static x As Integer
Static y As Integer
Static cx As Integer
Static cy As Integer

#If VBA7 And Win64 Then
    Dim hWndAccess As LongPtr
#Else
    Dim hWndAccess As Long
#End If

If GetWindowRect(frm.hwnd, rctForm) Then
    If x <> rctForm.Left Then
        x = rctForm.Left
        blnMoved = True
    End If

    If y <> rctForm.Top Then
        y = rctForm.Top
        blnMoved = True
    End If
    If cx <> rctForm.Right - rctForm.Left Then
        cx = rctForm.Right - rctForm.Left
        blnMoved = True
    End If
    If cy <> rctForm.Bottom - rctForm.Top Then
        cy = rctForm.Bottom - rctForm.Top
        blnMoved = True
    End If

    If blnMoved Or blnForce Then
        'move/resize main window
        hWndAccess = Application.hWndAccessApp
        iRtn = apiShowWindow(hWndAccess, WM_SW_RESTORE)
        Call SetWindowPos(hWndAccess, 0, x, y, cx, cy, WM_SWP_NOZORDER Or WM_SWP_SHOWWINDOW)
    End If
End If
End Function

Function funSetAccessWindow(nCmdShow As Long)
'Usage Examples
'Maximize window:
'       ?funSetAccessWindow(SW_SHOWMAXIMIZED)
'Minimize window:
'       ?funSetAccessWindow(SW_SHOWMINIMIZED)
'Hide window:
'       ?funSetAccessWindow(SW_HIDE)
'Normal window:
'       ?funfSetAccessWindow(SW_SHOWNORMAL)
    Dim loX  As Long
    On Error GoTo ErrorHandler

    loX = apiShowWindow(hWndAccessApp, nCmdShow)
    funSetAccessWindow = (loX <> 0)
End Function


...
Рейтинг: 0 / 0
Управление формами
    #39299066
GVOV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо. Действительно так понятнее.
Обьявлять API я не умею, но думаю, что с помощью поиска разберусь.
Результат, если что получится, покажу.
...
Рейтинг: 0 / 0
Управление формами
    #39299257
GVOV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пробовал осилить API. С трудом объявил все функции и запустил предложенный код, но наверное у меня не достаточно знаний так как при запуске приложения остаётся только на панели кнопка Access и больше ни чего (окно скрывается но и формы не видно).

Попробую более точно сформулировать что хочется получить:
1. При запуске выводится форма 1 фиксированного размера с кнопкой минимизации. Свободно перемещается по экрану.
2. По нажатии кнопки минимизации формы или щелчке на панели задач она сворачивается на панель задач и по щелчку разворачивается.
3. Запускаем форму 2. Она разворачивается на весь экран и так же при щелчке на панели задач она сворачивается на панель задач и по щелчку разворачивается.
4. При закрытии формы 2 остаётся форма 1 со свойствами описанными пункте 1.

Помогите, если не трудно, кто в этом лучше разбирается.
...
Рейтинг: 0 / 0
Управление формами
    #39299301
MrShin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня в Form_Open стоит максимизация формы, для начала это добавьте, если заработает, то вместо максимизации поставьте разворачивание в оконном режиме и установку необходимого размера/положения. В помощь примеры работы с окнами "Window Manipulation Examples" с сайта http://www.peterssoftware.com/ Там много других интересных примеров.
...
Рейтинг: 0 / 0
Управление формами
    #39299321
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GVOV, потестируй. У меня вроде работает на 2003 2007 как ты просил.
...
Рейтинг: 0 / 0
Управление формами
    #39299358
GVOV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ПанургGVOV, потестируй. У меня вроде работает на 2003 2007 как ты просил.
Всё почти так как хотелось за исключением того что формы запускаются в режиме диалогового окна и убрать с экрана их можно только минимизировав (согласен это как и просилось) но перключится в другую програму с помощью панели задач или Alt+Tab не получается, форма всё равно висит сверху. А если убрать диалоговый режим, форма пропадает (то же что было и у меня при экспериментах).
Это можно как то решить оставив этот механизм скрытия окна?
...
Рейтинг: 0 / 0
Управление формами
    #39299359
GVOV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MrShinУ меня в Form_Open стоит максимизация формы, для начала это добавьте, если заработает, то вместо максимизации поставьте разворачивание в оконном режиме и установку необходимого размера/положения. В помощь примеры работы с окнами "Window Manipulation Examples" с сайта http://www.peterssoftware.com/ Там много других интересных примеров.

Спасибо за ссылку, действительно пример работы с окном Аксеса очень познавательный. Буду изучать.
...
Рейтинг: 0 / 0
Управление формами
    #39299362
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GVOVА если убрать диалоговый режим, форма пропадает (то же что было и у меня при экспериментах).На, сделал чтобы перемещалось в Z-последовательности
...
Рейтинг: 0 / 0
Управление формами
    #39299365
GVOV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ПанургGVOVА если убрать диалоговый режим, форма пропадает (то же что было и у меня при экспериментах).На, сделал чтобы перемещалось в Z-последовательности

О, вот это то что надо. Спасисбо!
...
Рейтинг: 0 / 0
Управление формами
    #39301273
GVOV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Продолжаю тестировать управление.
Добавились задачи:
1. Форма 2 имеет интерфейс разработанный под мониторы 800*600 (для совместимости с старыми компьютерами). При разворачивании будет применятся ресайзинг, но для проверки работы в минимальном (оригинальном) разрешении нужна возможность восстановления формы до 800*600.
2. Из формы 2 должны запускаться диалоговые формы.
3. Из формы 2 должны запускаться отчёты для просмотра, в диалоговом режиме развёрнутые на весь экран с возможностью только закрытия.

Проблемы в их решении:
1. Функцию реализовал, подкорректировав код открытия формы. Форма при восстановлении принимает нужный размер но вот восстанавливается она не по центру экрана. Как заставить её восстанавливаться по центру. При скрытом окне Аксеса я так понимаю что свойства формы "По центру" не работают и положение нужно высчитывать программно?
2. Функцию реализовал но проблема такая же как и в предыдущей задаче.
3. Запускаю отчёт и потом разворачиваю его. Получается нормально, но проблема в том что убрать кнопки размера окна безболезненно не получается. Если их убираю, оставляя саму кнопку закрытия то отчёт начинает запускаться на всю рабочую область экрана перекрывая панель задач а это неудобно. Если оставить одну только кнопку развёртывания то при сворачивании (которое и само по себе в принципе не желательно) отчёт часто восстанавливается в верхнем угле.

Программу прилагаю. Если кто может, помогите решить проблемные вопросы.
...
Рейтинг: 0 / 0
25 сообщений из 121, страница 1 из 5
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Управление формами
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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