powered by simpleCommunicator - 2.0.54     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Позиционирование у контрола формы
44 сообщений из 44, показаны все 2 страниц
Позиционирование у контрола формы
    #38818767
getfocus1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Для позиционирования автономной формы около контролов уже открытой табличной формы, используется апи-функция GetFocus (Private Declare Function GetFocus Lib "User32" () As Long). По задаче координаты контрола должны вычисляться на события получения фокуса контролом. Но не вычисляются, вернее неверно вычисляются и все контролы формы (текстбоксы , комбо) имеют один и тот же hwnd. Подскажите, как найти hwnd контролов формы при получении ими фокуса?
Что интересно, если поставить GetFocus на событие Change и вручную, именно вручную внести данные в поле, то hwnd вычисляется правильно.
Как обойти этот затык? Где-то прочитал, что в каком-то календарике эта задача решена. Но не могу найти топик с решением.
...
Рейтинг: 0 / 0
Позиционирование у контрола формы
    #38818828
guest_rusimport
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
getfocus1,
возможно вы имели ввиду это ? :)
http://am.rusimport.ru/msaccess/topic.aspx?ID=356&find=??????
...
Рейтинг: 0 / 0
Позиционирование у контрола формы
    #38818902
getfocus1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, guest_rusimport. Этот календарь я видел. Тот же гетфокус. Те же сны (с)

Ну, вот посмотрите. Сделал примерчик с табл.Сотрудники из борея. Если ходить по полям, то HWND не меняется. Если в любом поле поменять хоть что-то, то немедленно иной hwnd.

Может у меня глаза застило, может вы увидите где я ошибаюсь.
...
Рейтинг: 0 / 0
Позиционирование у контрола формы
    #38818905
getfocus1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не прикрепляется файлик. Попробую еще раз
...
Рейтинг: 0 / 0
Позиционирование у контрола формы
    #38818933
Фотография nord-woolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
getfocus1... Но не вычисляются, вернее неверно вычисляются ...
Я пользую алгоритм из календарика.
Все вычисляется/позиционируется правильно.

У Вас точно неверно вычисляется?
Или может неверно позиционируется форма?
...
Рейтинг: 0 / 0
Позиционирование у контрола формы
    #38818940
getfocus1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Покажу на примере. Та же форма, что и прежде. Но на полях Фамилия и Имя в событиях SetFocus и Change вызывается форма, которая должна встать чуть ниже активного контрола. На Change все встает правильно. А на SetFocus форма совсем в другом месте. В отладке выяснил, что это из-за неверного вычисления HWND функцией GetFocus. Вот и прошу совета как заставить GetFocus показывать правильное значение. Или пойти другим путем, но каким?
...
Рейтинг: 0 / 0
Позиционирование у контрола формы
    #38818964
guest_rusimport
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
getfocus1,
ну, если вам надо отслеживать событие получение фокуса, то можно так :)
...
Рейтинг: 0 / 0
Позиционирование у контрола формы
    #38819249
getfocus1,

откуда взялись предположения, что элементы управления на акцессовской форме оконные, что окон много, HWND неизменны и т. д.? Возьмите Spy++ или аналог (WinSight32 и т. п.) для начала и посмотрите, из чего состоит форма.

Насчёт других путей: возьмите Inspect , и если информация, им выдаваемая, (п)окажется полезной, подключите к проекту библиотеку Microsoft Office xx.x Object Library и используйте скрытый в ней интерфейс IAccessible для получения доступа к этой информации.
...
Рейтинг: 0 / 0
Позиционирование у контрола формы
    #38819300
getfocus1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, guest_rusimport! Хотелось бы обойтись без таймера, но видимо не получится.
Но есть один неприятный момент. Если щелкнуть на пересечении записей (курсор при этом превращается в светлый крестик), то ситуация опять прежняя. Смотрите рисунок. Есть ли выход?
...
Рейтинг: 0 / 0
Позиционирование у контрола формы
    #38819305
getfocus1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
13-й квартал, желательно обойтись встроенными средствами Access. Из дополнительных только апи.
...
Рейтинг: 0 / 0
Позиционирование у контрола формы
    #38819384
getfocus1,

утилиты полезны для понимания ситуации вами, как разработчиком. Их не нужно распространять на клиентские машины.

Библиотека типов ставится с Офисом, и является "встроенным средством Access". Или вы CommandBar тоже не будете использовать на основании того, что он описан в Офисной библиотеке?
...
Рейтинг: 0 / 0
Позиционирование у контрола формы
    #38819389
