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 |
Re: FoxPro Browse. Проблема возврата после смены таблицы | |
---|---|
of63 Сообщений: 25256 Откуда: Н.Новгород Дата регистрации: 13.02.2008 |
Может, не только "закрывается открытая таблица", но и окно W1 убить, может CLEAR READ добавить...
|
Re: FoxPro Browse. Проблема возврата после смены таблицы | |
---|---|
akvvohinc Автор Сообщений: 4224 Откуда: Москва Дата регистрации: 11.11.2008 |
Видимо, вашего описания недостаточно для поиска ошибки.
Вот я попробовал примерно воспроизвести то, что вы делаете - проблемы не вижу (вашу замену таблицы через меню я имитирую нажатием F3):
Запускал в FoxPro for Dos 2.6 Исправлено 3 раз(а). Последнее : akvvohinc, 10.04.18 18:00 |
Re: FoxPro Browse. Проблема возврата после смены таблицы | |
---|---|
Nina_G Сообщений: 35 Дата регистрации: 22.04.2014 |
Пробовала и удалять и активировать окно в конце процедуры вызываемой из меню. Не помогает!
|
Re: FoxPro Browse. Проблема возврата после смены таблицы | |
---|---|
Nina_G Сообщений: 35 Дата регистрации: 22.04.2014 |
Я думаю, что тут дело в меню!
Ваш код натолкнул меня попробовать запустить процедуру Архив не из меню, а по нажатию горячей кнопки. Всё получилось отлично! Но заказчик не хочет отказываться от меню (define menu m1 bar in screen)). Стала тестировать на то, как другие процедуры, вызываемые из меню, возвращают управление в browse. Поиск вызванный из меню возвращает управление browse, а вот просмотр записей бланком, если вызывать из меню, а не по горячей кнопке, то проблема та же, что и с Архивом. Всю голову уже сломала. Очень хочется грохнуть это меню, но заказчик против |
Re: FoxPro Browse. Проблема возврата после смены таблицы | |
---|---|
Crispy Сообщений: 18571 Дата регистрации: 16.05.2005 |
Лучше все же привести свой код - разумеется фрагментарно, убрав все неважное для понимания задачи. Скорее всего какая-то ошибка в порядке или расположении командных строк. Также, для лучшего отображения здесь, приведенный код лучше всегда заключать в тэги CODE - т.е., выделив свой код в окошке ввода, нажать кнопку CODE над ним. ------------------ В действительности все иначе, чем на самом деле. (Антуан де Сент-Экзюпери) |
Re: FoxPro Browse. Проблема возврата после смены таблицы | |
---|---|
akvvohinc Автор Сообщений: 4224 Откуда: Москва Дата регистрации: 11.11.2008 |
Приведите пример (с меню или без него), когда бы Browse не завершался при закрытии таблицы, которая в нем отображается. Или, другими словами, сократите на время вашу процедуру работы с Архивом до одной команды USE, закрывающей ту таблицу, которая отображается в Browse, и посмотрите, завершается ли при этом Browse (добавьте после Browse какую-нибудь команду вывода, например WAIT 'Browse завершен!' WINDOW), то есть идет ли программа дальше. Если идет, то ошибка в вашей процедуре работы с Архивом. Исправлено 4 раз(а). Последнее : akvvohinc, 11.04.18 13:29 |
Re: FoxPro Browse. Проблема возврата после смены таблицы | |
---|---|
Nina_G Сообщений: 35 Дата регистрации: 22.04.2014 |
Код очень навороченный с кучей процедур и окон. :-(
|
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 Но получается, что она не всё ощищает если Бланк запущен из меню, а не по горячей кнопке |
Re: FoxPro Browse. Проблема возврата после смены таблицы | |
---|---|
ry Сообщений: 2113 Дата регистрации: 24.09.2007 |
Так и не понял из всех сообщений: в процедуре, вызываемой из меню, пробовали прописывать CLEAR READ, как советовал of63? Уже не помню, если честно, всех этих READ CYCLE, даже FPD под рукой нет для проверки, но READ, по идее, сбрасывать как-то нужно.
|
Re: FoxPro Browse. Проблема возврата после смены таблицы | |
---|---|
akvvohinc Автор Сообщений: 4224 Откуда: Москва Дата регистрации: 11.11.2008 |
1) Вы предположили, что проблема в меню. 2) Я в это не поверил и предложил проверить - вместо всего этого навороченного кода, вызывающегося из меню, в процедуре оставить всего одну строку(!) USE IN <table>. Если Browse при этом закроется, то проблема в процедуре, а не в меню. 3) И если, как теперь выясняется, в процедуре вы выполняете некоторый READ, то ясно, что из него надо каким-то образом выходить, прежде чем управление перейдет назад к Browse. |
Re: FoxPro Browse. Проблема возврата после смены таблицы | |
---|---|
Nina_G Сообщений: 35 Дата регистрации: 22.04.2014 |
А почему тогда эта же процедура , вызванная по горячей кнопке, возвращает управление в browse? Да. Форма закрывается по нажатию на кнопку Закрыть, при этом выполняется команда Clear read. Read завершает свою работу, так как дальше выполняется команда release windows wBlank. |
Re: FoxPro Browse. Проблема возврата после смены таблицы | |
---|---|
ry Сообщений: 2113 Дата регистрации: 24.09.2007 |
Все равно не понятно. Вы же предполагаете, что проблему вызывает процедура, вызываемая из меню. При чем же здесь другая процедура, вызываемая по кнопке Закрыть? При вызове из меню происходит очистка READ? Вот эти строки из какой процедуры? |
Re: FoxPro Browse. Проблема возврата после смены таблицы | |
---|---|
Nina_G Сообщений: 35 Дата регистрации: 22.04.2014 |
На экране меню, под ним browse. В меню есть пункт "Бланк" по выбору которого запускается процедура pBlank. Эта же процедура запускается если нажать на клавишу f4.
Процедура pBlank представляет собой новое окно, в котором отображаются записи таблицы из browse и из связанных с ней таблиц. В этом окне есть три кнопки "Предыдущая", "Следующая", "Закрыть". Если данную процедуру вызывать по горячей кнопке, то после перемещений в бланке на другие записи и закрытия окна бланка, управление передаётся browse, в котором текущей записью становится та запись, на которой остановились в бланке. Если вызывать эту же процедуру из меню, то после закрытия окна Бланка, непонятно к чему передалось управление, так как ни один пункт меню не подсвечен и browse не активен, при этом пару раз щёлкнув на browse он всё-таки становится активным, но курсор записи оказывается не на той записи, на которой остановились в бланке.
Исправлено 3 раз(а). Последнее : Nina_G, 12.04.18 10:14 |
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. ------------------ В действительности все иначе, чем на самом деле. (Антуан де Сент-Экзюпери) |
Re: FoxPro Browse. Проблема возврата после смены таблицы | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Отладка всего связанного с активизацией окон/меню/фокусом ввода к сожалению является нетривиальной задачей, насколько я помню в FPD так же как и в VFP. Проблема в том что сам отладчик со своими окнами вмешивается в этот самый процесс активации/деактивации окон/полей ввода.
Именно для отладки этих нюансов лучше всего делать записи в лог-файл - кто когда активируется/деактивируется, кто там WONTOP/WOUTPUT или просто WEXIST в интересующих точках (вход/выход в процедуры, просто "в текущий момент" - если повесить вывод данных в лог на хоткей)... ------------------ WBR, Igor |
Re: FoxPro Browse. Проблема возврата после смены таблицы | |
---|---|
akvvohinc Автор Сообщений: 4224 Откуда: Москва Дата регистрации: 11.11.2008 |
У меня ваш пример после исправления некоторых несущественных ошибок и добавления таблицы для Browse работает (и по F4, и через меню):
Часть текста скрыта
Цитата: Возможно, после закрытия окна Бланка, у вас автоматически не активизируется окно с Browse (кто знает, сколько у вас окон, а кроме того, есть еще и SCREEN). Поэтому после закрытия wBlank попробуйте активизировать это окно явно:
Исправлено 3 раз(а). Последнее : akvvohinc, 12.04.18 15:30 |
Re: FoxPro Browse. Проблема возврата после смены таблицы | |
---|---|
Nina_G Сообщений: 35 Дата регистрации: 22.04.2014 |
Это было первым, что я попробовала сделать - не помогло! Пробовала также деактивировать меню - тоже не помогло. Есть в FoxPro какая-нибудь команда типа команды VFp: SET COVERAGE TO <имя файла>? Через wait window и трассировщик (тут правильно было написано, что процессы активации/деактивации окон, меню и т.п. не отследишь, так как отладчик перехватывает управление) попыталась сравнить разницу при вызове процедуры по кнопке и через меню. ВСЁ! Буквально всё одинаково: rdlevel()=0, перед выходом из процедуры активно окно w1 и оно же является окном вывода информации, но явно на экране картинки разные. Я полагаю, что процедуры запущенные из меню, возвращают управление если не меню (оно деактивировано на этот момент), то экрану. Как с этим бороться не знаю. Пользователи работают пока с такой программой, про проблему скорее всего и не знают - они работают с кнопками, тянуться за мышью, чтобы выбрать в меню кнопку им лень. Но меня это мучает, хочу разобраться. |
Re: FoxPro Browse. Проблема возврата после смены таблицы | |
---|---|
Crispy Сообщений: 18571 Дата регистрации: 16.05.2005 |
Возможно тут еще и read cycle "вносит свою лепту". Очень непростая команда, из-за чего когда-то в FPD полностью отказался от нее. Кроме того, важен порядок расположения команды деактивации - она случайно не после read стоит? Можно также попробовать и вовсе вставить ее сразу в определении меню в ON SELECTION MENU. Также все-таки мне кажется стоит попробовать в процедуре вместо read cycle поставить обычный цикл с простым read и проверкой Esc для выхода. ------------------ В действительности все иначе, чем на самом деле. (Антуан де Сент-Экзюпери) |
Re: FoxPro Browse. Проблема возврата после смены таблицы | |
---|---|
Nina_G Сообщений: 35 Дата регистрации: 22.04.2014 |
Сначала поставила первой командой в процедуре pBlank, потом после Read cycle. Ставила команды:
Меню навороченное, всё переписывать под on selection menu тяжко. Я поставила сразу после описания меню on selection menu m1 do pMenu и закомментировала on selection pad m14 of m1 do pBlank
Результата не дало. А результат дало вот что, я заметила, что после выбора в меню "Поиск", выпадает список вариантов поиска и после отработки процедуры поиска управление возвращается browse. взяла и заменила вместо одной из процедуры вызов процедуры Бланка и всё заработало как надо!
Исправлено 2 раз(а). Последнее : Nina_G, 16.04.18 08:24 |
© 2000-2024 Fox Club  |