:: Visual Foxpro, Foxpro for DOS
SUBSTR() странно отрабатывает
PavlikPavlikovich
Автор

Сообщений: 170
Дата регистрации: 21.07.2010
Добрый вечер!
У меня странно отрабатывает m.stroka=SUBSTR(m.stroka,2)
Фокс у меня 9 SP2 09.00.0000.5815 Но форма создавалась на ранних версиях фокса. Если это важно.
Есть две формы на каждой есть textbox
в LostFocus этих textbox прописана вот такая строка m.stroka=SUBSTR(m.stroka,2)
Мне нужно после попадания текста в textbox со сканера штрих-кода отрезать первый символ от строки.
Так вот на одной форме всё ОК, а на второй значение переменной m.stroka не изменяется после SUBSTR. Проверял даже в debugger. Не отрезан там первый символ. Но прикол в том что следующая строка кода отрабатывает верно. Как буд-то он отрезан.
т.е. фокс работает с этим куском как с отрезанным, а я везде вижу что первый символ присутствует. Мистика.

это баг какой-то?

Подскажите пожалуйста, как мне по другому отрезать первый символ?
Ratings: 0 negative/0 positive
Re: SUBSTR() странно отрабатывает
ssa

Сообщений: 12999
Откуда: Москва
Дата регистрации: 23.03.2005
PavlikPavlikovich
Добрый вечер!
У меня странно отрабатывает m.stroka=SUBSTR(m.stroka,2)
Фокс у меня 9 SP2 09.00.0000.5815 Но форма создавалась на ранних версиях фокса. Если это важно.
Есть две формы на каждой есть textbox
в LostFocus этих textbox прописана вот такая строка m.stroka=SUBSTR(m.stroka,2)
Мне нужно после попадания текста в textbox со сканера штрих-кода отрезать первый символ от строки.
Так вот на одной форме всё ОК, а на второй значение переменной m.stroka не изменяется после SUBSTR. Проверял даже в debugger. Не отрезан там первый символ. Но прикол в том что следующая строка кода отрабатывает верно. Как буд-то он отрезан.
т.е. фокс работает с этим куском как с отрезанным, а я везде вижу что первый символ присутствует. Мистика.

это баг какой-то?
Ага, называется гляжу в книгу - вижу фигу. Ты видишь не то, что хочешь видеть, какую-то другую m.stroka
Цитата:

Подскажите пожалуйста, как мне по другому отрезать первый символ?
Зачем?

------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/1 positive
Re: SUBSTR() странно отрабатывает
sphinx

Сообщений: 31166
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Попробуй обрезку символа в метод вынести. Может и есть глюки (в которые сам не верю, про глюки фокса писали в других темах, их принимаем и обходим).

P.S. Сергей Алексеевич выше написал, что может быть не то контролируешь. А в методе (да пусть временно, оспади) - может будет понятнее поведение.


------------------
"Veni, vidi, vici!"(с)




Исправлено 1 раз(а). Последнее : sphinx, 06.01.23 18:24
Ratings: 0 negative/0 positive
Re: SUBSTR() странно отрабатывает
Евгений Банщиков

Сообщений: 218
Откуда: Kurgan
Дата регистрации: 09.04.2004
PavlikPavlikovich
Добрый вечер!
это баг какой-то?

Подскажите пожалуйста, как мне по другому отрезать первый символ?
Для начала неплохо бы проверить , что за символ находится в начале m.stroka а потом уже искать баги фокса. Да и вообще обработка данных со сканера в коде LostFocus textbox не самое лучшее решение. Луше это сделать так : В методе keypress form по префиксу перехватить начало ввода от сканера ,далее в цикле do While вызывать метод inkey и считывать посимвольно данные до получения символа суффикса. Такой подход позволит отсечь ложные срабатывания , заранее определить тип скан кода и его валидность и выполнить его предварительную трансформацию ,если необходимо.
Ratings: 0 negative/2 positive
Re: SUBSTR() странно отрабатывает
akvvohinc

Сообщений: 4201
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
Проверял даже в debugger. Не отрезан там первый символ.
Никто не знает, что именно вы вкладываете в слово "проверял" (просто глазами смотрели на символы строки?).

Вы бы выложили два скриншота окна Debug:
- перед выполнением SUBSTR()
- сразу после неё.

А перед этим добавьте в окно Watch
LEN(m.string)
ASC(m.string)



Исправлено 1 раз(а). Последнее : akvvohinc, 06.01.23 20:20
Ratings: 0 negative/1 positive
Re: SUBSTR() странно отрабатывает
PavlikPavlikovich
Автор

Сообщений: 170
Дата регистрации: 21.07.2010
akvvohinc
Цитата:
Проверял даже в debugger. Не отрезан там первый символ.
Никто не знает, что именно вы вкладываете в слово "проверял" (просто глазами смотрели на символы строки?).