getfocus1Для позиционирования автономной формы около контролов уже открытой табличной формы ИМХО, событие GotFocus возникает ПЕРЕД получением фокуса полем.
У вас что, автономная форма все время открыта и бегает по экрану следом за фокусом? Объясните вашу стратегию. Назначение формы?
Кстати, календарик обычно открывается при нажатии на кнопочку или двойным щелком по полю. В этот момент элемент, по которому щелкаете, точно имеет фокус.
...
Рейтинг: 0 / 0
Позиционирование у контрола формы
    #38819401
getfocus1,

кстати, Microsoft Active Accessibility - часть ОС, и доступ к ней как раз через API, просто библиотека типов сильно упрощает обращение к объектно-ориентированной части этого API.
...
Рейтинг: 0 / 0
Позиционирование у контрола формы
    #38819457
getfocus1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
13-й кварталИли вы CommandBar тоже не будете использовать на основании того, что он описан в Офисной библиотеке?
Использование меню и контекстных меню не предполагается. Но спасибо за направление в отладке


Анатолий ( Киев )ИМХО, событие GotFocus возникает ПЕРЕД получением фокуса полем. Понял. Но тогда странно, что DoEvents, записанный после получения фокуса не исправляет ситуацию. Или я неправильно понимаю действие DoEvents?

Анатолий ( Киев )У вас что, автономная форма все время открыта и бегает по экрану следом за фокусом? Объясните вашу стратегию. Назначение формы?Это пожелание заказчика иметь интерфейс для связанных списков в табличной форме. Единственный контрол в ней это комбо, роусоурс которого меняется в зависимости от значений других полей в записи.
...
Рейтинг: 0 / 0
Позиционирование у контрола формы
    #38819545
П-Л
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
getfocus1Анатолий ( Киев )У вас что, автономная форма все время открыта и бегает по экрану следом за фокусом? Объясните вашу стратегию. Назначение формы?Это пожелание заказчика иметь интерфейс для связанных списков в табличной форме. Единственный контрол в ней это комбо, роусоурс которого меняется в зависимости от значений других полей в записи.
Из табличной формы одним кликом попадаем в форму-карточку, в которой связанные списки программируются без проблем. Потом, тоже одним кликом - обратно. Или остаемся в карточке и в ней переходим на следующую запись, пока не захочется вернуться в табличную. Т.е. не соблюдая букву пожелания, вы соблюдаете его дух, не ухудшаете эргономику, делаете реализацию в разы быстрее штатными фичами. Вменяемому заказчику это легко обосновывается.
...
Рейтинг: 0 / 0
Позиционирование у контрола формы
    #38819586
Фотография nord-woolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может попробовать посчитать с помощью SetCursorPos?
...
Рейтинг: 0 / 0
Позиционирование у контрола формы
    #38819635
\\\\
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
getfocus1, на вот 15165216 , у qwerty112 срисуй. Там, по моему, это между делом решено.
...
Рейтинг: 0 / 0
Позиционирование у контрола формы
    #38819642
getfocus1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
П-ЛИз табличной формы одним кликом попадаем в форму-карточку, в которой связанные списки программируются без проблем. Потом, тоже одним кликом - обратно. Или остаемся в карточке и в ней переходим на следующую запись, пока не захочется вернуться в табличную. Т.е. не соблюдая букву пожелания, вы соблюдаете его дух, не ухудшаете эргономику, делаете реализацию в разы быстрее штатными фичами. Вменяемому заказчику это легко обосновывается.Этот вариант рассматривался. Но было признано, что при большом объеме ввода нежелательно лишний раз прибегать к мышке (или клавиатурному сочетанию для перехода) и перемещать внимание оператора на другую часть формы. Разве не так?
В принципе и показ доп.формы на получении фокуса не столь обязателен, поскольку оператор начинает набирать текст и срабатывает Change, правильно фиксирующий доп.форму. Но как бы для порядка надо. :)
...
Рейтинг: 0 / 0
Позиционирование у контрола формы
    #38819655
getfocus1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
nord-woolfМожет попробовать посчитать с помощью SetCursorPos?То, что я находил, тоже не слишком надежно срабатывало. Или я неверно применял. :)
Может быть у вас есть хорошая ссылка? Был бы благодарен.
...
Рейтинг: 0 / 0
Позиционирование у контрола формы
    #38819660
getfocus1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
\\\\getfocus1, на вот 15165216 , у qwerty112 срисуй. Там, по моему, это между делом решено.А что там по ссылке есть? Только простые и ленточная форма. Табличной нет. А с простой и ленточной формами проблем нет.
...
Рейтинг: 0 / 0
Позиционирование у контрола формы
    #38819662
