for flooders
:: Главная :: Решения :: Статьи :: Сайт М. Дроздова :: Файловый архив :: Книга по VFP 9 :: Русский Help Online :: OFF-LINE Форум
   Л и с о в о д ы   в с е х   с т р а н,  о б ъ е д и н я й т е с ь !!!  

Список Форумов  :: Visual Foxpro, Foxpro for DOS
   :: Помощь сайту :: 

FoxPro Browse. Проблема возврата после смены таблицы
Nina_G
Автор

Сообщений: 34
Дата: 10.04.18 16:32:56ОтветитьЦитировать
Здравствуйте.
Дали задание в старой программе, написанной на 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

Сообщений: 11781
Откуда: Н.Новгород
Дата: 10.04.18 17:03:24ОтветитьЦитировать
Может, не только "закрывается открытая таблица", но и окно W1 убить, может CLEAR READ добавить...
Ratings: 0 negative/0 positive

Re: FoxPro Browse. Проблема возврата после смены таблицы
akvvohinc

Сообщений: 2791
Откуда: Москва
Дата: 10.04.18 17:54:34ОтветитьЦитировать
Видимо, вашего описания недостаточно для поиска ошибки.
Вот я попробовал примерно воспроизвести то, что вы делаете - проблемы не вижу (вашу замену таблицы через меню я имитирую нажатием 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



Исправлено: akvvohinc, 10.04.18 18:00
Ratings: 0 negative/0 positive

Re: FoxPro Browse. Проблема возврата после смены таблицы
Nina_G
Автор

Сообщений: 34
Дата: 11.04.18 08:24:55ОтветитьЦитировать
Пробовала и удалять и активировать окно в конце процедуры вызываемой из меню. Не помогает!
Ratings: 0 negative/0 positive

Re: FoxPro Browse. Проблема возврата после смены таблицы
Nina_G
Автор

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

Re: FoxPro Browse. Проблема возврата после смены таблицы
Crispy

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

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


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

Re: FoxPro Browse. Проблема возврата после смены таблицы
akvvohinc

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

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

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



Исправлено: akvvohinc, 11.04.18 13:29
Ratings: 0 negative/0 positive

Re: FoxPro Browse. Проблема возврата после смены таблицы
Nina_G
Автор

Сообщений: 34
Дата: 11.04.18 16:18:30ОтветитьЦитировать
Код очень навороченный с кучей процедур и окон. :-(
Ratings: 0 negative/0 positive

Re: FoxPro Browse. Проблема возврата после смены таблицы
Nina_G
Автор

Сообщений: 34
Дата: 11.04.18 16:27:44ОтветитьЦитировать
Процедура просмотра записи бланком проще, хотя там не столько запись смотрится бланком, сколько еще собирается информация по друггим таблицам в этот же бланк.
Попробовала Вашим методом: после очередного блока вставляла команду 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

Сообщений: 1954
Дата: 11.04.18 17:53:28ОтветитьЦитировать
Так и не понял из всех сообщений: в процедуре, вызываемой из меню, пробовали прописывать CLEAR READ, как советовал of63? Уже не помню, если честно, всех этих READ CYCLE, даже FPD под рукой нет для проверки, но READ, по идее, сбрасывать как-то нужно.
Ratings: 0 negative/0 positive

Re: FoxPro Browse. Проблема возврата после смены таблицы
akvvohinc

Сообщений: 2791
Откуда: Москва
Дата: 11.04.18 18:43:32ОтветитьЦитировать
Nina_G
Код очень навороченный с кучей процедур и окон. :-(

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

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

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

Re: FoxPro Browse. Проблема возврата после смены таблицы
Nina_G
Автор

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

Re: FoxPro Browse. Проблема возврата после смены таблицы
ry

Сообщений: 1954
Дата: 12.04.18 08:44:01ОтветитьЦитировать
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
Автор

Сообщений: 34
Дата: 12.04.18 09:16:13ОтветитьЦитировать
На экране меню, под ним 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



Исправлено: Nina_G, 12.04.18 10:14
Ratings: 0 negative/0 positive

Re: FoxPro Browse. Проблема возврата после смены таблицы
Crispy

Сообщений: 13118
Дата: 12.04.18 11:58:02ОтветитьЦитировать
Не совсем удачная вся конструкция, на мой взгляд.
Тот же 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

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


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

Re: FoxPro Browse. Проблема возврата после смены таблицы
akvvohinc

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

У меня ваш пример после исправления некоторых несущественных ошибок и добавления таблицы для Browse работает (и по F4, и через меню):

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

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



Исправлено: akvvohinc, 12.04.18 15:30
Ratings: 0 negative/0 positive

Re: FoxPro Browse. Проблема возврата после смены таблицы
Nina_G
Автор

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

Re: FoxPro Browse. Проблема возврата после смены таблицы
Crispy

Сообщений: 13118
Дата: 13.04.18 11:40:03ОтветитьЦитировать
Nina_G
Пробовала также деактивировать меню - тоже не помогло.

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


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

Re: FoxPro Browse. Проблема возврата после смены таблицы
Nina_G
Автор

Сообщений: 34
Дата: 13.04.18 16:39:06ОтветитьЦитировать
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 -



Исправлено: Nina_G, 16.04.18 08:24
Ratings: 0 negative/0 positive



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

On-line: 30 Mitchman comsel  and Guests: 28


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