Вы бы выложили два скриншота окна Debug:
- перед выполнением SUBSTR()
- сразу после неё.

А перед этим добавьте в окно Watch
LEN(m.string)
ASC(m.string)

Сделал.
Len() c 150 изменилось 149
ASC() с 49 изменилось на 52

Я в замешательстве. Хотел заскринить. Но когда я перед SUBSTR() делаю остановку SUSP и прохожу построчно в debuger, то всё отлично.
Если я делаю остановку после SUBSTR(), то наведя в debuger на m.stroka, вижу визуально глазами что не отрезано. Но код далее отрабатывает как с отрезанным.
в конце делаю THISFORM.REFRESH и переменная эта m.stroka в textbox остается "неотрезанная".

Самое интересное что пробуя я два штрих-кода. Если штрих-код есть в базе. т.е. программа выполняется далее без всяких остановок, то переменная визуально "не отрезается"
Если его нет, то выскакивает =MESSAGEBOX() и тогда переменная отрезается как надо.
т.е. при любой остановке кода она "режется". Без остановки - нет.
Я наверное сдамся и верну как было. Мне этот символ нужен только для процедуры инвентаризации товара. Это редко. Будем перед этим делом префикс сканера менять. Потом в обратную.


Евгений Банщиков
Луше это сделать так : В методе keypress form по префиксу перехватить начало ввода от сканера ,далее в цикле do While вызывать метод inkey и считывать посимвольно данные до получения символа суффикса. Такой подход позволит отсечь ложные срабатывания , заранее определить тип скан кода и его валидность и выполнить его предварительную трансформацию ,если необходимо.
Наверное вы правы. Но этот как здесь любят называть "говнокод" я придумал 12 лет назад с опытом работы в фоксе 2 года. Переделать мне его будеть очень сложно. Т.к. я открываю фокс иногда, раз в пол года. Из-за необходимости.
Может я и рассматривал этот способ. Но у меня есть textbox (окно поиска) в него руками пишем и со сканера туда залетает. Там все "суётся куда надо". Всё как-бы в одном месте.
Ratings: 0 negative/0 positive
Re: SUBSTR() странно отрабатывает
akvvohinc

Сообщений: 4201
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
Если я делаю остановку после SUBSTR(), то наведя в debuger на m.stroka, вижу визуально глазами что не отрезано. Но код далее отрабатывает как с отрезанным.
В этот момент перейдите в окно Command и выдайте команду
DISPLAY MEMORY LIKE stroka TO FILE stroka.txt
Затем сами внимательно изучите этот файл (или опубликуйте его здесь), обратив внимание на то, сколько переменных STROKA будет в списке и особенно на то, в каком месте вашего приложения они были определены (последнее значение в конце строки).
Ratings: 0 negative/0 positive
Re: SUBSTR() странно отрабатывает
PavlikPavlikovich
Автор

Сообщений: 170
Дата регистрации: 21.07.2010
akvvohinc
Цитата:
Если я делаю остановку после SUBSTR(), то наведя в debuger на m.stroka, вижу визуально глазами что не отрезано. Но код далее отрабатывает как с отрезанным.
В этот момент перейдите в окно Command и выдайте команду
DISPLAY MEMORY LIKE stroka TO FILE stroka.txt
Затем сами внимательно изучите этот файл (или опубликуйте его здесь), обратив внимание на то, сколько переменных STROKA будет в списке и особенно на то, в каком месте вашего приложения они были определены (последнее значение в конце строки).

Сделал как вы сказали. Переменная одна.
1) Всунул DISPLAY MEMORY LIKE stroka TO FILE stroka.txt прямо в код после SUBSTR()
stroka Pub C "4680176133274 "

2) Сделал остановку после SUBSTR() и вбил команду в окно Command
stroka Pub C "14680176133274 "

Только получилось наоборот. Без остановки отрезалось как надо.
А при остановке не отрезалось. ( я про единичку вначале). Выше я писал наоборот. Что при остановке отрезалось хорошо, а без неё не отрезалось. Либо это вообще с этим не связано.

Оставил в коде DISPLAY MEMORY LIKE stroka TO FILE stroka.txt Пощелкал. В файл всё выбрасывается верно. Код отрабатывает верно. Но textbox с этой переменной отображается с 1. Создал еще один textbox с этой переменной. Везде 1 есть. Делал Refresh формы. Но дело не в этом. Не в обновлении. Баг это походу.



Исправлено 5 раз(а). Последнее : PavlikPavlikovich, 07.01.23 18:41
Ratings: 0 negative/0 positive
Re: SUBSTR() странно отрабатывает
sphinx

Сообщений: 31166
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
PavlikPavlikovich
Что при остановке отрезалось хорошо, а без неё не отрезалось.

