:: Visual Foxpro, Foxpro for DOS
вопрос по гриду
DmitryKn
Автор

Сообщений: 300
Дата регистрации: 06.04.2022
Здравствуйте всем!

Извращаюсь в гриде, возникла такая ситуация:
в одной из колонок Column5.text1.Valid содержит:
IF THISFORM.lIsEdit
IF view1.fld8 = .t. && признак наличия услуги к этому товару
LOCAL lnState, lc1ckey, lnquant
lc1ckey =view1.c1ckey
lnState=GetFldState(JustExt(This.ControlSource),JustStem(This.ControlSource))
IF InList(m.lnState,2,4)
IF MESSAGEBOX('Добавить услугу?',4+32) = 6
m.lnquant = this.Value
thisform.griaddserv(m.lc1ckey, lnquant) && добавляю в грид строку с услугой
ENDIF
ENDIF
ENDIF
thisform.calc
THISFORM.pgfOrd.pagOrd.grdOrd_d.Refresh()
ENDIF
т.е. при выполнении условия и изменении количества в колонке должно спросить, хочу ли добавить строку, и при желании, добавляет.
Работает только в первой строке грида, в остальных не работает. При добавлении новой строки и нового значения в Column5.text1.Valid, т.е. в исходной таблице этого еще нет, тоже не работает.

Может посоветуете чего?
Ratings: 0 negative/0 positive
Re: вопрос по гриду
akvvohinc

Сообщений: 4203
Откуда: Москва
Дата регистрации: 11.11.2008
DmitryKn
Работает только в первой строке грида, в остальных не работает.
Может посоветуете чего?
Пройтись пошагово в режиме отладки, чтобы вместо "работает/не работает" вы назвали ту команду, которая не отрабатывает так, как вы ожидаете.

По приведенному коду ничего однозначно сказать нельзя, так как только вы знаете, к примеру, что такое и чему равно THISFORM.lIsEdit или view1.fld8, и зависят ли они от записи таблицы (строки грида).
А я вполне могу предположить, что на какой-то строке эти выражения истинны, а в других - ложны.
Ratings: 0 negative/0 positive
Re: вопрос по гриду
DmitryKn
Автор

Сообщений: 300
Дата регистрации: 06.04.2022
В этом случае они всегда .t. , откуда и вопрос.

Мне кажется, что не срабатывает
lnState=GetFldState(JustExt(This.ControlSource),JustStem(This.ControlSource))
Вернее, срабатывает только в первой строке, а в последующих нет. Может настройка, грида какая-то



Исправлено 1 раз(а). Последнее : DmitryKn, 18.11.22 12:58
Ratings: 0 negative/0 positive
Re: вопрос по гриду
PaulWist

Сообщений: 14601
Дата регистрации: 01.04.2004
Тут надо ориентироваться на алиас view1, и что в момент срабатывания Valid лежит в поле view1.fld8 (возможно там EOF()), поэтому код автоматического добавления не срабатывает.

И посмотреть, что возвращается в lnState.


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: вопрос по гриду
akvvohinc

Сообщений: 4203
Откуда: Москва
Дата регистрации: 11.11.2008
DmitryKn
Мне кажется, что не срабатывает...
А почему всё же вы это не утверждаете, а предполагаете?
Что мешает запустить дебаггер или хотя бы вставить команды типа WAIT WINDOW, чтобы знать точно, чему равны переменные в том (хорошем) и других (плохих) случаях.
Ratings: 0 negative/0 positive
Re: вопрос по гриду
Taran

Сообщений: 13623
Откуда: Красноярск
Дата регистрации: 16.01.2008
DmitryKn
lnState=GetFldState(JustExt(This.ControlSource),JustStem(This.ControlSource))

Не, ну ты конечно молодец. Никакой обфускатор не нужен.
Какого фига тут делают файловые функции JustExt, JustStem?
При этом ты алиас тут же порой указываешь явно. Да и поле скорей всего известно.
Но если уж и вычислять, то GetWordNum - самое то.

DmitryKn
lnState=GetFldState(GetWordNum(This.ControlSource,2), GetWordNum(This.ControlSource,1))

Извини, но и в целом по стилю.
Ты из form.grid.column.text.valid несколько раз обращаешься к thisform и один раз к объекту на этом самом thisform.
Не должен твой form.grid.column.text ничего знать про всё что выше него, кроме родителя или формы.
Делай на форме метод и из form.grid.column.text.valid обращайся к нему типа
thisform.doValid(this)
А вот метод формы уже имеет право юзать объекты.
Иначе пройдут годы и сопровождать запаришься.
...
Ну это так, поболтать под Каберне.



Исправлено 2 раз(а). Последнее : Taran, 18.11.22 18:46
Ratings: 0 negative/0 positive
Re: вопрос по гриду
DmitryKn
Автор

