:: Visual Foxpro, Foxpro for DOS
FoxPro Browse. Проблема возврата после смены таблицы
Nina_G

Сообщений: 35
Дата регистрации: 22.04.2014
Здравствуйте.
Дали задание в старой программе, написанной на FoxPro v.2.0, сделать просмотр архивов таблиц.
Код скопировать не могу, накидаю ту инфу, которая, как мне кажется, может повлиять
Суть: определяется окно в заголовке которого отображается имя архива и от какой он даты.
В этом окне открывается Browse (изначально в нём отображается текущий файл с актуальными данными) один из параметров которого NOCLEAR - для того, чтобы в момент смены отображаемой таблицы на экране была видимость открытой таблицы, чтобы не был пустым экран
В момент работы Browse, можно активировать пользовательское меню (define menu m1 bar in screen), в котором выбирается пункт Архив, при выборе этого пункта запускается процедура, которая анализируя определённый каталог на сервере составляет список имеющихся архивных файлов и выдает этот список на экран в виде вертикального меню (define popup). При выборе нужного пункта/архива закрывается открытая таблица, отображаемая на данный момент в browse и открывается на его месте выбранный архивный файл. На этом процедура вызванная из пользовательского меню завершается и как думается управление должно вернуться в программу, то есть поскольку таблицу закрыли то программа должна была выполнить следующую строчку после browse, то есть пойти на начало цикла, переопределить окно и высветить новый browse, но этого не происходит. Почему? Визуально на экране меню и картинка от старого browse но она не кликабельна (это-то понятно). После активации меню любого пункта browse всё-таки обновляется.
При попытке отtraceровать код, програама после открытия новой таблицы не выходит из browse, то есть не идёт выполнять цикл заново. Что не так в коде?
...
do while .T.
if wexist('w1')
release window w1
endif
define window w1 title 'Архив от '+dtoc(af[1,3]) ...
activate window w1
browse fields....;
NOCLEAR in w1
enddo
Ratings: 0 negative/0 positive
Re: FoxPro Browse. Проблема возврата после смены таблицы
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Может, не только "закрывается открытая таблица", но и окно W1 убить, может CLEAR READ добавить...
Ratings: 0 negative/0 positive
Re: FoxPro Browse. Проблема возврата после смены таблицы
akvvohinc
Автор

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
Видимо, вашего описания недостаточно для поиска ошибки.
Вот я попробовал примерно воспроизвести то, что вы делаете - проблемы не вижу (вашу замену таблицы через меню я имитирую нажатием F3):
SET TALK OFF
ON KEY LABEL F3 USE
m.n = 0
DO WHILE .T.
m.n = m.n+1
IF m.n%2=1
m.title = 'Таблица 1'
CREATE CURSOR curs1 (name C(20))
INSERT INTO curs1 VALUES('Таблица1 - запись 1')
INSERT INTO curs1 VALUES('Таблица1 - запись 2')
INSERT INTO curs1 VALUES('Таблица1 - запись 3')
ELSE
m.title = 'Таблица 2'
CREATE CURSOR curs2 (name C(20))
INSERT INTO curs2 VALUES('Таблица2 - запись 1')
INSERT INTO curs2 VALUES('Таблица2 - запись 2')
ENDIF
DEFINE WINDOW w1 FROM 1,1 TO 20,70 TITLE m.title
ACTIVATE WINDOW w1
BROWSE FIELDS name IN w1
ENDDO

Запускал в FoxPro for Dos 2.6



Исправлено 3 раз(а). Последнее : akvvohinc, 10.04.18 18:00
Ratings: 0 negative/0 positive
Re: FoxPro Browse. Проблема возврата после смены таблицы
Nina_G

Сообщений: 35
Дата регистрации: 22.04.2014
Пробовала и удалять и активировать окно в конце процедуры вызываемой из меню. Не помогает!
Ratings: 0 negative/0 positive
Re: FoxPro Browse. Проблема возврата после смены таблицы
Nina_G

Сообщений: 35
Дата регистрации: 22.04.2014
Я думаю, что тут дело в меню!
Ваш код натолкнул меня попробовать запустить процедуру Архив не из меню, а по нажатию горячей кнопки.
Всё получилось отлично!
Но заказчик не хочет отказываться от меню (define menu m1 bar in screen)). Стала тестировать на то, как другие процедуры, вызываемые из меню, возвращают управление в browse.
Поиск вызванный из меню возвращает управление browse, а вот просмотр записей бланком, если вызывать из меню, а не по горячей кнопке, то проблема та же, что и с Архивом.
Всю голову уже сломала. Очень хочется грохнуть это меню, но заказчик против
Ratings: 0 negative/0 positive
Re: FoxPro Browse. Проблема возврата после смены таблицы
Crispy

