Гость
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как контролировать вызовы по on key label / 18 сообщений из 18, страница 1 из 1
21.04.2011, 17:19
    #37227193
guestT1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как контролировать вызовы по on key label
в головном модуле есть "горячие" вызовы других модулей вида
...
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
23.04.2011, 19:51
    #37230360
TechIT
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как контролировать вызовы по on key label
предполагаю - вот вызвана процедура по он кей, - первой же строкой нужно переопределить он кей или не на что не назначить - без параметров, либо назначить на завершающий код, который выделить в отдельную процедуру...
По типу булевой переменной сначала да... вызвал - переменная стала "нет", и потом когда нужно, включаешь переменную снова ("да")
...
Рейтинг: 0 / 0
24.04.2011, 04:01
    #37230595
reware
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как контролировать вызовы по on key label
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
24.04.2011, 09:22
    #37230624
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как контролировать вызовы по on key label
На входе в процедуру ставишь:
Код: plaintext
push key clear && запомнить привязку ON KEY и убрать
при выходе из процедуры
Код: plaintext
pop key && восстановить привязку ON KEY
...
Рейтинг: 0 / 0
26.04.2011, 11:52
    #37233349
guestT1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как контролировать вызовы по on key label
Спасибо всем ответившим. Ответа на свой вопрос не получил, видимо из-за его не правильной формулировки. Я в курсе о 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
26.04.2011, 13:01
    #37233577
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как контролировать вызовы по on key label
Как написал - так и работает, ничего странного в этом нет.
Твой код работает так:
Код: 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
26.04.2011, 17:00
    #37234284
guestT1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как контролировать вызовы по on key label
Dima TКак написал - так и работает, ничего странного в этом нет.
Твой код работает так:

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

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

Спасибо за хинт, думаю написать один обработчик который бы "разруливал" вызова и завершал
нормально процедуры.
...
Рейтинг: 0 / 0
26.04.2011, 17:14
    #37234331
Sergey Sizov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как контролировать вызовы по on key label
guestT1Думал меня кто на read подтолкнет.А что, до сих пор без Read cycle? Если да, то ничего удивительного...
...
Рейтинг: 0 / 0
26.04.2011, 17:24
    #37234361
guestT1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как контролировать вызовы по on key label
Sergey SizovА что, до сих пор без Read cycle? Если да, то ничего удивительногоЯ вижу, что вы поняли мою проблему. Прошу подсказать куда подставить Read cycle хотя бы в мой выше приведенный маленький пример для решения проблемы.
...
Рейтинг: 0 / 0
26.04.2011, 17:40
    #37234408
Sergey Sizov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как контролировать вызовы по on key label
guestT1Sergey SizovА что, до сих пор без Read cycle? Если да, то ничего удивительногоЯ вижу, что вы поняли мою проблему. Прошу подсказать куда подставить Read cycle хотя бы в мой выше приведенный маленький пример для решения проблемы.Да сразу после вызова меню. Но в меню или в коде, который из него вызывается, должно быть изменение условия выхода из цикла. Тогда и получиться нечто похожее на Read events.
...
Рейтинг: 0 / 0
26.04.2011, 18:10
    #37234470
guestT1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как контролировать вызовы по on key label
Sergey SizovДа сразу после вызова менюНечто подобное, "подпирающее" меню должно быть в любой программе на фоксе для реализации состояния "ожидания", иначе программа завершится. У меня тоже это есть, без этого никак. Вы предлагаете между "подпоркой" и меню вставить read и для каждого вызова из меню менять его условия выхода и таким образом контролировать переход на browse по on key label? Или я не правильно понял?
...
Рейтинг: 0 / 0
26.04.2011, 18:18
    #37234483
Sergey Sizov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как контролировать вызовы по on key label
guestT1Sergey SizovДа сразу после вызова менюНечто подобное, "подпирающее" меню должно быть в любой программе на фоксе для реализации состояния "ожидания", иначе программа завершится. У меня тоже это есть, без этого никак.А вот и нет. Read cycle и является "подпоркой". Вы предлагаете между "подпоркой" и меню вставить read и для каждого вызова из меню менять его условия выхода и таким образом контролировать переход на browse по on key label? Или я не правильно понял?Не правильно.
...
Рейтинг: 0 / 0
01.05.2011, 06:19
    #37241799
AndreTM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как контролировать вызовы по on key label
Я так в своих прогах на FPD специально расписывал UDF вместо push/pop key, со стеком переопределений функциональных клавиш. То есть перед вызовами интерактивов (menu/activate, browse, @get/read cycle) предыдущее состояние запоминалось, затем необходимое переопределялось, после отработки и возврата на текущий уровень - восстанавливалось...
...
Рейтинг: 0 / 0
01.05.2011, 06:35
    #37241801
AndreTM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как контролировать вызовы по on key label
А, да, примерчик... переписывать не стал (производство 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
01.05.2011, 06:46
    #37241803
AndreTM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как контролировать вызовы по on key label
По идее, это аналог push/pop. Но позволяющий не обращать внимание на ограничения и неявные действия фокса (типа сброса по CLEAR).
...
Рейтинг: 0 / 0
04.05.2011, 10:27
    #37244859
guestT1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как контролировать вызовы по on key label
Спасибо всем ответившим, но повторюсь, вопрос не касается технической реализации манипуляций с on key label (запомнить, восстановить, переопределить и т.п.) а логической организации приложения, когда на browse вызывается on key label и не отрабатывается завершающие действия перед вызовом. Ближе всех понял вопрос "Dima T ", ему отдельное спасибо за "писать извраты с командой KEYBOARD". Это не значит, что буду делать именно так, но мысли полезные появились )). Если процедура по on key label отработала и управление вернулось на browse из которого она вызывалась, то и вопросов нет. А когда вызывающая процедура например переопределила связи, индексы и из нее был переход (может не сразу а через другие процедуры) на первую происходит error который бы не хотелось допускать.
...
Рейтинг: 0 / 0
08.05.2011, 21:00
    #37251456
AndreTM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как контролировать вызовы по on key label
guestT1вызывающая процедура например переопределила связи, индексы и из нее был переход (может не сразу а через другие процедуры) на первую происходит error который бы не хотелось допускать.
А это, батенька, ошибки проектирования. Так делать не следует.
Незря в Фоксе GOTO отсутствует...

Или я чего-то недопонимаю? Может, вы мыслите о том, что вам надо переключаться между одновременно открытыми окнами с brows'ами и иметь правильные назначения клавиш в каждом из окон?.. тут да, READ EVENTS нет, так что "извращаться" придется.
...
Рейтинг: 0 / 0
09.05.2011, 04:48
    #37251615
reware
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как контролировать вызовы по on key label
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
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как контролировать вызовы по on key label / 18 сообщений из 18, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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