Сообщений: 300
Дата регистрации: 06.04.2022
Taran
Не, ну ты конечно молодец...

За совет спасибо, с критикой целиком согласен, выражение нашел где-то то ли тут , то ли на на бывшем SQL.ru и просто скопировал.
Конечно, нужно было
GetFldState("field")

привел в порядок, все чудесно работает, спасибо!

Цитата:
...
Ну это так, поболтать под Каберне.

Кислятина раздражает желудок, ослабляет душу и мужское начало. Для мужчины лучшее вино - это водка, для особо взыскательных можно охлажденную, рекомендую.
Ratings: 0 negative/0 positive
Re: вопрос по гриду
DmitryKn
Автор

Сообщений: 300
Дата регистрации: 06.04.2022
akvvohinc
DmitryKn
Мне кажется, что не срабатывает...
А почему всё же вы это не утверждаете, а предполагаете?
Что мешает запустить дебаггер ...

Откровенно говоря, я не сильно дебаггером владею, про него не так уж много написано, и как его практически применить мне не совсем ясно. Если прогу из него запускать, то не запускается, старт и приложение в разных папках. Пытался как-то вставить SET STEP ON в методе Init формы, так не реагирует. Месседжбоксы впихиваю, муторно конечно, но как есть.
Ratings: 0 negative/0 positive
Re: вопрос по гриду
Владимир Максимов

Сообщений: 14095
Откуда: Москва
Дата регистрации: 02.09.2000
В Вашем вопросе основная проблема в том, что никто не понимает, что означает фраза "не работает"? Что именно "не работает"? Какая именно команда? Вот народ и пустился "во все тяжкие" со своими предположениями.

Сам по себе код рабочий (не вполне корректный, но, может, мы чего-то не видим). Но что именно "не работает" без отладки сказать невозможно. Остается только предполагать, что раз проблема после первого срабатывания thisform.griaddserv(), то, скорее всего, внутри этого метода происходит изменение настроек Grid и значение ControlSource уже другое. Но это предположение. Как оно на самом деле, ищите сами

С отладчиком нет никаких проблем. Ставите точку останова прямо в коде. Двойной клик мышки по левой границе строки кода - там появится красный кружок. Или явно SET STEP ON в коде перед проблемной командой. В init-формы смысла нет. Вас же не процесс загрузки формы интересует, а именно конкретный метод. Вот в методе точку останова и ставьте

Замечание: Чтобы перейти в режим отладки это самое окно отладчика должно быть открыто ДО запуска кода. Вот при открытом окне отладчика код и надо запускать. Собственно, это окно должно открыться само при установке точки останова в дизайнере двойным кликом мыши. Но можно и явно через пункт меню Tools \ Debugger

А дальше после открытия окна отладчика, жмете F8 для выполнения очередной команды или иконку со стрелкой внутрь фигурных скобок в ToolBar окна отладки. При остановке кода в окне отладки подводите мышку (не нажимая) к интересующей Вас переменной и увидите ее значение. Или в окне Watch можно ввести нужную переменную, чтобы посмотреть ее текущее значение

Когда с отладкой закончили, то жмете в окне отладчика иконку треугольника

PS: Если у Grid меняют источник данных Grid.RecordSource, то это может привести к описанной проблеме. Подробности здесь

Пропадают настройки Grid, события столбцов, заголовков, ячеек



Исправлено 1 раз(а). Последнее : Владимир Максимов, 19.11.22 20:27
Ratings: 0 negative/1 positive
Re: вопрос по гриду
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
> Пытался как-то вставить SET STEP ON в методе Init формы, так не реагирует.

Эта команда (SET STEP ON) игнорируется, если программа запущена НЕ ИЗ ПОД IDE фокса, т.е. не из командного окна в IDE. Запустить-то просто из командного окна - кнопкой Ctrl-D, выбрать запускаемый EXE или APP (надо, чтобы файл проекта, исходники его, были видны, темная история, где фокс их ищет), но если скомпилять проект, и нажать Ctrl-D, выбрать EXE-шник (лежащий рядом с файлом проекта PJX), то он запустится, и на команде SET STEP ON должно высветится окно "дебагера". Далее "идем по шагам" (кнопка F6 и другие, внутрь заглядываем процедур, другой кнопкой, попутно ставим метки останова в левой колонке текста, вобщем надо юзать, если жизнь заставляет!...)

После выхода из проги при таком запуске, если не предприняты меры сохранения/восстановления окружения фоксового настроения (типа "размер окна" и пр.), то будет нехорошо. Некоторые выключают фокс вообще, а потом запускают его заново, тогда восстанавливается привычный IDE фокса. парой 10-ков строк кода все можно сохранять и возвращать (параметры IDE фокса) взад. Тогда можно запускать процесс отладки проги многократно, из одного сеанса IDE фокса...
Ratings: 0 negative/1 positive
Re: вопрос по гриду
DmitryKn
Автор

