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

Сообщений: 116
Дата регистрации: 23.04.2001
Хочу из формы по кнопке, к примеру, F2 запустить модальное окно. Там выбрать значение, это значение вернуть в форму. После этого обновить Grid на форме.
Передать выбранные данные я могу через глобальную (или , может, PRIVATE) переменную. А вот обновить Grid не знаю как.

другими словами. есть обработчик кнопки
PRIVATE nRetValue
nRetValue = 0
DO FORM &cFormPath.выбор_g_name
IF nRetValue > 0
SELECT translate
replace g_name WITH nRetValue
=SEEK( nRetValue, 'g_name')
this.mainGrid.Refresh()
ENDIF

как это вызвать при нажатии на F2 (F2 - кнопка к которой все пользователи досовской версии привыкли)

Из ON KEY LABEL F2 не видно this и следующая строка не работает
this.mainGrid.Refresh()

з.ы. Использую VFP 9



Исправлено 2 раз(а). Последнее : Артём, 10.11.19 16:20
Ratings: 0 negative/0 positive
Re: Как работать с ON KEY LABEL или чем эту конструкцию заменить?
akvvohinc

Сообщений: 4202
Откуда: Москва
Дата регистрации: 11.11.2008
Артём
Передать выбранные данные я могу через глобальную (или , может, PRIVATE) переменную.
Артём
Из ON KEY LABEL F2 не видно this

Если вы готовы передавать данные через глобальную переменную, то что мешает передавать в обработчик аналогично и ссылку на грид (или форму)?

Напишите где-нибудь в Init формы:
PUBLIC ogrid
ogrid = thisform.Grid1

и используйте ogrid в обработчике.

PS
А в обработчике первой же строкой надо отключать ваш ON KEY LABEL во избежание рекурсивного вызова обработчика:
PUSH KEY
ON KEY LABEL F2
...
POP KEY
Иначе ошибка превышения "DO nesting" - самое безобидное, что может случиться при такой рекурсии.



Исправлено 2 раз(а). Последнее : akvvohinc, 10.11.19 16:56
Ratings: 0 negative/1 positive
Re: Как работать с ON KEY LABEL или чем эту конструкцию заменить?
Артём
Автор

Сообщений: 116
Дата регистрации: 23.04.2001
Спасибо. Пока так и сделаю. Ну и жду более красивых решений, вдруг, они есть.

akvvohinc

А в обработчике первой же строкой надо отключать ваш ON KEY LABEL во избежание рекурсивного вызова обработчика:
ON KEY LABEL F2
Иначе ошибка превышения "DO nesting" - самое безобидное, что может случиться при такой рекурсии.

Это я в курсе. Помнится много лет назад, когда впервые ON KEY LABEL использовал, переназначил ON KEY LABEL ENTER и не отключил. Программа сразу сошла с ума. Искал ошибку несколько дней.

теперь мои обработчики FOX for DOS выглядят примерно так
DO clr_key_01
DO set_key_02
...
...
...
DO clr_key_02
DO set_key_01

з.ы. про push key не знал. спасибо



Исправлено 3 раз(а). Последнее : Артём, 10.11.19 17:08
Ratings: 0 negative/0 positive
Re: Как работать с ON KEY LABEL или чем эту конструкцию заменить?
akvvohinc

Сообщений: 4202
Откуда: Москва
Дата регистрации: 11.11.2008
Артём
жду более красивых решений
Обработчик F2 может ничего не выполнять, кроме установки некоторого флажка (это может быть что угодно - переменная, свойство объекта, поле таблицы, файл и т.п., но все равно - нечто внешнее по отношению к обработчику).

А таймер на форме будет анализировать этот флаг, выполнять обработку, если требуется, и сбрасывать флаг.
В таймере проблем с использованием this или thisform не будет.

"Глобальность" есть и здесь, но при таком подходе ее проще "систематизировать" - "централизованные" глобальные флажки под кнопки ИМХО лучше, чем глобальные переменные под ссылки на объекты, разбросанные по разным формам.

Ну, а более красивым я бы назвал решение отказаться от ON KEY LABEL - вы же не из BROWSE нажимаете F2, а из грида (ну, или какого-то другого объекта формы).
Так почему бы не использовать событие KeyPress?



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

Сообщений: 12999
Откуда: Москва
Дата регистрации: 23.03.2005
1. Не слушать учителей которые учат плохому.
2. Не надо использовать On Key, лучше keypress формы. Только не забыть выставить KeyPreview у формы.
3. Формы могут принимать параметры Do form выбор_g_name with this
Разумеется при том надо в форме эти параметры принять.
4. Как, надеюсь, заметил при вызове формы можно выкинуть мусор в виде &cFormPath., правильно настроив set path
И никаких глобальных переменных, флагов, обработчиков и прочей...


