powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Определить реакцию на нажатие клавиши когда элемент в фокусе
10 сообщений из 10, страница 1 из 1
Определить реакцию на нажатие клавиши когда элемент в фокусе
    #35772173
Tohan_ORA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день всем!

Необходимо реализовать реакцию на нажатие определенных клавиш,
когда курсор стоит в поле text_box

На данный момент есть следующий код в событии keypress формы.
Срабатывает независимо от нахождения фокуса в форме, а нужно как я описал выше.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
DO case
CASE LASTKEY()= 62 
  thisformset.func_move_contract( 1 ) 
case LASTKEY()= 60 
thisformset.func_move_contract(- 1 ) 
otherwise
 RETURN .f.
ENDCASE
...
Рейтинг: 0 / 0
Определить реакцию на нажатие клавиши когда элемент в фокусе
    #35772225
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tohan_ORAДобрый день всем!

Необходимо реализовать реакцию на нажатие определенных клавиш,
когда курсор стоит в поле text_box

На данный момент есть следующий код в событии keypress формы.
Срабатывает независимо от нахождения фокуса в форме, а нужно как я описал выше.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
DO case
CASE LASTKEY()= 62 
  thisformset.func_move_contract( 1 ) 
case LASTKEY()= 60 
thisformset.func_move_contract(- 1 ) 
otherwise
 RETURN .f.
ENDCASE



Попробуй так (для перехвата Shift + ">" и Shift + "<"):
KeyPress:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
LPARAMETERS nkeycode, nshiftaltctrl

LOCAL m.lcName
m.lcName = IIF(TYPE("THISFORM.ActiveControl") == "O", UPPER(THISFORM.ActiveControl.Name), "")

DO CASE
  CASE m.nkeycode= 62  AND m.nshiftaltctrl =  1  AND  m.lcName == "TXT_BOX"
    thisformset.func_move_contract( 1 ) 
    nodefault
  CASE m.nkeycode= 60   AND m.nshiftaltctrl =  1  AND m.lcName == "TXT_BOX"
     thisformset.func_move_contract(- 1 ) 
     nodefault
  OTHERWISE
    DODEFAULT(m.nkeycode, m.nshiftaltctrl)
ENDDO
С уважением, Алексей
P.S. Не забудь у формы установить KeyPreview = .T.
...
Рейтинг: 0 / 0
Определить реакцию на нажатие клавиши когда элемент в фокусе
    #35772283
BRROE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А почему не прописать код непосредственно в KeyPress этого text_box?

Если подразумевается, что на форме много таких "text_box" и в случае нахождения фокуса в любом из них нужно выполнять одно и тоже, то можно определить класс text_box в KeyPress которого и написать нужные действия. А потом их ложить на форму.

Сбивает с толку формулировка " когда курсор стоит в поле text_box"
Может это поле курсора с неудачным названием text_box в Грид?
:-)
...
Рейтинг: 0 / 0
Определить реакцию на нажатие клавиши когда элемент в фокусе
    #35772307
Tohan_ORA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Aleksey-K

Алексей, не получилось.
Вот код прописанный в событии keypress formset.myform
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
LPARAMETERS nKeyCode, nShiftAltCtrl

LOCAL m.lcName
m.lcName = IIF(TYPE("THISFORM.ActiveControl") == "O", UPPER(THISFORM.ActiveControl.Name), "")

DO CASE
  CASE m.nkeycode= 62  AND m.nshiftaltctrl =  1  AND  m.lcName == "text_contract"
    thisformset.func_move_contract( 1 ) 
    nodefault
  CASE m.nkeycode= 60   AND m.nshiftaltctrl =  1  AND m.lcName == "text_contract"
     thisformset.func_move_contract(- 1 ) 
     nodefault
  OTHERWISE
    DODEFAULT(m.nkeycode, m.nshiftaltctrl)
ENDcase
В Init myform
Код: plaintext
KeyPreview = .T.
text_contract-это не поле гида это text_box
При нахождении в отладчике вижу что возращают:
Код: plaintext
1.
m.nkeycode= 54 
m.lcName=''
...
Рейтинг: 0 / 0
Определить реакцию на нажатие клавиши когда элемент в фокусе
    #35772373
Tohan_ORA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Поправил на
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
LPARAMETERS nKeyCode, nShiftAltCtrl

LOCAL m.lcName
m.lcName = IIF(TYPE("THISFORM.ActiveControl") == "O", UPPER(THISFORM.ActiveControl.Name), "")

DO CASE
  CASE m.nkeycode= 62  AND m.nshiftaltctrl =  1  AND  m.lcName == "text_contract"
    thisformset.func_move_contract( 1 ) 
    nodefault
  CASE m.nkeycode= 60   AND m.nshiftaltctrl =  1  AND m.lcName == "text_contract"
     thisformset.func_move_contract(- 1 ) 
     nodefault
  OTHERWISE
    DODEFAULT(m.nkeycode, m.nshiftaltctrl)