Сообщений: 18571
Дата регистрации: 16.05.2005
Nina_G
Я думаю, что тут дело в меню!
Ваш код натолкнул меня попробовать запустить процедуру Архив не из меню, а по нажатию горячей кнопки.
Всё получилось отлично!
Но заказчик не хочет отказываться от меню (define menu m1 bar in screen)). Стала тестировать на то, как другие процедуры, вызываемые из меню, возвращают управление в browse.
Поиск вызванный из меню возвращает управление browse, а вот просмотр записей бланком, если вызывать из меню, а не по горячей кнопке, то проблема та же, что и с Архивом.
Всю голову уже сломала. Очень хочется грохнуть это меню, но заказчик против

Лучше все же привести свой код - разумеется фрагментарно, убрав все неважное для понимания задачи. Скорее всего какая-то ошибка в порядке или расположении командных строк.
Также, для лучшего отображения здесь, приведенный код лучше всегда заключать в тэги CODE - т.е., выделив свой код в окошке ввода, нажать кнопку CODE над ним.


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)
Ratings: 0 negative/0 positive
Re: FoxPro Browse. Проблема возврата после смены таблицы
akvvohinc
Автор

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
Nina_G
Поиск вызванный из меню возвращает управление browse, а вот просмотр записей бланком, если вызывать из меню, а не по горячей кнопке, то проблема та же, что и с Архивом.

Приведите пример (с меню или без него), когда бы Browse не завершался при закрытии таблицы, которая в нем отображается.

Или, другими словами, сократите на время вашу процедуру работы с Архивом до одной команды USE, закрывающей ту таблицу, которая отображается в Browse, и посмотрите, завершается ли при этом Browse (добавьте после Browse какую-нибудь команду вывода, например WAIT 'Browse завершен!' WINDOW), то есть идет ли программа дальше. Если идет, то ошибка в вашей процедуре работы с Архивом.



Исправлено 4 раз(а). Последнее : akvvohinc, 11.04.18 13:29
Ratings: 0 negative/0 positive
Re: FoxPro Browse. Проблема возврата после смены таблицы
Nina_G

Сообщений: 35
Дата регистрации: 22.04.2014
Код очень навороченный с кучей процедур и окон. :-(
Ratings: 0 negative/0 positive
Re: FoxPro Browse. Проблема возврата после смены таблицы
Nina_G

Сообщений: 35
Дата регистрации: 22.04.2014
Процедура просмотра записи бланком проще, хотя там не столько запись смотрится бланком, сколько еще собирается информация по друггим таблицам в этот же бланк.
Попробовала Вашим методом: после очередного блока вставляла команду return и смотрела как поведет себя при выходе из Бланка. В этом случае таблица не меняется, соответственно выхода из browse нет, но управление обратно в browse не передаётся. Дошла до конца. В конце там две команды всего
Read cycle
release windows wBlank
закомментировала Read cycle а вместо неё написала wait window [Closed 10 sec.] timeout 10
и процедура завершилась как надо.
Самое интересное, что на форме есть кнопка Закрыть при нажатии которой стоит одна команда CLEAR READ
Но получается, что она не всё ощищает если Бланк запущен из меню, а не по горячей кнопке
Ratings: 0 negative/0 positive
Re: FoxPro Browse. Проблема возврата после смены таблицы
ry

Сообщений: 2113
Дата регистрации: 24.09.2007
Так и не понял из всех сообщений: в процедуре, вызываемой из меню, пробовали прописывать CLEAR READ, как советовал of63? Уже не помню, если честно, всех этих READ CYCLE, даже FPD под рукой нет для проверки, но READ, по идее, сбрасывать как-то нужно.
Ratings: 0 negative/0 positive
Re: FoxPro Browse. Проблема возврата после смены таблицы
akvvohinc
Автор

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
Nina_G
Код очень навороченный с кучей процедур и окон. :-(

1) Вы предположили, что проблема в меню.

2) Я в это не поверил и предложил проверить - вместо всего этого навороченного кода, вызывающегося из меню, в процедуре оставить всего одну строку(!) USE IN <table>.
Если Browse при этом закроется, то проблема в процедуре, а не в меню.

3) И если, как теперь выясняется, в процедуре вы выполняете некоторый READ, то ясно, что из него надо каким-то образом выходить, прежде чем управление перейдет назад к Browse.
Ratings: 0 negative/0 positive
Re: FoxPro Browse. Проблема возврата после смены таблицы
Nina_G

