powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Получение фокуса и координаты поля
22 сообщений из 47, страница 2 из 2
Получение фокуса и координаты поля
    #32765204
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автордаже А. Козин через доп. поле предлагает...

слово даже не уместно в контексте
т.к. считаю сергея гаврилова более квалифицированым спецом ...

по теме разберусь детальнее как тока будет немного времени
наверняка ерунда какая - нить
...
Рейтинг: 0 / 0
Получение фокуса и координаты поля
    #32765230
Фотография Serge Gavrilov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяТабом не пробовал - не используют.

похоже это не решенная проблема....

в лоб не решается

даже А. Козин через доп. поле предлагает...

Текстбок это не совсем настоящее окно, он имеет hwnd, только тогда, когда получает фокус. Видимо при щелчке мыши событие получения фокуса возникает до того, когда поле действительно получает фокус и имеет hwnd, который возвращает GetFocus.
Это легко проверить. Действительно, при щелчке мыши на поле GetFocus возвращает hwnd формы (при переходе по Tab - hwnd текстбокса).
В общем случае это легко обойти с помощью таймера
Допустим на событие получения фокуса Text0 вешаем процедурку

Private Sub Text0_GotFocus()
Debug.Print "Text0_GotFocus", GetFocus()
Me.TimerInterval = 10
End Sub

А на таймер
Private Sub Form_Timer()
Debug.Print "Form_Timer", Me.ActiveControl.name, GetFocus()
Me.TimerInterval = 0
End Sub

Text0 - первый контрол и получает фокус при открытии

При открытии формы имеем

Text0_GotFocus 1771832
Form_Timer Text0 91752644 - правильный hwnd

При последующем получении фокуса щелчком мыши:
Text0_GotFocus 8390862 - hwnd формы
Form_Timer Text0 91752644 - правильный hwnd
...
Рейтинг: 0 / 0
Получение фокуса и координаты поля
    #32765238
Фотография Serge Gavrilov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АлексейК автордаже А. Козин через доп. поле предлагает...

слово даже не уместно в контексте
т.к. считаю сергея гаврилова более квалифицированым спецом ...


Спасибо, Алексей. Хотел бы соответствовать :)
...
Рейтинг: 0 / 0
Получение фокуса и координаты поля
    #32765304
Витал
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не посоветуете ли заодно, как скрывать календарь, если пользователь передумал по нему кликать и просто перешел на другой контрол (у меня на форме обычный контрол - календарь). На событие потери фокуса самим календарем не удается повесить код - кричит - нельзя скрыть активный контрол....
...
Рейтинг: 0 / 0
Получение фокуса и координаты поля
    #32765342
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мужики! специалисты вы все классные.

поэтому и спрашиваю.

через таймер - это на данный момент лучшее предложение.
мне оно больше нравится, чем доп. поле.

но в идеале хотелось бы конечно как-нибудь более правильнеееее, не через что-то.
...
Рейтинг: 0 / 0
Получение фокуса и координаты поля
    #32765441
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не шибко вчитываясь и вдумываясь, целиком и полностью
присоединяюсь к мнению Саныча, о том, что что знания Left и Top
должно быть достаточно.

в коде значения возвращаются в твипах.
их значения надо пересчитать в пиксели, чтобы использовать вместе с апи-функциями.

У Гетса описан в исходных кодах класс AccessInfo ,
в котором есть "все необходимое".
...
Рейтинг: 0 / 0
Получение фокуса и координаты поля
    #32765444
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторНе посоветуете ли заодно, как скрывать календарь, если пользователь передумал по нему кликать и просто перешел на другой контрол (у меня на форме обычный контрол - календарь). На событие потери фокуса самим календарем не удается повесить код - кричит - нельзя скрыть активный контрол....

видимо совсем старенькая версия у тебя
последний называется datepikerv33.mdb

в ней есть код закрывающий календарь при клике вне календаря + всякой красоты немеряно
...
Рейтинг: 0 / 0
Получение фокуса и координаты поля
    #32765498
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2АлексейК
если не влом.
переделать datepikerv в модель "выбор даты в четыре клика"
слева на право
список годов текущий и +/- 4 в видны в списке - первый клик
список месяцев номер + назвние видны все - второй клик
дни - третий клик

четвертый клик - ок / кансел

чета в раскрывающихся списках долго искать когда часто работаешь с датами
а четвертый - по вкусу , иногда прмахиваешься кликая в день.
...
Рейтинг: 0 / 0
Получение фокуса и координаты поля
    #32765621