Фотография nord-woolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не, я не пробовал.
Подозреваю, при вызове на GotFocus возможен аналогичный эффект,
но так, на всякий случай...
...
Рейтинг: 0 / 0
Позиционирование у контрола формы
    #38819696
\\\\
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
getfocus1\\\\getfocus1, на вот 15165216 , у qwerty112 срисуй. Там, по моему, это между делом решено.А что там по ссылке есть? Только простые и ленточная форма. Табличной нет. А с простой и ленточной формами проблем нет.Так ты читать не умеешь!?
qwerty112примерчик
смотреть форму Q в режиме ленточной или таб .формы
...
Рейтинг: 0 / 0
Позиционирование у контрола формы
    #38819807
guest_rusimport
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
getfocus1Спасибо, guest_rusimport! Хотелось бы обойтись без таймера, но видимо не получится.
Но есть один неприятный момент. Если щелкнуть на пересечении записей (курсор при этом превращается в светлый крестик), то ситуация опять прежняя. Смотрите рисунок. Есть ли выход?
извиняй - работа ... выход всегда должен быть :)
...
Рейтинг: 0 / 0
Позиционирование у контрола формы
    #38820047
getfocus1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
guest_rusimport, очередное спасибо!
Но не осознал, что изменилось и где. Ткните носом, пожалуйста.
...
Рейтинг: 0 / 0
Позиционирование у контрола формы
    #38820048
getfocus1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
\\\\, это я увидел в ленточной и не понравилось. Не подойдет. Но спасибо.
...
Рейтинг: 0 / 0
Позиционирование у контрола формы
    #38820215
guest_rusimport
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
getfocus1guest_rusimport, очередное спасибо!
Но не осознал, что изменилось и где. Ткните носом, пожалуйста.
Что? Что-то не работает?
...
Рейтинг: 0 / 0
Позиционирование у контрола формы
    #38820261
getfocus1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
guest_rusimportgetfocus1guest_rusimport, очередное спасибо!
Но не осознал, что изменилось и где. Ткните носом, пожалуйста.
Что? Что-то не работает?
Нет. Все замечательно работает. Но я не вижу где и что Вы изменили (по сравнению с предыдущим вариантом), чтобы добиться правильного результата.
...
Рейтинг: 0 / 0
Позиционирование у контрола формы
    #38820316
guest_rusimport
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
getfocus1guest_rusimportпропущено...

Что? Что-то не работает?
Нет. Все замечательно работает. Но я не вижу где и что Вы изменили (по сравнению с предыдущим вариантом), чтобы добиться правильного результата.
ну, дык форма frmPos :)
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Private Sub Form_Open(Cancel As Integer)
    On Error GoTo errEnd
    Call SubClassHookForm("open")
    If Forms.Count > 1 Then
        'Перемещение формы к текущему элементу управления
        Set frm = Application.Screen.ActiveForm
        Set ctlData = Application.Screen.ActiveControl
        
        Dim ctlRect As RECT                 'Позиция контрола
        Dim frmDimensions As Dimensions     'Размеры формы
        Dim frmRect As RECT                 'Позиция формы
        Dim scrDimensions As Dimensions     'Размеры (разрешение) экрана

        'Определяем позицию текущего контрола
 Application.Screen.ActiveControl.SetFocus
        GetWindowRect GetFocus(), ctlRect
.........
...
Рейтинг: 0 / 0
Позиционирование у контрола формы
    #38820385
getfocus1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть, усвоил. Спасибо.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Позиционирование у контрола формы
    #39370939
NVT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поднимаю топик...

Переделываю пример под себя и обнаружил, что при открытии формы (которая у поля открывается) в поле списка нет фокуса. Т.е. без мышки ввести/изменить значение поля не получится, а надо. Привык я писать так, что бы можно было работать без мышки.

Вопрос: как поставить фокус в поле со списком?
...
Рейтинг: 0 / 0
Позиционирование у контрола формы
    #39371016
NVT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и в догонку, если форму открывать не модально, то окно открывается ниже нужного места. При этом в функцию SetWindowPos координаты передаются одинаковые, что при модальном открытии, что без.

Как бы это пофиксить?
...
Рейтинг: 0 / 0
Позиционирование у контрола формы
    #39371049
Фотография Лапух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NVT... как поставить фокус в поле со списком?...
Если правильно понял, то делаю так.

Me.[ИмяЭлементаУправления].SetFocus

или