------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/1 positive
Re: Как работать с ON KEY LABEL или чем эту конструкцию заменить?
Артём
Автор

Сообщений: 116
Дата регистрации: 23.04.2001
ssa
2. Не надо использовать On Key, лучше keypress формы. Только не забыть выставить KeyPreview у формы.
вот про KeyPreview я как раз и не знал. так, ясно дело, самое правильное.
Только 2 кнопки не ловятся F1 и F10. F1 еще ладно, а вот F10 хотелось бы переназначить

ssa
3. Формы могут принимать параметры Do form выбор_g_name with this
Разумеется при том надо в форме эти параметры принять.
Это тоже принимается с удовольствием

ssa
4. Как, надеюсь, заметил при вызове формы можно выкинуть мусор в виде &cFormPath., правильно настроив set path
у меня иногда этих глобальных директорий штук 20 собирается. Очень плотно их использую, правда без сети в однопользовательском режиме. Особенно удобно, когда на разных компах разные директории используются.
Ratings: 0 negative/0 positive
Re: Как работать с ON KEY LABEL или чем эту конструкцию заменить?
Артём
Автор

Сообщений: 116
Дата регистрации: 23.04.2001
akvvohinc
Так почему бы не использовать событие KeyPress?
я пробовал, но без KeyPreview не работало.
С флагами интересное решение и путаницы меньше. Но таймеры как то не очень мне нравятся для этого дела.
Спасибо!
Ratings: 0 negative/0 positive
Re: Как работать с ON KEY LABEL или чем эту конструкцию заменить?
ssa

Сообщений: 12999
Откуда: Москва
Дата регистрации: 23.03.2005
Артём
вот про KeyPreview я как раз и не знал. так, ясно дело, самое правильное.
Только 2 кнопки не ловятся F1 и F10. F1 еще ладно, а вот F10 хотелось бы переназначить
Внимательно читаем хелп по функции Inkey()
Цитата:

у меня иногда этих глобальных директорий штук 20 собирается. Очень плотно их использую, правда без сети в однопользовательском режиме. Особенно удобно, когда на разных компах разные директории используются.
У меня тоже далеко не один. И что?

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

Сообщений: 34580
Дата регистрации: 28.05.2002
KeyPress-ом не перехватываются кнопки которые связаны с пунктами меню (даже F2 если запускать программу из IDE - она занята под постановку закладки), или на которые повешены стандартные системные действия (F10 активирует главное меню). ON KEY LABEL может их перехватывать, но в общем случае лучше выбрать что-то другое, не занятое системой (для F2 - запускать из под рантайма, где не будет меню установки закладок).
Если без F10 совсем никуда, то лучше сделать один глобальный перехватчик типа
ON KEY LABEL F10 KEYBOARD '{F12}' PLAIN CLEAR
И тем самым "переназначить" занятую системой кнопку на что-то свободное (кнопку или комбинацию можно, конечно же, подобрать и другую).
Никаких глобальных или приватных переменых не нужно, глобальные/приватные флаги в ON KEY LABEL тоже не нужны. Можно просто передать в вызываемую форму ссылку на вызывающую (DO FORM SomeDialog WITH ThisForm), там принять в Init эту ссылку и запомнить в своё свойство формы, ну и когда надо просто обратиться из вызываемой форме к вызывающей - лучше всего дёрнуть её метод (а не обращаться ко внутренностям - типа грида где-то там расположенного и как-то там называющегося).


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

Сообщений: 4202
Откуда: Москва
Дата регистрации: 11.11.2008
Igor Korolyov
глобальные/приватные флаги в ON KEY LABEL тоже не нужны. Можно просто передать в вызываемую форму ссылку на вызывающую (DO FORM SomeDialog WITH ThisForm)

А в каком месте программы будет написана эта команда:
DO FORM SomeDialog WITH ThisForm
?
Ratings: 0 negative/0 positive
Re: Как работать с ON KEY LABEL или чем эту конструкцию заменить?
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
akvvohinc
А в каком месте программы будет написана эта команда:
DO FORM SomeDialog WITH ThisForm
В обработчике KeyPress
Ratings: 0 negative/0 positive
Re: Как работать с ON KEY LABEL или чем эту конструкцию заменить?
Crispy

Сообщений: 18571
Дата регистрации: 16.05.2005
Артём
Только 2 кнопки не ловятся F1 и F10. F1 еще ладно, а вот F10 хотелось бы переназначить