Сообщений: 35
Дата регистрации: 22.04.2014
akvvohinc
Если Browse при этом закроется, то проблема в процедуре, а не в меню.
А почему тогда эта же процедура , вызванная по горячей кнопке, возвращает управление в browse?
ry
Так и не понял из всех сообщений: в процедуре, вызываемой из меню, пробовали прописывать CLEAR READ, как советовал of63?
Да. Форма закрывается по нажатию на кнопку Закрыть, при этом выполняется команда Clear read. Read завершает свою работу, так как дальше выполняется команда release windows wBlank.
Ratings: 0 negative/0 positive
Re: FoxPro Browse. Проблема возврата после смены таблицы
ry

Сообщений: 2113
Дата регистрации: 24.09.2007
Nina_G
ry
Так и не понял из всех сообщений: в процедуре, вызываемой из меню, пробовали прописывать CLEAR READ, как советовал of63?
Да. Форма закрывается по нажатию на кнопку Закрыть, при этом выполняется команда Clear read. Read завершает свою работу, так как дальше выполняется команда release windows wBlank.
Все равно не понятно. Вы же предполагаете, что проблему вызывает процедура, вызываемая из меню. При чем же здесь другая процедура, вызываемая по кнопке Закрыть? При вызове из меню происходит очистка READ? Вот эти строки
Nina_G
Read cycle
release windows wBlank
из какой процедуры?
Ratings: 0 negative/0 positive
Re: FoxPro Browse. Проблема возврата после смены таблицы
Nina_G

Сообщений: 35
Дата регистрации: 22.04.2014
На экране меню, под ним browse. В меню есть пункт "Бланк" по выбору которого запускается процедура pBlank. Эта же процедура запускается если нажать на клавишу f4.
Процедура pBlank представляет собой новое окно, в котором отображаются записи таблицы из browse и из связанных с ней таблиц. В этом окне есть три кнопки "Предыдущая", "Следующая", "Закрыть".
Если данную процедуру вызывать по горячей кнопке, то после перемещений в бланке на другие записи и закрытия окна бланка, управление передаётся browse, в котором текущей записью становится та запись, на которой остановились в бланке. Если вызывать эту же процедуру из меню, то после закрытия окна Бланка, непонятно к чему передалось управление, так как ни один пункт меню не подсвечен и browse не активен, при этом пару раз щёлкнув на browse он всё-таки становится активным, но курсор записи оказывается не на той записи, на которой остановились в бланке.
on key label f4 do pBlank
on key label f10 activate menu m1
Define menu m1 bar in screen
define pad m11 of m1 prompt 'Бланк'
on selection pad m11 of m1 do pBlank
m.title='Актуальная'
do while .T.
define window w1 from 1,1 to 20,70 title m.title
activate window w1
browse in w1
if lastkey()=27
exit
endif
enddo
procedure pBlank
define window wBlank from 3,6 to 20,72
activate window wBlank
lnext=iif(eof(),'\\','')
lpred=iif(bof(),'\\','')
*----
*блок разных say,get
*----
@ 16,6 say 'Следующая'+space(13)+'Предыдущая'+space(14)+'Выход'
@ 16,5 get m.but default 1 size 1,12,10 picture '@*IH 'lNext+';'+lPred+';' valid pbut()
read cycle
release window wBlank
procedure pbut
do case
case m.but=3
clear read
case m.but=1
skip
scatter memvar
*блок обновления данных на форме
case m.but=2
skip -1
scatter memvar
*блок обновления данных на форме
endcase



Исправлено 3 раз(а). Последнее : Nina_G, 12.04.18 10:14
Ratings: 0 negative/0 positive
Re: FoxPro Browse. Проблема возврата после смены таблицы
Crispy

