powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как контролировать вызовы по on key label
18 сообщений из 18, страница 1 из 1
Как контролировать вызовы по on key label
    #37227193
guestT1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в головном модуле есть "горячие" вызовы других модулей вида
...
on key label F2 do PROC00 with(1) in MAIN && Справочник 1
on key label F3 do PROC00 with(2) in MAIN && Справочник 2
...

в вызываемых модулях
...
- какие-то подготовительные действия в процедуре
- окно просмотра (browse или запертое read'ом окно)
- какие-то завершающие действия в процедуре
...

При вызове модулей через меню проблем не возникает, а при чрезмерных
"скаканиях" по модулям через горячие клавиши очень быстро добиваемся сообщения
'Insufficient stack space'. Переполнение вложения do меня не волнует. Волнует то,
что при скаканиях я не могу выполнить завершающие операции в процедурах.

Вопрос. Как контролировать вызовы по on key label таким образом, чтобы
можно было при вызове on key label завершить текущую процедуру.

FPD 2.6
...
Рейтинг: 0 / 0
Как контролировать вызовы по on key label
    #37230360
TechIT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
предполагаю - вот вызвана процедура по он кей, - первой же строкой нужно переопределить он кей или не на что не назначить - без параметров, либо назначить на завершающий код, который выделить в отдельную процедуру...
По типу булевой переменной сначала да... вызвал - переменная стала "нет", и потом когда нужно, включаешь переменную снова ("да")
...
Рейтинг: 0 / 0
Как контролировать вызовы по on key label
    #37230595
reware
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
guestT1,
Не могу сказать за FPD 2.6, но в VFP9
Код: plaintext
1.
2.
3.
To prevent recursive calls during the execution of an ON KEY LABEL
 procedure, include PUSH KEY CLEAR early in the procedure to disable all 
active ON KEY LABEL commands. Issue POP KEY at the end of the procedure 
to enable the ON KEY LABEL commands.
т.е. в каждой вызываемой процедуре надо сначала убрать назначения клавиш (F2, F3...), а в конце процедуры их восстановить (POP KEY).
...
Рейтинг: 0 / 0
Как контролировать вызовы по on key label
    #37230624
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На входе в процедуру ставишь:
Код: plaintext
push key clear && запомнить привязку ON KEY и убрать
при выходе из процедуры
Код: plaintext
pop key && восстановить привязку ON KEY
...
Рейтинг: 0 / 0
Как контролировать вызовы по on key label
    #37233349
guestT1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо всем ответившим. Ответа на свой вопрос не получил, видимо из-за его не правильной формулировки. Я в курсе о PUSH KEY и POP KEY, вопрос не технической реализации, а логической. Если к примеру в коде
Код: 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.
MAIN.PRG
***************
...
on key label F2 do AAA
on key label F3 do BBB
...
do MAINMENU
...


AAA.PRG
***************
procedure AAA
...
select  0 
use TABLE AA order tag TAG1
set relation to FIELD1+FIELD2 into BB additive
browse
set relation off into BB
use
...
return

BBB.PRG
***************
procedure BBB
...
if file('AAIND.IDX')
  erase AAIND.IDX
endif
select  0 
use TABLE AA
index on FIELD10+FIELD22 to AAIND
browse
use
if file('AAIND.IDX')
  erase AAIND.IDX
endif
...
return


вызовы из меню, то отрабатывается все что написано до browse и после его как и задумано (создал - уничтожил, связал-отключил, сохранил-восстановил и т.д.), а если в момент работы browse нажали "горячую клавишу", то после browse нет
отработки что задумывалось, и возврата нет, и лезут ошибки типа уже открыто, используется и т.д. Т.е. получается что on key label глобальный не имеет смысла (т.к. в модуле его надо "заглушить" и восстановить при выходе), либо я его не умею готовить. О чем собственно сабж.
...
Рейтинг: 0 / 0
Как контролировать вызовы по on key label
    #37233577
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как написал - так и работает, ничего странного в этом нет.
Твой код работает так:
Код: plaintext
1.
2.
3.
4.
5.
6.
MAIN.PRG
***************
...
on key label F2 do AAA
on key label F3 do BBB
...
do MAINMENU
тут нажали F2 (do AAA):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
AAA.PRG
***************
procedure AAA
...
select  0 
use TABLE AA order tag TAG1
set relation to FIELD1+FIELD2 into BB additive
browse
код остановился на browse
нажали F3 (do BBB) причем выхода из AAA не происходит, там все ожидается закрытие BROW
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
BBB.PRG
***************
procedure BBB
...
if file('AAIND.IDX')
  erase AAIND.IDX
endif
select  0 
use TABLE AA && тут ошибка т.к. AA открыта выше
index on FIELD10+FIELD22 to AAIND
browse
Как я понимаю ты хочешь событийно-управляемый интерфейс, такое только в VFP есть, FPD процедурный, поэтому только писать извраты с командой KEYBOARD, которая поместит в буфер клавиатуры сначала команду на закрытие текущей процедуры, а потом команду на открытие новой.
Т.е. при нажатии на F3 в выше описанном примере должно произойти что-то типа:
Код: plaintext
1.
KEYBOARD '{CTRL+W}' && закрыть brow и выполнить код после brow и выйти из AAA.PRG
KEYBOARD 'F3' && do BBB
...
Рейтинг: 0 / 0
Как контролировать вызовы по on key label
    #37234284
guestT1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TКак написал - так и работает, ничего странного в этом нет.
Твой код работает так:

Пример привел для демонстрации аварийной ситуации. С одной стороны преследуется
надежность работы приложения, с другой - ищется компромис между количеством проверок
типа if used() и т.п. а так как модулей очень много, а в них процедур тьма то если
все на все проверять, то за деревьями и леса не видать.
Хотелось бы иметь ясный код с прозрачной логикой выполнения, но судя по откликам
народ подход использует в основном "блинчиком": Меню - вызов процедуры. Думал меня
кто на read подтолкнет.

Dima T... поэтому только писать извраты с командой KEYBOARD

Спасибо за хинт, думаю написать один обработчик который бы "разруливал" вызова и завершал
нормально процедуры.
...
Рейтинг: 0 / 0
Как контролировать вызовы по on key label
    #37234331
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
guestT1Думал меня кто на read подтолкнет.А что, до сих пор без Read cycle? Если да, то ничего удивительного...
...
Рейтинг: 0 / 0
Как контролировать вызовы по on key label
    #37234361
guestT1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sergey SizovА что, до сих пор без Read cycle? Если да, то ничего удивительногоЯ вижу, что вы поняли мою проблему. Прошу подсказать куда подставить Read cycle хотя бы в мой выше приведенный маленький пример для решения проблемы.
...
Рейтинг: 0 / 0
Как контролировать вызовы по on key label
    #37234408
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
guestT1Sergey SizovА что, до сих пор без Read cycle? Если да, то ничего удивительногоЯ вижу, что вы поняли мою проблему. Прошу подсказать куда подставить Read cycle хотя бы в мой выше приведенный маленький пример для решения проблемы.Да сразу после вызова меню. Но в меню или в коде, который из него вызывается, должно быть изменение условия выхода из цикла. Тогда и получиться нечто похожее на Read events.
...
Рейтинг: 0 / 0
Как контролировать вызовы по on key label
    #37234470
guestT1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sergey SizovДа сразу после вызова менюНечто подобное, "подпирающее" меню должно быть в любой программе на фоксе для реализации состояния "ожидания", иначе программа завершится. У меня тоже это есть, без этого никак. Вы предлагаете между "подпоркой" и меню вставить read и для каждого вызова из меню менять его условия выхода и таким образом контролировать переход на browse по on key label? Или я не правильно понял?
...
Рейтинг: 0 / 0
Как контролировать вызовы по on key label
    #37234483
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
guestT1Sergey SizovДа сразу после вызова менюНечто подобное, "подпирающее" меню должно быть в любой программе на фоксе для реализации состояния "ожидания", иначе программа завершится. У меня тоже это есть, без этого никак.А вот и нет. Read cycle и является "подпоркой". Вы предлагаете между "подпоркой" и меню вставить read и для каждого вызова из меню менять его условия выхода и таким образом контролировать переход на browse по on key label? Или я не правильно понял?Не правильно.
...
Рейтинг: 0 / 0
Как контролировать вызовы по on key label
    #37241799
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я так в своих прогах на FPD специально расписывал UDF вместо push/pop key, со стеком переопределений функциональных клавиш. То есть перед вызовами интерактивов (menu/activate, browse, @get/read cycle) предыдущее состояние запоминалось, затем необходимое переопределялось, после отработки и возврата на текущий уровень - восстанавливалось...
...
Рейтинг: 0 / 0
Как контролировать вызовы по on key label
    #37241801
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, да, примерчик... переписывать не стал (производство 96-го года) - думаю, разберётесь.
RESTER
Код: 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.
* Выполняется один раз в блоке инициализации проги
procedure init_onkey
public array onkey( 64 , 5 ), onkey1( 13 , 5 )
select a
use onkey
copy to array onkey
use onkey1
copy to array onkey1
use
public array stack( 1 , 3 )
stack( 1 , 1 )= 0 
store '' to stack( 1 , 2 ),stack( 1 , 3 )
public _stack
store  0  to _stack

* Сама функция обработки
function rester
parameter what
do case
 case m.what= 0 
 * Очистить назначения и прочитать предыдущие из стека
 on key
 if _stack> 0 
  stk1=alen(stack, 1 )
  do while stack(stk1, 1 )=_stack
   stk_n=alltrim(stack(stk1, 2 ))
   stk_m=alltrim(stack(stk1, 3 ))
   on key label (stk_n) &stk_m
   stk1=stk1- 1 
  enddo
  dimension stack(stk1, 3 )
  _stack=_stack- 1 
 endif
 case m.what= 1 
 * Записать текущие установки в стек и очистить назначения
 _stack=_stack+ 1 
 for stk1= 1  to alen(onkey, 1 )
  for stk2= 2  to alen(onkey, 2 )
   if onkey(stk1,stk2)
    stk_n=iif(stk2= 3 ,'SHIFT+',iif(stk2= 4 ,'CTRL+',iif(stk2= 5 ,'ALT+','')))
    stk_m=stk_n+alltrim(onkey(stk1, 1 ))
    if len(on('key',stk_m))> 0 
     stk_a=alen(stack, 1 )+ 1 
     dimension stack(stk_a, 3 )
     stack(stk_a, 1 )=_stack
     stack(stk_a, 2 )=stk_m
     stack(stk_a, 3 )=on('key',stk_m)
    endif
   endif
  endfor
 endfor
 on key
endcase

Пользуемся примерно так:
ONKEY
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
...
do init_onkey
...
=rester( 1 )
on key label F2 do x2
on key label F3 do x3
activate menu ...
=rester( 0 )
...
.. x2
=rester( 1 )
browse ...
=rester( 0 )
...
.. x3
=rester( 1 )
@get ...
read cycle
=rester( 0 )
...

Приложение - таблицы
...
Рейтинг: 0 / 0
Как контролировать вызовы по on key label
    #37241803
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По идее, это аналог push/pop. Но позволяющий не обращать внимание на ограничения и неявные действия фокса (типа сброса по CLEAR).
...
Рейтинг: 0 / 0
Как контролировать вызовы по on key label
    #37244859
guestT1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо всем ответившим, но повторюсь, вопрос не касается технической реализации манипуляций с on key label (запомнить, восстановить, переопределить и т.п.) а логической организации приложения, когда на browse вызывается on key label и не отрабатывается завершающие действия перед вызовом. Ближе всех понял вопрос "Dima T ", ему отдельное спасибо за "писать извраты с командой KEYBOARD". Это не значит, что буду делать именно так, но мысли полезные появились )). Если процедура по on key label отработала и управление вернулось на browse из которого она вызывалась, то и вопросов нет. А когда вызывающая процедура например переопределила связи, индексы и из нее был переход (может не сразу а через другие процедуры) на первую происходит error который бы не хотелось допускать.
...
Рейтинг: 0 / 0
Как контролировать вызовы по on key label
    #37251456
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
guestT1вызывающая процедура например переопределила связи, индексы и из нее был переход (может не сразу а через другие процедуры) на первую происходит error который бы не хотелось допускать.
А это, батенька, ошибки проектирования. Так делать не следует.
Незря в Фоксе GOTO отсутствует...