Фотография Serge Gavrilov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Victoshaне шибко вчитываясь и вдумываясь, целиком и полностью
присоединяюсь к мнению Саныча, о том, что что знания Left и Top
должно быть достаточно.
Чем-то напомнило всенародное осуждение Солженицина, в 70-е:
"Я этого ... не читал, но целиком и полностью поддерживаю партиию ..."
...
Рейтинг: 0 / 0
Получение фокуса и координаты поля
    #32765695
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор Хотел бы соответствовать :)



Подтвеждаю - соответствуешь!!!

идея с таймером прокатывает как нада. эффект такой как и хотелось.
на 99% устраивает.

спасибо!!!

(у меня , не скромно конечно, мысль насчет таймера мелькала, но видимо не стока опыта, чтоб проявиться в действии)
...
Рейтинг: 0 / 0
Получение фокуса и координаты поля
    #32767185
Витал
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АлексейКвидимо совсем старенькая версия у тебя
последний называется datepikerv33.mdb

в ней есть код закрывающий календарь при клике вне календаря + всякой красоты немеряно

Дык и подсказал бы идею реализации (достаточно только про клик вне календаря, а красоты немерянные нам без надобности). А левые контролы юзать влом, да и нефиг баловать юзеров красотами природы - индо работать перестанут - медитировать начнут...
...
Рейтинг: 0 / 0
Получение фокуса и координаты поля
    #32767192
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если нужно простое решение, но без возможности
редактирования даты вручную - ставь календарь на событие клик
...
Рейтинг: 0 / 0
Получение фокуса и координаты поля
    #32767206
Витал
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АлексейКесли нужно простое решение, но без возможности
редактирования даты вручную - ставь календарь на событие клик

Елы-палы! Ставить не проблема! Проблема скрывать (Visible = False). Пока все поля формы на событие получение фокуса у меня имеют ссылку на функцию, скрывающую календарь. Но хотелось бы без дополнительных заморочек.
...
Рейтинг: 0 / 0
Получение фокуса и координаты поля
    #32767232
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Виктор Сенин старался, делал. (кстати его что то давно не видно)
по этому поводу и сделали версию datepikerv 33 .mdb

попробуй сначала? в этой версии при клике вне области календаря
календарь закрывается сам - не надо никакого кода!
...
Рейтинг: 0 / 0
Получение фокуса и координаты поля
    #32767249
Витал
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей, блин! Я ж говорю мне не надо сторонних компонентов (фирменных/нефирменных) тем более для моей задачи. Если она не решается более простым способом, дык, мне и функции достаточно. :о)
...
Рейтинг: 0 / 0
Получение фокуса и координаты поля
    #32767250
Kelme
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я может и не до конца понял в чём трабл, но такой код вполне работает:

Private Sub Form_Timer()
If Screen.ActiveForm.Name <> Me.Name Then
DoCmd.Close acForm, Me.Name
End If
end sub

форма, типа календарь, pop-up, при клике мимо формы календарь закрывается.
...
Рейтинг: 0 / 0
Получение фокуса и координаты поля
    #32776434
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kelmeя может и не до конца понял в чём трабл, но такой код вполне работает:

Private Sub Form_Timer()
If Screen.ActiveForm.Name <> Me.Name Then
DoCmd.Close acForm, Me.Name
End If
end sub

форма, типа календарь, pop-up, при клике мимо формы календарь закрывается.

Код будет работать (даже проще было бы сделать на Потерю фокуса календарика), если бы не Модальные формы

2АлексейК
>>кстати его что то давно не видно

Привет! Я как сурок (?) из фильма "ДМБ" - его не видно, а он есть :)
...
Рейтинг: 0 / 0
Получение фокуса и координаты поля
    #32853392
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serge Gavrilov Victoshaне шибко вчитываясь и вдумываясь, целиком и полностью
присоединяюсь к мнению Саныча, о том, что что знания Left и Top
должно быть достаточно.
Чем-то напомнило всенародное осуждение Солженицина, в 70-е:
"Я этого ... не читал, но целиком и полностью поддерживаю партиию ..."

Вышеприведенное замечание расценил как «приглашение к просмотру».
Время выбралось только сейчас – пардон за задержку


Посмотрел. Вот наблюдения.