ENDcase
Осталась проблема с
Код: plaintext
m.lcName=''
и добавилась новая при нахождении в гриде формы при нажатии на стрелки ВВЕРХ или ВНИЗ-курсор стал прыгать по контролам, вместо перемещения по гриду как раньше. :-(
...
Рейтинг: 0 / 0
Определить реакцию на нажатие клавиши когда элемент в фокусе
    #35772376
Tohan_ORA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Tohan_ORAПоправил на
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
LPARAMETERS nKeyCode, nShiftAltCtrl

LOCAL m.lcName
m.lcName = IIF(TYPE("THISFORM.ActiveControl") == "O", UPPER(THISFORM.ActiveControl.Name), "")

DO CASE
  CASE m.nkeycode= 54  AND m.nshiftaltctrl =  1  AND  m.lcName == "text_contract"
    thisformset.func_move_contract( 1 ) 
    nodefault
  CASE m.nkeycode= 52  AND m.nshiftaltctrl =  1  AND m.lcName == "text_contract"
     thisformset.func_move_contract(- 1 ) 
     nodefault
  OTHERWISE
    DODEFAULT(m.nkeycode, m.nshiftaltctrl)
ENDcase
Осталась проблема с
Код: plaintext
m.lcName=''
и добавилась новая при нахождении в гриде формы при нажатии на стрелки ВВЕРХ или ВНИЗ-курсор стал прыгать по контролам, вместо перемещения по гриду как раньше. :-(
...
Рейтинг: 0 / 0
Определить реакцию на нажатие клавиши когда элемент в фокусе
    #35772399
BRROE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
То что метод func_move_contract() находится в formset замечательно!
А то что Вы пытаетесь отловить кто там активный на какой форме не совсем правильно.
Вызывайте Thisformset.func_move_contract() НЕПОСРЕДСТВЕННО из контрола [text_contract]
и не будет никаких трудностей.

Образно:
гражданин "text_contract" идет к чиновнику Thisformset и просит его
решить вопрос "func_move_contract"

Procedure text_contract.KeyPress
LPARAMETERS nkeycode, nshiftaltctrl
Do case
CASE nkeycode = 62
nodefault
thisformset.func_move_contract(1)
case nkeycode=60
nodefault
thisformset.func_move_contract(-1)
EndCase
EndProc
...
Рейтинг: 0 / 0
Определить реакцию на нажатие клавиши когда элемент в фокусе
    #35772450
BRROE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И к тому же:


UPPER(THISFORM.ActiveControl.Name) ни при каких обстоятелсвах не буде равен
"text_contract" ( маленькими буквами )

Тогда уже либо lower(THISFORM.ActiveControl.Name) = "text_contract"

либо == "TEXT_CONTRACT"
...
Рейтинг: 0 / 0
Определить реакцию на нажатие клавиши когда элемент в фокусе
    #35772638
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Не обратил внимание на то, что вы используете FormSet (сам я никогда этот объект не использую).
2. Название активного объекта я перевожу в верхний регистр и, следовательно, сравнивать его надо с именами объектов в верхнем регистре.
3. Всю обработку "горячих" клавишь я размещаю в одном месте: в KeyPress формы. Мне так удобнее. Вы можете выбрать иной вариант.
Если методы у вас находятся в formset, а KeyPress, разумеется, только в форме, то ссылайтесь на методы formset из формы через относительную ссылку вида:
THIS.Parent.func_move_contract(-1).

KeyPress:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
LPARAMETERS nKeyCode, nShiftAltCtrl

LOCAL m.lcName
m.lcName = IIF(TYPE("THISFORM.ActiveControl") == "O", UPPER(THISFORM.ActiveControl.Name), "")

DO CASE
  CASE m.nkeycode= 62  AND m.nshiftaltctrl =  1  AND  m.lcName == "TEXT_CONTRACT"
    this.parent.func_move_contract( 1 ) 
    nodefault
  CASE m.nkeycode= 60   AND m.nshiftaltctrl =  1  AND m.lcName == "TEXT_CONTRACT"
     this.parent.func_move_contract(- 1 ) 
     nodefault
  OTHERWISE
    DODEFAULT(m.nkeycode, m.nshiftaltctrl)
ENDCASE
С уважением, Алексей
...
Рейтинг: 0 / 0
Определить реакцию на нажатие клавиши когда элемент в фокусе
    #35773080
Tohan_ORA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо всем разобрался! :-)
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Определить реакцию на нажатие клавиши когда элемент в фокусе
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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