Как и для любых случаев отмены выполнения реакции по умолчанию, можно использовать команду "NODEFAULT".
Подавляя например те же стандартные нажатия F1-F12 в KeyPress формы.
При этом для вставки в новую форму, чтобы каждый раз не морочиться с кодами клавиш, лучше заранее создать и иметь где-то конструкцию-шаблон типа:
LPARAMETERS nKeyCode, nShiftAltCtrl
WITH thisform
DO CASE
CASE nKeyCode=28 && F1
NODEFAULT
CASE nKeyCode=-1 && F2
NODEFAULT
CASE nKeyCode=-9 && F10
NODEFAULT
CASE nKeyCode=-1 && F12
NODEFAULT
CASE nKeyCode=133 && F11
NODEFAULT
CASE nKeyCode=134 && F12
NODEFAULT
ENDCASE
ENDWITH
И затем при необходимости просто копировать и вставлять готовый шаблон в KeyPress.
Добавив сюда еще реакцию на все клавиши между F2-F10, их коды отличаются последовательно уменьшаясь на -1.
Можно также добавить и другие часто используемые по логике работы программы клавиши, например Esc (27), Tab (9), Enter (13) и другие.

Кстати по поводу ссылок, в частности "this" из приведенного в вопросе кода - на форме для корня ссылок, отталкивающихся от самой формы, лучше всегда использовать не "this" - а именно "thisform". Меньше проблем будет в дальнейшем.
"this" же - имеет смысл использовать только, если отталкиваться от объектов на форме.
Например стоит применять его для объектов контейнерного и составного типа - контейнеров, грида, группы кнопок или выбора - чтобы ссылаться из его методов на вложенные в него объекты. При этом отсылки ко внешнему объекту можно получать, используя в каждом из них параметр Parent. Скажем из метода столбца - к методу или свойству грида:
this.Parent.ИмяСвойства

Также, еще такая вещь полезна - при количестве строк кода, большем двух, имеет смысл для лучшей читаемости кода стараться использовать структурные скобки WITH...ENDWITH (как в приведенном примере для KeyPress).
Это намного упрощает конструкции. Внутрь скобок для "thisform" можно вкладывать следующие скобки - уже для вложенного контейнера:
WITH thisform
* какой-то код для формы
WITH .grid1
* какой-то код для объектов/методов грида:
.AfterRowColChange()
.Column1.Set Focus()
ENDWITH
ENDWITH
и т.д.
Разумеется, всегда стоит не лениться добавлять сразу же в свой код комментарии, пояснения - что делает данная процедура или какая-то часть ее, полезно будет в дальнейшем, когда что-то уже позабудется, одним взглядом восстановить в памяти, зачем все это вообще делалось.


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

Сообщений: 464
Откуда: Одинцово
Дата регистрации: 17.12.2002
Как переназначить фнкциональные клавиши, если чё:
Assigns an expression (keyboard macro) to a function key or key combination.
SET FUNCTION nFunctionKeyNumber | KeyLabelName TO [eExpression]
Parameters
nFunctionKeyNumber
Specifies the number of the function key assigned to the macro. For example, use SET FUNCTION 2 to specify the F2 function key.
KeyLabelName
Specifies a key combination, including a function key, to which to assign the macro. Visual FoxPro supports key combinations that include function keys. You can use the CTRL or SHIFT key in combination with a function key to create additional programmable keys. For a list of key label expressions, see ON KEY LABEL.
TO [ eExpression]
Specifies the series of keystrokes stored to the function key or key combination. Visual FoxPro interprets a semicolon (;) in the expression as a carriage return.
Function key definitions can be cleared with CLEAR MACROS.


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

Сообщений: 4202
Откуда: Москва
Дата регистрации: 11.11.2008
Аспид
akvvohinc
А в каком месте программы будет написана эта команда:
DO FORM SomeDialog WITH ThisForm

В обработчике KeyPress

Очевидно, что Игорь имел в виду что-то иное:
Igor Korolyov
глобальные/приватные флаги в ON KEY LABEL тоже не нужны. Можно просто передать в вызываемую форму ссылку на вызывающую (DO FORM SomeDialog WITH ThisForm)

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

Сообщений: 4202
Откуда: Москва
Дата регистрации: 11.11.2008
Crispy
Как и для любых случаев отмены выполнения реакции по умолчанию, можно использовать команду "NODEFAULT".

Речь шла о тех клавишах и комбинациях (типа F1), которые "стандартно" не вызывают метод KeyPress вовсе.
Для F1, например, следует отключить "стандарт" командой
SET HELP OFF