Сообщений: 300
Дата регистрации: 06.04.2022
Спасибо всем,
вроде жизнь налаживается, дело пошло )
Ratings: 0 negative/0 positive
Re: вопрос по гриду
DmitryKn
Автор

Сообщений: 300
Дата регистрации: 06.04.2022
С дебагом не получается.

В методе формы в начале красная точка, пару строк ниже set step on. Запускаю приложение обычным способом - ничего не происходит.

Тогда:

1.Открываю фокс, Tools\Debagger - окно дебага открыто.
2.В методе формы в начале красная точка, пару строк ниже set step on. Запускаю приложение обычным способом - опять ничего не происходит.

Запустить приложение из-под IDE тоже не получается - стартует exe, потом основное app , лежат в разных папках в разных директориях.

Как этот дебаг открыть-то ? Только не надо говорить, что именно мне дебаг открывать необязательно и даже не нужно



Исправлено 1 раз(а). Последнее : DmitryKn, 20.11.22 10:13
Ratings: 0 negative/0 positive
Re: вопрос по гриду
akvvohinc

Сообщений: 4203
Откуда: Москва
Дата регистрации: 11.11.2008
DmitryKn
Запускаю приложение обычным способом
Если EXE собираете вы, то у вас есть и исходники.
Что мешает запускать программу в исходниках?

Цитата:
стартует exe, потом основное app , лежат в разных папках в разных директориях. Как этот дебаг открыть-то ?
Непонятно, при чем тут папки, где что-то лежит, и команда DEBUG.
----------

Все привыкли отлаживаться так, как привыкли.
Я начинал работу с Фоксом ещё с Доса, где для остановки программы надо было в прогу вставить команду Suspend, позже появилось окно Trace (прародитель текущего Debug).
Поэтому я и сейчас для отладки чаще всего останавливаю программу в нужном мне месте командой Suspend (можно и SET STEP ON), попадаю в командное окно, выдаю команду Debug (или через меню Tools -> Debugger) и т.д.
Естественно всё это делаю не с EXE, а с исходными кодами.

Можно открывать Debugger и до запуска исходников, тогда после Suspend (или по установленной в дебаггере точке останова) вы сразу попадаете в его окно, но при открытом дебаггере программа работает медленнее, и поэтому иногда (допустим, до точки останова выполняется сложный расчет) это неудобно.



Исправлено 4 раз(а). Последнее : akvvohinc, 20.11.22 13:31
Ratings: 0 negative/0 positive
Re: вопрос по гриду
DmitryKn
Автор

Сообщений: 300
Дата регистрации: 06.04.2022
akvvohinc
DmitryKn
Запускаю приложение обычным способом
Если EXE собираете вы, то у вас есть и исходники.
Что мешает запускать программу в исходниках?

Запустить в исходниках - это открыть проект в фоксе и запустить main.prg ? Так оно хочет все найти в папке фокса, не видит объектов.
Ratings: 0 negative/0 positive
Re: вопрос по гриду
akvvohinc

Сообщений: 4203
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
Запустить в исходниках - это открыть проект в фоксе и запустить main.prg ? Так оно хочет все найти в папке фокса, не видит объектов.
Если путь к программе/файлу явно не указан, то они ищутся по вполне определенному алгоритму - сначала в текущей папке, а потом по путям, указанным в PATH.
Поэтому обычно либо в Config.fpw задается настройка PATH, либо в головной программе есть команда SET PATH.

Но неужели вы, корректируя программу, каждый раз для её запуска собираете EXE?
Это ж сколько бы я потратил впустую человеко-часов, если бы постоянно делал это, никому не нужное, дело как создание EXE!
Да, в самом конце, когда всё уже отлажено и работает, перед сдачей программы я собираю и проверяю её в EXE, но какой смысл тратить на это время в процессе правки/отладки?

Кстати, я компилирую программы с опцией NODEBUG (для уменьшения размера EXE), а поэтому вообще не могу отлаживать EXE через дебаггер.



Исправлено 1 раз(а). Последнее : akvvohinc, 20.11.22 15:25
Ratings: 0 negative/0 positive
Re: вопрос по гриду
DmitryKn
Автор