Сообщений: 18571
Дата регистрации: 16.05.2005
Не совсем удачная вся конструкция, на мой взгляд.
Тот же read cycle не советую использовать, очень капризная вещь, лучше при необходимости использовать вместо нее просто цикл do while с обычным read. Также сам browse как-то нехорошо встроен. И похоже меню не совсем правильно работает.
Т.е. если по f10 оно активируется - activate menu m1, то где-то по идее должно и деактивироваться. В частности в процедуре pBlank и возможно в самом цикле. Из-за этого похоже фокус и не передается сразу окну с browse. Также советую все же переделать read cycle. Ну это все как бы навскидку, а так - попробовать конечно нужно, и лучше с отслеживанием.
Обычно проще всего это делать - вставив временно перед проблемным местом команду SET STEP ON. И далее, после остановки, активировать окно Debug для ввода в него параметров и функций, значения которых нужно увидеть. Я например когда-то в FPD специально повесил вызов окна Debug на Alt+F2, а самого окна Trace, где можно проходить по командам нажатием S - на Alt+F1. Прописав эти и другие полезные вызовы в Макросы Фокспро (в главном меню среды) каталога разработки. Также полезно иметь клавиши и для запуска окна View, чтобы видеть активные таблицы и активные записи в них.
Т.е., если ввести в окне Debug любую функцию (или комбинацию функций), скажем WONTOP() можно увидеть, какое окно активно в каждый момент. Также можно вводить и свои, определенные где-то в коде, функции, наблюдая изменение возвращаемых ими значений. Либо, открыв через View нужную таблицу (она сама открывается через свой browse), наблюдать в ней, как перемещается указатель по записям и т.д.
В общем, через удобно подстроенную для себя отладку почти всегда можно довольно легко найти проблемное место в коде. Отладчик чуть менее полезен разве что в командах типа SELECT-SQL. Но там уже просто своя логика нахождения ошибок.
Также на момент отладки полезно бывает включить установку SET ESCAPE, которую обычно отключают в рабочей программе. С ее помощью иногда удобно завершать подвисшую при отладке программу через Esc.


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)
Ratings: 0 negative/1 positive
Re: FoxPro Browse. Проблема возврата после смены таблицы
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Отладка всего связанного с активизацией окон/меню/фокусом ввода к сожалению является нетривиальной задачей, насколько я помню в FPD так же как и в VFP. Проблема в том что сам отладчик со своими окнами вмешивается в этот самый процесс активации/деактивации окон/полей ввода.
Именно для отладки этих нюансов лучше всего делать записи в лог-файл - кто когда активируется/деактивируется, кто там WONTOP/WOUTPUT или просто WEXIST в интересующих точках (вход/выход в процедуры, просто "в текущий момент" - если повесить вывод данных в лог на хоткей)...


------------------
WBR, Igor
Ratings: 0 negative/1 positive
Re: FoxPro Browse. Проблема возврата после смены таблицы
akvvohinc
Автор

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
Nina_G
На экране меню, под ним browse. В меню есть пункт "Бланк" по выбору которого запускается процедура pBlank. Эта же процедура запускается если нажать на клавишу f4.
Процедура pBlank представляет собой новое окно, в котором отображаются записи таблицы из browse и из связанных с ней таблиц. В этом окне есть три кнопки "Предыдущая", "Следующая", "Закрыть".
Если данную процедуру вызывать по горячей кнопке, то после перемещений в бланке на другие записи и закрытия окна бланка, управление передаётся browse, в котором текущей записью становится та запись, на которой остановились в бланке. Если вызывать эту же процедуру из меню, то после закрытия окна Бланка, непонятно к чему передалось управление, так как ни один пункт меню не подсвечен и browse не активен, при этом пару раз щёлкнув на browse он всё-таки становится активным, но курсор записи оказывается не на той записи, на которой остановились в бланке.

У меня ваш пример после исправления некоторых несущественных ошибок и добавления таблицы для Browse работает (и по F4, и через меню):
Часть текста скрыта
set talk off
on key label f4 do pBlank
on key label f10 activate menu m1
Define menu m1 bar in screen
define pad m11 of m1 prompt 'Бланк'
on selection pad m11 of m1 do pBlank
CREATE CURSOR curs1 (name C(20))
INSERT INTO curs1 VALUES('Таблица1 - запись 1')
INSERT INTO curs1 VALUES('Таблица1 - запись 2')
INSERT INTO curs1 VALUES('Таблица1 - запись 3')
go top
m.title='Актуальная'
do while .T.
define window w1 from 1,1 to 20,70 title m.title
activate window w1
browse in w1
if lastkey()=27
exit
endif
enddo
clea all
procedure pBlank
define window wBlank from 3,6 to 22,72
activate window wBlank
lnext=iif(eof(),'\\','')
lpred=iif(bof(),'\\','')
*----
*блок разных say,get
*----
@ 16,6 say 'Следующая'+space(13)+'Предыдущая'+space(14)+'Выход'
@ 16,5 get m.but default 1 size 1,12,10 picture '@*IH '+lNext+';'+lPred+';' valid pbut()
read cycle
release window wBlank
procedure pbut
do case
case m.but=3
clear read
case m.but=1
if !eof()
skip
endif
scatter memvar
@17,6 say 'Запись N '+allt(str(recno()))
*блок обновления данных на форме
case m.but=2
if !bof()
skip -1
endif
scatter memvar
@17,6 say 'Запись N '+allt(str(recno()))
*блок обновления данных на форме
endcase


