:: Visual Foxpro, Foxpro for DOS
Re: Как работать с ON KEY LABEL или чем эту конструкцию заменить?
akvvohinc

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
Crispy
Кстати, в предложенной тобой задаче - отдельной обработки активных объектов по нажатию на F2 - можно же и вообще никак не задействовать непосредственно KeyPress() формы.

Очевидно, что в реальном случае F2 (или какой другой код) - лишь часть общей задачи по обработке клавиш, так что полагаем по умолчанию, что KeyPress формы нужен, а следовательно, именно он "примет на себя первый удар".
Ratings: 0 negative/0 positive
Re: Как работать с ON KEY LABEL или чем эту конструкцию заменить?
Crispy

Сообщений: 18571
Дата регистрации: 16.05.2005
akvvohinc
KeyPress формы нужен, а следовательно, именно он "примет на себя первый удар".

Ну а как еще. ;)
Хотя бывают конечно уникальные случаи, когда без ON KEY LABEL не обойтись. Но они уж очень уникальные. Это как кувалда. Все пробивает насквозь. Но для тонких работ все же лучше не пользоваться.


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)
Ratings: 0 negative/0 positive
Re: Как работать с ON KEY LABEL или чем эту конструкцию заменить?
akvvohinc

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
Crispy
Ну так оно и делается обычно. Но это ж твоя идея - каждому объекту свою обработку.
Ну, не каждому, а каким-то конкретным, но я не ограничивал тебя тем, как именно решать эту задачу, то есть где писать код обработки.
Главное, чтобы у пользователя происходили разные вещи при нажатии клавиши в разных активных объектах.

Попробуй сначала обеспечить работу при том же подходе для обычных форм (не Top-Level)...
Ratings: 0 negative/0 positive
Re: Как работать с ON KEY LABEL или чем эту конструкцию заменить?
Crispy

Сообщений: 18571
Дата регистрации: 16.05.2005
akvvohinc
Попробуй сначала обеспечить работу при том же подходе для обычных форм (не Top-Level)...

А в чем проблема?
Вызываешь просто из топлевел-формы не топлевел - и все точно так же работает и в ней.
Специально только что проверил. [sm128]


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)
Ratings: 0 negative/0 positive
Re: Как работать с ON KEY LABEL или чем эту конструкцию заменить?
Crispy

Сообщений: 18571
Дата регистрации: 16.05.2005
Т.е. если не пользоваться главным окно фокспро - проблем вообще никаках.
Если же пользоваться - блокируются F2, F10 и некоторые комбинации Ctrl+... - хотя остальные функциональные клавиши и сочетания в принципе работают нормально. Но это известная старая беда главного окна. Для ее решения нужны просто уже всякие извращения проделывать.
Но я ж говорю - нафига вообще пользоваться этим главным окном? ;)
Мы эту тему еще с Пивой помнится тут обсуждали фиг знает когда. [sm128] А с неработабщими в главном окне нажатиями тоже что-то помнится всплывало уже и после периодически.


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)
Ratings: 0 negative/0 positive
Re: Как работать с ON KEY LABEL или чем эту конструкцию заменить?
akvvohinc

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
Crispy
Т.е. если не пользоваться главным окно фокспро - проблем вообще никаках.
Проблем вообще никаких и если не пользоваться фокспро.
Ratings: 0 negative/0 positive
Re: Как работать с ON KEY LABEL или чем эту конструкцию заменить?
Crispy

Сообщений: 18571
Дата регистрации: 16.05.2005
akvvohinc
Проблем вообще никаких и если не пользоваться фокспро.

Но жалко.


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)
Ratings: 0 negative/0 positive
Re: Как работать с ON KEY LABEL или чем эту конструкцию заменить?
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
akvvohinc
Очевидно, что в реальном случае F2 (или какой другой код) - лишь часть общей задачи по обработке клавиш, так что полагаем по умолчанию, что KeyPress формы нужен, а следовательно, именно он "примет на себя первый удар".
Могу ошибаться, давно было, но мне кажется что у себя я практически никогда не использоват KeyPress формы для "обработки клавиш". "Глобальные" действия проще было прописать хоткеями для пунктов меню, всё "локальное" - в самих контролах.
И потому логику взаимодействия KeyPress формы с KeyPress текстбокса на форме в режиме KeyPreview я не анализировал.

akvvohinc
А DODEFAULT() не сделает ничего полезного.
Поэтому я и писал, что с помощью DODEFAULT(), написанного в KeyPress формы, ни продублировать, ни подменить символ не получится.

Пример, конечно, практически бессмысленный, но он работает - вместо "штатных" действий по нажатию стрелки вправо и клавиши ввода, происходят действия соответствующие нажатию табулятора и стрелки вверх. Как я понимаю, это как раз те "нажатия кнопок" которые и обрабатывает сама форма - что вполне логично. Ну а уж то что она не инициирует при подобной "замене" срабатывания KeyPress текстбоксов и выполнение "системных действий обработчика KeyPress текстбокса" (независимо от наличия там пользовательского кода, кстати) - ну может быть это баг. А может быть просто непредусмотренное поведение, т.к. до таких "странностей" разрабы вполне могли и не додуматься
Кстати, у меня не захотела работать комбинация Shift+Tab - DODEFAULT(15, 1) - опять же не исключаю что это баг - и что статус кнопок-модификаторов в "системном" обработчике берётя не из параметров а напрямую через АПИ-функцию чтения состояния клавиатуры.