Сообщений: 300
Дата регистрации: 06.04.2022
Нет, я не собираю каждый раз exe.
Я каждый раз собираю app.
exe стартует, в нем класс App с настройками, и этот exe запускает мое приложение, которое лежит отдельно как app.
SET CLASSLIB TO APPGEN
PUBLIC goApp,gcMainApp
goApp = CREATEOBJECT('APP')
SET DEFAULT TO (goApp.cPathWork)
* Контроль даты и времени создания стартового модуля
WAIT WINDOW 'Пожалуйста ожидайте. Идет анализ основного модуля...' NOWAIT
gcMainApp = GetIni('SYSTEM','MainApp',goApp.cPathWork+'SETUP.INI')
IF FILE(goApp.cPathSystem+gcMainApp) && есть модуль на сервере
IF FILE(goApp.cPathWork+gcMainApp) && есть модуль на сервере
IF ADIR(aSource,goApp.cPathSystem+gcMainApp)>0 AND ADIR(aTarget,goApp.cPathWork+gcMainApp)>0
IF (aSource(3)>aTarget(3)) OR (aSource(3)=aTarget(3) AND (CTOT('01-01-01 '+aSource(4)) > CTOT('01-01-01 '+aTarget(4))))
DO UpgrApp
ENDIF
ENDIF
ELSE
DO UpgrApp
ENDIF
RELEASE aSource,aTarget
DO (gcMainApp)
ELSE
=MESSAGEBOX('В системном каталоге нет основного модуля')
ENDIF
WAIT CLEAR
Ratings: 0 negative/0 positive
Re: вопрос по гриду
akvvohinc

Сообщений: 4203
Откуда: Москва
Дата регистрации: 11.11.2008
DmitryKn
Нет, я не собираю каждый раз exe.
Я каждый раз собираю app.
exe стартует, в нем класс App с настройками, и этот exe запускает мое приложение, которое лежит отдельно как app.
А этот отдельно лежащий APP у вас включен в проект?
Или другими словами - он попадает в EXE?
--------

Но в любом случае, если:
1) в нужное место программы, входящей в ваш APP, вы добавите команду Suspend;
2) а EXE запустите из командного окна Фокса командой DO myexe.exe (в общем, из-под Фокса, а не EXE напрямую);
3) то команда Suspend будет выполнена, программа остановится, вы окажетесь в командном окне Фокса;
4) наберите и выполните команду DEBUG - появится дебаггер.

Что из описанной последовательности действий у вас не проходит?



Исправлено 8 раз(а). Последнее : akvvohinc, 20.11.22 16:47
Ratings: 0 negative/0 positive
Re: вопрос по гриду
DmitryKn
Автор

Сообщений: 300
Дата регистрации: 06.04.2022
akvvohinc
DmitryKn
Нет, я не собираю каждый раз exe.
Я каждый раз собираю app.
exe стартует, в нем класс App с настройками, и этот exe запускает мое приложение, которое лежит отдельно как app.
А этот отдельно лежащий APP у вас включен в проект?
Или другими словами - он попадает в EXE?

У меня нет окончательного EXE, который мог бы быть на сд-диске или флешке, т.е. к распространению невозможно. А всего получается два проекта, один starе.exe, второй project.app . Старт, фрагмент я приводил, в нем класс App с настройками, запускает project.app, в котором непосредственно вся хрень и выполняется, при редактировании компилируются каждый сам по себе, раздельно. Как два разных проекта.

Цитата:
Но в любом случае, если:
1) в нужное место программы, входящей в ваш APP, вы добавите команду Suspend;
2) а EXE запустите из командного окна Фокса командой DO myexe.exe (в общем, из-под Фокса, а не EXE напрямую);
3) то команда Suspend будет выполнена, программа остановится, вы окажетесь в командном окне Фокса;
4) наберите и выполните команду DEBUG - появится дебаггер.

Что из описанной последовательности действий у вас не проходит?

И вот я открываю фокс, пишу в окне do\путь\start.exe или do\путь\main.prg и фокс не видит настроек, не видит основного модуля, как раз в том фрагменте эта проверка, и до него не доходит. А отдельно основной модуль, project.app запустить невозможно.
Ratings: 0 negative/0 positive
Re: вопрос по гриду
akvvohinc

Сообщений: 4203
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
И вот я открываю фокс, пишу в окне do\путь\start.exe или do\путь\main.prg и фокс не видит настроек, не видит основного модуля
Значит, в этот момент рабочей папкой является не та, что требуется при запуске start.exe.

А поэтому предварительно сделайте нужную папку текущей каким-либо способом:
1) в командном окне Фокса - CD <полный путь к папке>
(или SET DEFAULT TO <полный путь к папке>)
или
2) при запуске Фокса укажите специальный Config.xxx, в котором будет указана рабочая папка:
DEFAULT = <полный путь к папке>

А перед запуском EXE проверьте, какая папка сейчас текущая:
? CURDIR()



Исправлено 2 раз(а). Последнее : akvvohinc, 20.11.22 17:05
Ratings: 0 negative/0 positive
Re: вопрос по гриду
akvvohinc

Сообщений: 4203
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
SET DEFAULT TO (goApp.cPathWork)
Чему у вас равно значение этого свойства?
Там задан абсолютный или относительный путь?
Ratings: 0 negative/0 positive


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

On-line: 28 Burn  (Гостей: 27)

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