Мы в таком случае банально делаем задержку (если вынь и положь - исследовать некогда, даже с гуру сайта). Костыль. Но работает. А оптимизацию кода никто не отменял.


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: SUBSTR() странно отрабатывает
akvvohinc

Сообщений: 4201
Откуда: Москва
Дата регистрации: 11.11.2008
Значит у вас, как вы написали выше, несколько форм, а переменная одна типа PUBLIC, с которой эти формы одновременно работают?
Я правильно понял?

И что означают слова "textbox с этой переменной"?
У вас ControlSource'ом для Textbox является эта переменная, значение которой вы изменяете программно, а сам Textbox можете править и вручную?!

А про баг забудьте - даже если по вашему описанию мы не выясним, в чем ошибка, то одно то, что вы используете PUBLIC переменную говорит о том, что вы просто где-то ошиблись в логике.
И можно набросать с десяток вариантов, при которых PUBLIC-переменная может измениться, когда вы вовсе этого не ожидаете.

Кстати, вы легко можете в этом убедиться - замените (временно) переменную m.stroka на какую-то другую в том месте (и только там), где вы подозреваете баг.
И очень вероятно, что ваш "баг" исчезнет.



Исправлено 4 раз(а). Последнее : akvvohinc, 07.01.23 22:21
Ratings: 1 negative/3 positive
Re: SUBSTR() странно отрабатывает
Ydin

Сообщений: 7648
Откуда: Киев
Дата регистрации: 16.12.2005
Случайно akvvohinc вместо лайка клацнул наоборот. Жаль!
Ratings: 0 negative/0 positive
Re: SUBSTR() странно отрабатывает
akvvohinc

Сообщений: 4201
Откуда: Москва
Дата регистрации: 11.11.2008
Ydin
Случайно akvvohinc вместо лайка клацнул наоборот. Жаль!
Саша, не бери в голову - не такое переживали...
Ratings: 0 negative/1 positive
Re: SUBSTR() странно отрабатывает
sphinx

Сообщений: 31166
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
+1


Я тоже, как модератор присматриваю. Кто ошибся - карму подправлю. Но в этот раз был не я.


------------------
"Veni, vidi, vici!"(с)




Исправлено 1 раз(а). Последнее : sphinx, 07.01.23 23:59
Ratings: 0 negative/0 positive
Re: SUBSTR() странно отрабатывает
PavlikPavlikovich
Автор

Сообщений: 170
Дата регистрации: 21.07.2010
akvvohinc
И что означают слова "textbox с этой переменной"?
У вас ControlSource'ом для Textbox является эта переменная, значение которой вы изменяете программно, а сам Textbox можете править и вручную?!
Да, m.stroka стоит в ControlSource для Textbox

akvvohinc
Кстати, вы легко можете в этом убедиться - замените (временно) переменную m.stroka на какую-то другую в том месте (и только там), где вы подозреваете баг.
И очень вероятно, что ваш "баг" исчезнет.

Я сейчас сделал следующее:
PROCEDURE ля-ля-ля
LOCAL stroka2
запуск формы
на форме в ControlSource для Textbox прописал новую переменную stroka2
в lostficus Textboxа переменную stroka заменил на stroka2
Запустил всё.
и тут у меня ошибка при первом же упоминании stroka2. "Переменная stroka2 не найдена." Нажимаю игнорировать. И всё отлично отрабатывает дальше. в Textbox встаёт правильно отрезанная stroka2.
Получается да, воспринимается как другая переменная что ли?

Что я делаю не так?



Исправлено 2 раз(а). Последнее : PavlikPavlikovich, 08.01.23 13:19
Ratings: 0 negative/0 positive
Re: SUBSTR() странно отрабатывает
akvvohinc

Сообщений: 4201
Откуда: Москва
Дата регистрации: 11.11.2008
Я не знаю, что у вас первично - сначала что-то присваивается переменной, значение которой вы затем отображаете (и изменяете?) в Textbox, или наоборот.

1) но я бы "отключил" переменную от Textbox, раз вы правите эту переменную программно и имеете (если имеете) возможность править Textbox руками.
У Textbox есть свойство Value, которое и хранит его значение, так что необходимости привязывать к Textbox переменную нет.
И всегда можно (если нужно) в нужный момент переменной присваивать Textbox.value или наоборот.

2) ошибка с переменной Stroka2 происходит потому, что переменная объявлена как Local в некоторой процедуре, и, естественно, переменная "исчезает" после выхода из этой процедуры.
Раз вам значение переменной нужно при работе с формой, то лучше вместо этой переменной определить свойство формы - оно будет "жить", пока жива форма, и будет видно во всех методах формы и её объектов.

Но временно для проверки вы можете оставить и переменную, сделав ее Public.
Ratings: 0 negative/0 positive
Re: SUBSTR() странно отрабатывает
PavlikPavlikovich
Автор