PUBLIC oForm
oForm = CREATEOBJECT("frm")
oForm.SHOW()
DEFINE CLASS frm AS FORM
KEYPREVIEW = .T.
ALLOWOUTPUT = .F.
ADD OBJECT text1 AS TEXTBOX WITH VALUE = "abcdef"
ADD OBJECT text2 AS TEXTBOX WITH VALUE = "abcdef", TOP = 20
ADD OBJECT text3 AS TEXTBOX WITH VALUE = "abcdef", TOP = 40
ADD OBJECT text4 AS TEXTBOX WITH VALUE = "abcdef", TOP = 60
PROCEDURE KEYPRESS
LPARAMETERS nKeyCode, nShiftAltCtrl
? nKeyCode, nShiftAltCtrl
IF nKeyCode = 4 && Right Arrow
NODEFAULT
RETURN DODEFAULT(9, 0) && Tab
ENDIF
IF nKeyCode = 13 && Enter
NODEFAULT
RETURN DODEFAULT(5, 0) && Arrow Up
ENDIF
ENDPROC
ENDDEFINE


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Как работать с ON KEY LABEL или чем эту конструкцию заменить?
akvvohinc

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
Igor Korolyov
Пример, конечно, практически бессмысленный, но он работает - вместо "штатных" действий по нажатию стрелки вправо и клавиши ввода, происходят действия соответствующие нажатию табулятора и стрелки вверх. Как я понимаю, это как раз те "нажатия кнопок" которые и обрабатывает сама форма - что вполне логично.

Пример интересный, и надо бы его получше осмыслить (на таких клавишах я, конечно, никогда не "играл" с DODEFAULT() ).

Но немного поэкспериментировав с ним, я не заметил, чтобы DODEFAULT() после NODEFAULT сделал ровно то же, что и простое нажатие:
IF nKeyCode = 4 && Right Arrow
NODEFAULT
DODEFAULT(4, 0) && Right Arrow
ENDIF

Курсор просто уходит на следующий текстбокс, в каком бы месте текущего текстбокса ни находился курсор.
То есть сказать, что "происходят соответствующие действия" вряд ли верно.

Igor Korolyov
Как я понимаю, это как раз те "нажатия кнопок" которые и обрабатывает сама форма - что вполне логично.

Вот в этом месте и надо подумать - что это такое - "кнопки, которые обрабатывает сама форма".
Ведь все кнопки, если ничего не делать, сначала попадут в KeyPress формы, а затем в KeyPress активного объекта.
При этом NODEFAULT отменяет тоже все кнопки, а вот DODEFAULT() с каким-то набором кнопок ведет себя иначе - послать букву А или F2 не получается, а стрелки, Tab и т.п. - можно (пусть реакция на них и не совсем ожидаемая).
Ratings: 0 negative/0 positive
Re: Как работать с ON KEY LABEL или чем эту конструкцию заменить?
leonid

Сообщений: 3204
Откуда: Рига
Дата регистрации: 03.02.2006
Посмотрите еще такой вариант
PUBLIC oForm
oForm = CREATEOBJECT("frm")
oForm.SHOW()
DEFINE CLASS frm AS FORM
KEYPREVIEW = .T.
ALLOWOUTPUT = .F.
ADD OBJECT text1 AS TEXTBOX WITH VALUE = "abcdef"
ADD OBJECT text2 AS TEXTBOX WITH VALUE = "abcdef", TOP = 20
ADD OBJECT text3 AS TEXTBOX WITH VALUE = "abcdef", TOP = 40
ADD OBJECT text4 AS TEXTBOX WITH VALUE = "abcdef", TOP = 60
PROCEDURE KEYPRESS
LPARAMETERS nKeyCode, nShiftAltCtrl
? nKeyCode, nShiftAltCtrl
IF nKeyCode = 4 && Right Arrow
NODEFAULT
DODEFAULT(4, 0)
DODEFAULT(4, 0)
RETURN
ENDIF
IF nKeyCode = 13 && Enter
NODEFAULT
RETURN DODEFAULT(5, 0) && Arrow Up
ENDIF
ENDPROC
ENDDEFINE
Ratings: 0 negative/0 positive
Re: Как работать с ON KEY LABEL или чем эту конструкцию заменить?
akvvohinc

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
leonid
Посмотрите еще такой вариант

Посылать несколько таких кнопок я пробовал - здесь результат, на мой взгляд, закономерный - если одна "стрелка право" уводит курсор к "завтрашнему" объекту, то две - к "послезавтрашнему".
Ratings: 0 negative/0 positive
Re: Как работать с ON KEY LABEL или чем эту конструкцию заменить?
Taran

Сообщений: 13625
Откуда: Красноярск
Дата регистрации: 16.01.2008
2Артём