Цитата:
после закрытия окна Бланка, непонятно к чему передалось управление, так как ни один пункт меню не подсвечен и browse не активен, при этом пару раз щёлкнув на browse он всё-таки становится активным

Возможно, после закрытия окна Бланка, у вас автоматически не активизируется окно с Browse (кто знает, сколько у вас окон, а кроме того, есть еще и SCREEN).
Поэтому после закрытия wBlank попробуйте активизировать это окно явно:
activate window w1



Исправлено 3 раз(а). Последнее : akvvohinc, 12.04.18 15:30
Ratings: 0 negative/0 positive
Re: FoxPro Browse. Проблема возврата после смены таблицы
Nina_G

Сообщений: 35
Дата регистрации: 22.04.2014
akvvohinc
Поэтому после закрытия wBlank попробуйте активизировать это окно явно
Это было первым, что я попробовала сделать - не помогло! Пробовала также деактивировать меню - тоже не помогло.
Есть в FoxPro какая-нибудь команда типа команды VFp: SET COVERAGE TO <имя файла>?
Через wait window и трассировщик (тут правильно было написано, что процессы активации/деактивации окон, меню и т.п. не отследишь, так как отладчик перехватывает управление) попыталась сравнить разницу при вызове процедуры по кнопке и через меню. ВСЁ! Буквально всё одинаково: rdlevel()=0, перед выходом из процедуры активно окно w1 и оно же является окном вывода информации, но явно на экране картинки разные. Я полагаю, что процедуры запущенные из меню, возвращают управление если не меню (оно деактивировано на этот момент), то экрану. Как с этим бороться не знаю. Пользователи работают пока с такой программой, про проблему скорее всего и не знают - они работают с кнопками, тянуться за мышью, чтобы выбрать в меню кнопку им лень. Но меня это мучает, хочу разобраться.
Ratings: 0 negative/0 positive
Re: FoxPro Browse. Проблема возврата после смены таблицы
Crispy

Сообщений: 18571
Дата регистрации: 16.05.2005
Nina_G
Пробовала также деактивировать меню - тоже не помогло.

Возможно тут еще и read cycle "вносит свою лепту". Очень непростая команда, из-за чего когда-то в FPD полностью отказался от нее.
Кроме того, важен порядок расположения команды деактивации - она случайно не после read стоит? Можно также попробовать и вовсе вставить ее сразу в определении меню в ON SELECTION MENU.
Также все-таки мне кажется стоит попробовать в процедуре вместо read cycle поставить обычный цикл с простым read и проверкой Esc для выхода.


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)
Ratings: 0 negative/0 positive
Re: FoxPro Browse. Проблема возврата после смены таблицы
Nina_G

Сообщений: 35
Дата регистрации: 22.04.2014
Crispy
порядок расположения команды деактивации - она случайно не после read стоит?
Сначала поставила первой командой в процедуре pBlank, потом после Read cycle.
Ставила команды:
activate window w1 NOSHOW
activate window wBlank
READ
непосредственно перед read, даже убирала cycle, но итог не поменялся.

Crispy
Можно также попробовать и вовсе вставить ее сразу в определении меню в ON SELECTION MENU
Меню навороченное, всё переписывать под on selection menu тяжко.
Я поставила сразу после описания меню
on selection menu m1 do pMenu
и закомментировала on selection pad m14 of m1 do pBlank

procedure pMenu
if pad()='m14'
do pBlank
endif

Результата не дало.
А результат дало вот что, я заметила, что после выбора в меню "Поиск", выпадает список вариантов поиска и после отработки процедуры поиска управление возвращается browse.
взяла и заменила вместо одной из процедуры вызов процедуры Бланка и всё заработало как надо!

define menu m1 bar in screen
define pad m12 of m1 prompt 'Поиск'
define pad m14 of m1 prompt 'Бланк'
on pad m12 of m1 activate popup pSeek
define popup pSeek
define bar 1 of pSeek prompt 'По А'
define bar 2 of pSeek prompt 'По Б'
on selection bar 1 of pSeek do pA
on selection bar 2 of pSeek do pBlank &&pB -



Исправлено 2 раз(а). Последнее : Nina_G, 16.04.18 08:24
Ratings: 0 negative/0 positive


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

On-line: 23 (Гостей: 23)

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