Сообщений: 170
Дата регистрации: 21.07.2010
akvvohinc
Я не знаю, что у вас первично - сначала что-то присваивается переменной, значение которой вы затем отображаете (и изменяете?) в Textbox, или наоборот.
Вот так у меня
PUBLIC stroka
STORE " " TO stroka
Потом либо я руками в Textbox печатаю, либо в него сканер закидывает. после LOSTFOCUS Textboxа его значение получает переменная stroka

akvvohinc
Я не знаю, что у вас первично - сначала что-то присваивается переменной, значение которой вы затем отображаете (и изменяете?) в Textbox, или наоборот.
1) но я бы "отключил" переменную от Textbox, раз вы правите эту переменную программно и имеете (если имеете) возможность править Textbox руками.
У Textbox есть свойство Value, которое и хранит его значение, так что необходимости привязывать к Textbox переменную нет.
И всегда можно (если нужно) в нужный момент переменной присваивать Textbox.value или наоборот.
Это получается опять всё переписывать

Я вот сидел, размышлял. Раз при SUSP или =MESSAGEBOX() у меня всё "хорошо". Думаю дай как я воткну после SUBSTR() - THISFORM.REFRESH. Пусть треханёт форму. И что вы думаете? Проканало )) Работает как надо. Оставлю пока так.

В своё оправдание по поводу переменной в Textbox.ControlSource. Так было сделано до меня. Я вообще думал что это нормально и это так надо.



Исправлено 1 раз(а). Последнее : PavlikPavlikovich, 08.01.23 15:25
Ratings: 0 negative/0 positive
Re: SUBSTR() странно отрабатывает
akvvohinc

Сообщений: 4201
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
Это получается опять всё переписывать
Я просто хотел убедить вас, что причина не в глюке Фокса.
Точную причину (а то, что это ваша ошибка, я уверен на все сто) сложно определить, не видя кода.

Цитата:
Думаю дай как я воткну после SUBSTR() - THISFORM.REFRESH. Пусть треханёт форму. И что вы думаете? Проканало )) Работает как надо. Оставлю пока так.
При таком подходе к поиску ошибок неудивительно, что время от времени будет трясти не только форму, но и всё приложение.

А в остальном - ничего удивительного:
При Refresh формы делается и Refresh этого Textbox'a - попробуйте сделать Refresh только ему.
Если это тоже поможет (а это 100% поможет), то почти наверняка причина именно в том, что я и подозревал - после программных изменений переменной её значение перестает согласовываться со значением Textbox.Value - в переменной находится новое значение, а Textbox отображает ещё старое.

Вы можете в этом убедиться, добавив команду
WAIT WINDOW thisform.text1.value
сразу после команды с SUBSTR()

Но когда вы заходите в дебаггер, то Фокс автоматически меняет значение переменной "взад", загоняя в неё значение text1.value.
Это нормальное поведение Фокса, если переменная привязана к Textbox'у. Сначала вы увидите, что они как бы разные, но переключившись в окно приложения и вернувшись в окно Debug, вы увидите, что они равны (вряд ли такое поведение можно считать глюком).

А если к этому добавить ещё и возможное влияние другой формы, использующую ту же глобальную переменную, то вы получаете готовый набор взрывчатых веществ, который может рвануть в любой момент (после любой безобидной корректировки, которая на первый взгляд не должна ни на что влиять).



Исправлено 6 раз(а). Последнее : akvvohinc, 08.01.23 23:02
Ratings: 0 negative/2 positive
Re: SUBSTR() странно отрабатывает
sphinx

Сообщений: 31166
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
PavlikPavlikovich
Это получается опять всё переписывать

Вряд ли все, скорее преувеличиваешь. Ну и лучше ОДИН раз переписать, чем мужественно бороться с "глюками Фокса". Они есть, но их не так много, и точно не этот случай.
И да, репро-кода нет, Сергей об этом писал.


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: SUBSTR() странно отрабатывает
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
() кстати, вместо ASC(m.string) удобно изображать в Watch: 0h+m.string
() и почему m.string (это переменная, контролируемая ТекстБоксом ?), а не TextBox.Value ? Страшное дело - строка с таким простым именем, и PUBLIC... И две формы с таким контролом... Неимоверно! )
Ratings: 0 negative/0 positive
Re: SUBSTR() странно отрабатывает
akvvohinc

Сообщений: 4201
Откуда: Москва
Дата регистрации: 11.11.2008
of63
вместо ASC(m.string) удобно изображать в Watch: 0h+m.string
Почему "вместо"?
Если ты хочешь видеть код первого символа в десятичном виде, то это ASC().
Если же всю строку и в Hex, то 0h+m.string.
Ratings: 0 negative/2 positive


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

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

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