DoCmd.GoToControl "ИмяЭлементаУправления"
...
Рейтинг: 0 / 0
Позиционирование у контрола формы
    #39371087
NVT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лапух, ну такие то простые вещи испробованы. Не пашет, к сожалению...

Вы сами попробуйте...
...
Рейтинг: 0 / 0
Позиционирование у контрола формы
    #39371094
MrShin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NVTпростые вещи испробованы. Не пашет, к сожалению
Сорри, не разбирался с предыдущими постами, но если SetFocus не работает, то это означает практически наверняка, что после этого фокус меняется чем-то другим. Проследите по событиям с помощью Debug.Print, где это происходит. Иногда можно увидеть очень интересные пути прохождения событий
...
Рейтинг: 0 / 0
Позиционирование у контрола формы
    #39371097
NVT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MrShin,

фокус стоит в поле из которого вызывалось (к которому подвязывалась форма), а вот как его переставить... Это вопрос.
...
Рейтинг: 0 / 0
Позиционирование у контрола формы
    #39371106
Фотография Лапух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MrShin...Сорри, не разбирался с предыдущими постами,...
А я так и ва-а-аще их не смотрел.
Ляпнул, что первое в голову пришло.
...
Рейтинг: 0 / 0
Позиционирование у контрола формы
    #39371116
NVT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Решил!
Что бы фокус стоял в поле надо вызывать SetWindowPos с другими параметрами, а именно.


SetWindowPos Me.hwnd, True, frmRect.left, frmRect.top, frmDimensions.Width, frmDimensions.Height, SWP_NOZORDER Or SWP_SHOWWINDOW Or SWP_NOSIZE

где:
Private Const SWP_NOSIZE = &H1 ' Don't alter the size
Private Const SWP_NOZORDER = &H4 ' Don't change the Z-order
Private Const SWP_SHOWWINDOW = &H40 ' Display the window
...
Рейтинг: 0 / 0
Позиционирование у контрола формы
    #39371362
guest_rusimport
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
NVT,
тут в примере 16920668 изначально "накладка" произошла
константа SWP_SHOWWINDOW была объявлена как -

Const SWP_SHOWWINDOW = &H4

а на самом деле надо было как -

Const SWP_SHOWWINDOW = &H40

тогда бы и с курсором и фокусом было бы всё в порядке :)
...
Рейтинг: 0 / 0
Позиционирование у контрола формы
    #39371506
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NVT, всё гораздо проще. Подсказали как в этом сообщении . Точнее надо воспользоваться недокументированным методом accLocation . С помощью него можно получить координаты контрола/формы в пикселях (в табличной форме есть свои нюансы)

NVT
Код: vbnet
1.
SetWindowPos Me.hwnd, True, frmRect.left, frmRect.top, frmDimensions.Width, frmDimensions.Height, SWP_NOZORDER Or SWP_SHOWWINDOW Or SWP_NOSIZE

Второй аргумент данной функции API не такой! Там тоже используются константы.
Код: vbnet
1.
2.
3.
Const HWND_TOP = 0
Const HWND_TOPMOST = -1
Const HWND_NOTOPMOST = -2
...
Рейтинг: 0 / 0
Позиционирование у контрола формы
    #39371507
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Upd. в функции SetWindowPos если используется SWP_NOSIZE размеры можно не передавать.
...
Рейтинг: 0 / 0
Позиционирование у контрола формы
    #39371621
NVT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
guest_rusimport, спасибо за ответ. Есть еще вопрос.

А как быть с тем, что форма открывается в другом месте (сдвинута вниз) если её открывать не как acDialog? В чем может быть трабл?
...
Рейтинг: 0 / 0
Позиционирование у контрола формы
    #39371652
guest_rusimport
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
NVTguest_rusimport, спасибо за ответ. Есть еще вопрос.

А как быть с тем, что форма открывается в другом месте (сдвинута вниз) если её открывать не как acDialog? В чем может быть трабл?
я лучше на скрине покажу , что надо учитывать , если форма открывается не как acDialog
...
Рейтинг: 0 / 0
Позиционирование у контрола формы
    #39371679
NVT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
guest_rusimport, это понятно )) А как это учесть?
...
Рейтинг: 0 / 0
Позиционирование у контрола формы
    #39371771
guest_rusimport
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
NVTguest_rusimport, это понятно )) А как это учесть?
можно учесть , используя WinAPI функции (какие ? - см. ссылку)
http://netcode.ru/cpp/?click=r-2481.php.htm
...
Рейтинг: 0 / 0
44 сообщений из 44, показаны все 2 страниц
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Позиционирование у контрола формы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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