1) Про код вычисления координат окна.
Исходный вариант FormPlacement – без стеснения хорош.
Однако, вполне приемлемо по точности вычисления позиции заменяется на
(для Акцесс XP)
Код: plaintext
Me.Move mCallingForm.WindowLeft + mCallingControl.Left + xDelta + mCallingForm.CurrentSectionLeft, mCallingForm.WindowTop + mCallingControl.Top + yDelta + mCallingControl.Height + sectionTop
Где
Код: plaintext
1.
2.
sectionTop = mCallingForm.CurrentSectionTop
 xDelta = getXDeltaFormWidth(mCallingForm)
 yDelta = getYDeltaFormWidth(mCallingForm)

две последние функции вычисляют поправку на «толщину окна» код в файле.
Детали их реализации меня не вполне удовлетворили, но в целом, для «первичной оценки» - сгодится.

Так, что – не знаю что там про «партию», а Left и Top - достаточно

2) Про хуки, мыши и модальность.
Хук на мышь возник из-за модального запуска формы.
А зачем нужен модальный запуск при использовании на форме – я не понял,
потому в прикладываемом файле модальность, и «всплываемость» с формы
сняты.
Соответственно, исчезла потребность в мышином хуке и он заменен на
запуск «закрывающего таймера».

3) Про исходную проблему автора топика.
У нее два источника - первый – модальность запуска формы,
второй - установка на «хозяина» через объект Screen, который может не иметь ни «активного контрола», ни «активной формы» в процессе загрузки «хозяйской формы».

Выложенный вариант использует модифицированный метод
Friend Sub SetParent(tForm As Form)

Думаю, что умнее было бы в обычном модуле завести переменную для хранения формы хозяина и обвесить ее функциями чтения/записи.

В прикладываемом файле есть ленточная форма на таблице, которая демонстрирует работу «календаря» по входу в поле со значением Null.

PS
архив сжат программой 7-zip, (иначе не умещается в 70 кб.)
...
Рейтинг: 0 / 0
Получение фокуса и координаты поля
    #32853394
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на всякий случай (типа архив не откроется) - вот что там было в качестве
"2х фукций"

Код: 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.
Public Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long
Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, _
  ByVal hDC As Long) As Long
Declare Function GetDeviceCaps Lib "gdi32" (ByVal hDC As Long, _
  ByVal nIndex As Long) As Long


Function getYDeltaFormWidth(frm As Form) As Long
  'возвращает приращение y-координаты на ширину границы окна + ширина заголовка окна, если есть
  Const SM_CYBORDER As Long =  6 &
  Const SM_CYCAPTION As Long =  4 &
  Const SM_CYDLGFRAME As Long =  8 &
  Const SM_CYFIXEDFRAME As Long = SM_CYDLGFRAME
  Const SM_CYFRAME As Long =  33 &
  
  Const LOGPIXELSY =  90 &

  Dim YPIXELSPERINCH
  Dim hDC As Long, retVal As Long, hRes As Long
  
  hDC = GetDC( 0 )
  YPIXELSPERINCH = GetDeviceCaps(hDC, LOGPIXELSY)
  retVal = ReleaseDC( 0 , hDC)
  
  hRes = GetSystemMetrics(SM_CYCAPTION)
  
  Select Case frm.BorderStyle
    Case  0  ' нет границ
      retVal = GetSystemMetrics(SM_CYBORDER)
      hRes =  0 &
    Case  1  'тонкая
      retVal = GetSystemMetrics(SM_CYFIXEDFRAME)
    Case  2  'sizable
      retVal = GetSystemMetrics(SM_CYFRAME)
      retVal = retVal
    Case  3  ' окна диалога
      retVal = GetSystemMetrics(SM_CYDLGFRAME)
  End Select
   getYDeltaFormWidth = (CDec(retVal + hRes) / YPIXELSPERINCH) * TWIPSPERINCH
  
End Function

      
Function getXDeltaFormWidth(frm As Form) As Long
  'возвращает приращение х-координаты на ширину границы окна
  
  Const SM_CXBORDER As Long =  5 &
  Const SM_CXFRAME As Long =  32 & ' должно быть шириной для изменяемой границы окна
  Const SM_CXDLGFRAME As Long =  7 & ' должно быть шириной для диалогового окна
  Const SM_CXFIXEDFRAME As Long = SM_CXDLGFRAME ' ширина для тонкого окна?
  
  Const LOGPIXELSX As Long =  88 &
  
  Dim hDC As Long, retVal As Long
  Dim XPIXELSPERINCH
  
   hDC = GetDC( 0 )
   XPIXELSPERINCH = GetDeviceCaps(hDC, LOGPIXELSX)
  
   retVal = ReleaseDC( 0 , hDC)
   
  ' hRes = GetSystemMetrics(SM_CYCAPTION)
         
  Select Case frm.BorderStyle
    Case  0  ' нет границ
      retVal = GetSystemMetrics(SM_CXBORDER)
    Case  1  'тонкая
      retVal = GetSystemMetrics(SM_CXFIXEDFRAME)
    Case  2  'sizable
      retVal = GetSystemMetrics(SM_CXFRAME)
      retVal = retVal +  1 &
    Case  3  ' окна диалога
      retVal = GetSystemMetrics(SM_CXDLGFRAME)
  End Select
   getXDeltaFormWidth = (CDec(retVal) / XPIXELSPERINCH) * TWIPSPERINCH