Если далеко не ушёл от начального вопроса, то попробуй вместо
Артём
Из ON KEY LABEL F2 не видно this...
this.mainGrid.Refresh()

_screen.activeform.mainGrid.Refresh()



Исправлено 1 раз(а). Последнее : Taran, 16.11.19 16:32
Ratings: 0 negative/1 positive
Re: Как работать с ON KEY LABEL или чем эту конструкцию заменить?
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
_screen.activeform периодически будет "not an object". Напрямую так писать нельзя - надо проверками окружать...


------------------
WBR, Igor
Ratings: 0 negative/1 positive
Re: Как работать с ON KEY LABEL или чем эту конструкцию заменить?
Taran

Сообщений: 13625
Откуда: Красноярск
Дата регистрации: 16.01.2008
Igor Korolyov
_screen.activeform периодически будет "not an object". Напрямую так писать нельзя - надо проверками окружать...

Да я в курсе.
Если ты хотел ТСу сказать, то чеж сразу не привёл правильный код?
И так уж третья страница ни о чем.
Ratings: 0 negative/1 positive
Re: Как работать с ON KEY LABEL или чем эту конструкцию заменить?
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Да лень же, Олег Неактуальность всей темы не настраивает на вдумчивое и подробное объяснение. Как раз "ни о чём" ещё интересно поговорить, а решать конкретные проблемы ТС - увы, нет. Сам додумает, на то он и программист.


------------------
WBR, Igor
Ratings: 0 negative/1 positive
Re: Как работать с ON KEY LABEL или чем эту конструкцию заменить?
Taran

Сообщений: 13625
Откуда: Красноярск
Дата регистрации: 16.01.2008
Все так, Игорь. ;)
Вторым постом в данной теме надо было сказать про activeform и забыть.
Я думаю ТС, не в обиду будь сказано, слегка далёк от столь бурного обсуждения.

У меня, кстати, глобальная процедура и обьект назначения горячих клавишь. И в большинстве случаях фокус перемещается на соотв. кнопку. Ну т.е. стоим в gride, нажали F4 (у меня это редактирование) и соотв. кнопка рядом получает фокус. И т.д. и т.п..
Ratings: 0 negative/0 positive
Re: Как работать с ON KEY LABEL или чем эту конструкцию заменить?
akvvohinc

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
Igor Korolyov
_screen.activeform периодически будет "not an object". Напрямую так писать нельзя - надо проверками окружать...
Taran
Вторым постом в данной теме надо было сказать про activeform и забыть.

Как же забыть, если самое интересное как раз и начинается после "not an object"?
Неужели у ТС не возникнет вопрос "И что делать?"
Ну, проверили мы и получили этот "необъект", а дальше?

1) ждать, когда "not an object" станет "object";
2) заставить необъект стать объектом;
3) наплевать, что команда в этот раз не будет выполнена ("Ну не шмогла я, не шмогла!");
4) наплевать на нестабильно работающий способ, заменив его на надежный (может, KeyPress()? ) ;
5) что-то еще...



Исправлено 1 раз(а). Последнее : akvvohinc, 17.11.19 13:32
Ratings: 0 negative/0 positive
Re: Как работать с ON KEY LABEL или чем эту конструкцию заменить?
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Вообще-то просто наплевать - если not an object - значит нет активной формы. Смысла что-то делать с неактивной формой нет (например если она перекрыта превьюхой отчёта или каким modi file). Теоретически можно в атктивации/деактивации форм ставить/снимать все назначения, но на практике могут быть нюансы, так что защита нужна всё равно...
В любом случае никакой KeyPress в такой ситуации всё равно не сработает - просто до него не дойдёт дело, если форма не активна


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Как работать с ON KEY LABEL или чем эту конструкцию заменить?
pasha_usue

Сообщений: 3650
Откуда: Е-бург
Дата регистрации: 06.10.2006
akvvohinc
Ведь все кнопки, если ничего не делать, сначала попадут в KeyPress формы, а затем в KeyPress активного объекта.
Вообще, ошибочно считать, что в стеке вызовов KeyPress активного объекта лежит непосредственно после вызова KeyPress формы. Скорей всего они работают в режиме подписки на события, и вызываются последовательно на одном и том же уровне. Поэтому KeyPress формы не пересекается с KeyPress объекта.
Как и BINDEVENT, например.
Ratings: 0 negative/0 positive
Re: Как работать с ON KEY LABEL или чем эту конструкцию заменить?
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
В стеке вызовов фоксового кода они то не лежат как "один вызванный из другого" - ну конечно если нет явных вызовов типа ThisForm.txtSome.KeyPress(5,0)
А как там внутри рантайма всё организовано - хз. Фоксовые контролы не являются полноценными окнами, потому послать WM текстбоксу система не может - всё разруливает обработчик WM самой формы. Потому то он без проблем может и "подавить" вызов KeyPress для текстбокса, и заслать туда что-то своё (хотя, похоже, он так и не делает никогда).


------------------
WBR, Igor
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 22 _vit  (Гостей: 21)

© 2000-2024 Fox Club 
Яндекс.Метрика