SET FUNCTION F1 TO ...
тоже не должно быть задействовано.

Лишь после этого нажатие F1 будет вызывать KeyPress со стандартным значением 28.

Crispy
Кстати по поводу ссылок, в частности "this" из приведенного в вопросе кода - на форме для корня ссылок, отталкивающихся от самой формы, лучше всегда использовать не "this" - а именно "thisform". Меньше проблем будет в дальнейшем.

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

Сообщений: 116
Дата регистрации: 23.04.2001
Crispy
Как и для любых случаев отмены выполнения реакции по умолчанию, можно использовать команду "NODEFAULT".
Подавляя например те же стандартные нажатия F1-F12 в KeyPress формы.
При этом для вставки в новую форму, чтобы каждый раз не морочиться с кодами клавиш, лучше заранее создать и иметь где-то конструкцию-шаблон типа:
LPARAMETERS nKeyCode, nShiftAltCtrl
WITH thisform
DO CASE
CASE nKeyCode=28 && F1
NODEFAULT
CASE nKeyCode=-1 && F2
NODEFAULT
CASE nKeyCode=-9 && F10
NODEFAULT
CASE nKeyCode=-1 && F12
NODEFAULT
CASE nKeyCode=133 && F11
NODEFAULT
CASE nKeyCode=134 && F12
NODEFAULT
ENDCASE
ENDWITH
И затем при необходимости просто копировать и вставлять готовый шаблон в KeyPress.
У меня на F1, F2, F10 KeyPress вообще не вызывается. так что или тут не то написано, или я неправильно понимаю, куда этот текст вставлять
Ratings: 0 negative/0 positive
Re: Как работать с ON KEY LABEL или чем эту конструкцию заменить?
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
() В KeyPress Идея с NODEFAULT() и DODEFAULT(...параметры можно, или нужно) такая:
- если код в этом событии пустой - то выполняется что "должно" - изображается нажатая буква, симол
- если прописан код, то, выполняется только он, но выполняется и DEFAULT-код (отображение символа в видеоэлементе)
- если в коде выполнен NODEFAULT(), то код отображения символа в видеоэлементе не отображается
- если вызвать в коде DODEFAULT(), то можно получить и 2 символа на одно нажатие кнопки
- если в коде указать DODEFAULT() и NODEFAULT(), то хз, смотря в какой последовательности, и вообще бессмысленно, надо избегать
Ratings: 0 negative/1 positive
Re: Как работать с ON KEY LABEL или чем эту конструкцию заменить?
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Аспид
akvvohinc
А в каком месте программы будет написана эта команда:
DO FORM SomeDialog WITH ThisForm
В обработчике KeyPress

Лучше в отдельном методе формы, к примеру "CallSomeDialog", а уж этот метод вызывать из KeyPress, из click кнопки, из пункта меню и любого другого места, где вздумается сделать инициацию "вызова диалога ввода данных". Копипаст даже всего 1 строки вызова (а завтра там понадобится ещё пару строк добавить, или, что скорее, заменить прямую команду DO FORM на свою обёртку) - это неправильно.

Crispy
Как и для любых случаев отмены выполнения реакции по умолчанию, можно использовать команду "NODEFAULT".
Опять глупость сморозил. F1, F2 (при нажатии в IDE, не в рантайме), F10 и ещё ряд кнопок/сочетаний просто не дойдут до KeyPress, и никакой NODEFAULT не сработает. Он вообще не для этого предназначен.
А почему не дойдут - я писал уже выше, да и Сергей о том же написал...


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

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Просто надо перепроверять высказывания друг друга, честно и доказательно перепроверять, и вменять несоотвествия критериям проверки, (к которым тоже могут быть предьявлены претензии), культура общения в этом состоит (не стал вставлять вставку "и")
Ratings: 0 negative/0 positive
Re: Как работать с ON KEY LABEL или чем эту конструкцию заменить?
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
NODEFAULT это не функция - ей не нужны скобки. Это даже и не совсем команда (хотя формально это именно команда) - это скоре директива рантайму фокса "не делай то что ты бы делал не будь в методе никакого кода". Для KeyPress - ввод символа в поле ввода, или перемещение курсора в/между полями ввода. Для click - визуализация "нажимания" кнопки. Для QueryUnload - "продолжение закрытия формы". Никаких проблем в совместном использовании NODEFAULT и псевдо-функции DODEFAULT() нет. Для KeyPress таким образом можно "заменять" символы - к примеру отменить печать буквы А, и вместо этого проэмулировать печать буквы Б.


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


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

On-line: 19 OlegA  (Гостей: 18)

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