End Function

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

вопрос предложенное решение годится для поля в ленточной подчиненной формы?
(к сожалению нет времени глубоко вникать в текст кода, ремонт......)
...
Рейтинг: 0 / 0
Получение фокуса и координаты поля
    #32854004
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадябольшой сенкс за проделанную работу.
буду еще читать, изучать.
на данный момент использую с таймером , но не везде идет.

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

Чтобы поправить на подчиненную - нужно подправить
getYDeltaFormWidth
в случае, если форма вложенная, то возвращать только ширину SM_CYBORDER

Чтобы заработало для всех вариантов (+ табличная форма/подформа)

надо подправить вычисление позиции для случая табличной формы.

выглядеть это может так

Код: 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.
'новый код вычисления координат окна с использованием Top и Left Контрола

 Dim xDelta As Long, yDelta As Long
 Dim lH As Long, lW As Long
 
 
 yDelta = getYDeltaFormWidth(mCallingForm)
 xDelta = getXDeltaFormWidth(mCallingForm)
 
 
 If mCallingForm.CurrentView =  1  Then ' вид простой или ленточной формы
   lH = mCallingControl.Height
   lH = lH + mCallingControl.Top
   lW = mCallingControl.Left
   
  ElseIf mCallingForm.CurrentView =  2  Then 'табличный вид
    If mCallingForm.RowHeight <  0  Then
      lH = mCallingForm.DefaultControl(acTextBox).Height
    Else
      lH = mCallingForm.RowHeight
    End If
   'вычисляем смещение по х
    lW = getSheetXPos()
  End If
  
  lH = mCallingForm.CurrentSectionTop + mCallingForm.WindowTop + yDelta + lH
  lW = xDelta + mCallingForm.CurrentSectionLeft + mCallingForm.WindowLeft + lW
  
 'вызов для А2000
  'DoCmd.MoveSize lW, lH
  Me.Move lW, lH
 
  Me.Visible = True
  
  pDeactReason = unkReason


самое малоприятное в этом деле - getSheetXPos()
что-то умного ничего не нашлось, и в результате , в недописанном,
недопонятом но, как будто - рабочем виде, это выглядит так

Код: 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.
Private Function getSheetXPos() As Long
  Dim lastCol As Long, iNdex As Long
  Dim xValue As Long, xBorder As Long
  Dim tControl
  On Error Resume Next
  xBorder = getXBorderWidth
  lastCol = mCallingControl.ColumnOrder
  
  For Each tControl In mCallingForm.Controls
    If tControl.ColumnOrder < lastCol Then
      If tControl.ColumnWidth <>  0  Then
        Select Case tControl.ColumnWidth
        Case Is >  0 
        xValue = xValue + tControl.ColumnWidth + xBorder
        Case - 1  'ширина по умолчанию (?)
        xValue = xValue + mCallingForm.DefaultControl(acTextBox).Width
        Case - 2  ' ширина по данным (?)
        'TO DO
        End Select
      End If
    End If
  Next
  If Err.Number <>  0  Then Err.Clear
  getSheetXPos = xValue
End Function

getXBorderWidth возвращяет (должна возвращять) "толщину сетки".
сейчас выглядит так

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Function getXBorderWidth() As Long
Const SM_CXBORDER As Long =  5 &
Const LOGPIXELSX As Long =  88 &
  
  Dim hDC As Long, retVal As Long
  Dim XPIXELSPERINCH
  
  hDC = GetDC( 0 )
  XPIXELSPERINCH = GetDeviceCaps(hDC, LOGPIXELSX)
  retVal = ReleaseDC( 0 , hDC)
  retVal = GetSystemMetrics(SM_CXBORDER)
  getXBorderWidth = (CDec(retVal) / XPIXELSPERINCH) * TWIPSPERINCH
  
End Function
...
Рейтинг: 0 / 0
Получение фокуса и координаты поля
    #32855741
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ещё больший сенкс....

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


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