Или я чего-то недопонимаю? Может, вы мыслите о том, что вам надо переключаться между одновременно открытыми окнами с brows'ами и иметь правильные назначения клавиш в каждом из окон?.. тут да, READ EVENTS нет, так что "извращаться" придется.
...
Рейтинг: 0 / 0
Как контролировать вызовы по on key label
    #37251615
reware
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
guestT1,
Может отца русской демократии спасёт набор из двух функций, которые сохраняют/восстанавливают назначение клавиш F. Фунция SaveFKeys() сохраняет назначение клавиш, функция RestoreFKeys() восстанавливает ранее сохранённые значения.
В модуле, вызванном по (пример) F5 в начале SaveFKeys(), в конце модуля перед RETURN ставим RestoreFKeys().
Код: 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.
PUBLIC ARRAY afkey[ 1 , 10 ]
...
************************************
FUNCTION SaveFKeys
************************************
PARAMETERS FormName
FormName=ALLTRIM(UPPER(FormName))
FOR dix= 1  TO ALEN(afkey, 1 )
	IF UPPER(afkey[dix, 10 ])==FormName
		RETURN
	ENDIF
NEXT
DIMENSION afkey[ALEN(afkey, 1 )+ 1 , 10 ]
afkey[ALEN(afkey, 1 ), 10 ]=FormName
FOR dix= 2  TO  9 
	pk=ON('KEY','F'+ALLTRIM(STR(dix)))
	afkey[ALEN(afkey, 1 ), dix- 1 ]=pk
NEXT
pk=ON('KEY','F12')
afkey[ALEN(afkey, 1 ), 9 ]=pk
RETURN

************************************
FUNCTION RestoreFKeys
************************************
PARAMETERS FormName
FormName=ALLTRIM(UPPER(FormName))
FOR dix= 1  TO ALEN(afkey, 1 )
	IF UPPER(afkey[dix, 10 ])==FormName
		FOR ee= 1  TO  8 
			pk=afkey[dix,ee]
			IF !EMPTY(pk)
				keyname='F'+ALLTRIM(STR(ee+ 1 ))
				ON KEY LABEL &keyname &pk
			ENDIF
		NEXT
		pk=afkey[dix, 9 ]
		IF !EMPTY(pk)
			ON KEY LABEL F12 &pk
		ENDIF
		RETURN
	ENDIF
NEXT
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как контролировать вызовы по on key label
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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