powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Объект.Valid() формы FormSet-а + форма-мессага = вечный Valid()
33 сообщений из 33, показаны все 2 страниц
Объект.Valid() формы FormSet-а + форма-мессага = вечный Valid()
    #36372484
CTAC-KO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет!
Такая проблема - есть FormSet, 2 формы, обе открыты/активны/видимы, одна поверх другой. Есть на форме текстбоксы в которых в методе Valid проверяется правильность некоего введенного кода.
!!!Внимание: в любом случае Valid возвращает .Т.!!!
Просто если код неверен выводится сообщение-предупреждение об этом и все - это единственное что мне необходимо. И раз из метода не возвращается .F. - ситуация когда пока не сотрешь/исправишь неправильный код даже выйти нельзя - исключена. Так оно и было пока были только отдельные формы, а вот формы в FormSet-е видимо ведут себя несколько по-другому.
Дело в том, что выводом предупреждения занимается отдельный класс, т.е. это отдельная форма. Если пользоваться мышкой , в случае когда выводится окно-сообщение, то по его закрытию и возврату к текстбоксу, фокус остается в нем! Получается вечный цикл... Что интересно - если дебажить - цикла нет, если нажимать для перехода к следующему полю Tab, Enter или стрелку курсора вниз - все нормально: сообщение, "переход хода". Мышкой же - никак, ни в следующее поле, ни в любые контролы формы вообще - во что ни тыкай - получаю мессагу, а фокус из текстбокса не уходит и всё тут!

Что делать и кто виноват?(с)

Пока идея только одна (так и сделал) - ввести в текстбокс поле LastValidatedValue и если оно=текущему Value не выполнять метод Valid. Но это, как говорится, лечение последствий/симптомов болезни, но не самой болезни. Важно понимать почему сие происходит, т.е. в чем, собственно, проблема?

спасибо!

вфп9
...
Рейтинг: 0 / 0
Объект.Valid() формы FormSet-а + форма-мессага = вечный Valid()
    #36372565
piva
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В 1С 8.2 это назвается что-то вроде "ПроверкаЗаполнения" и на фоксе перед записью объекта - проверял все ли поля заполнены - а форме только предупреждал, что что-то введено некорректно.
...
Рейтинг: 0 / 0
Объект.Valid() формы FormSet-а + форма-мессага = вечный Valid()
    #36372996
Sea_Cat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
CTAC-KO,

Кто виноват - не знаю. Можно попробовать перенести вызов формы для выдачи сообщений из Valid в LostFocus - если я правильно помню, он выполняется после Valid. Либо выдавать сообщение об ошибке с помощью WAIT .... NOWAIT - он не возвращает управление в тот объект, откуда был вызван.
Сам я не не использовал FORMSET-ы и с такой ситуацией не сталкивался
...
Рейтинг: 0 / 0
Объект.Valid() формы FormSet-а + форма-мессага = вечный Valid()
    #36373073
XAndy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
CTAC-KO,

Не надо код проверки помещать непосредственно в Valid - это нехороший тон в программировании и источник проблем. Сделайте отдельный метод в контролах, ответственный за проверку данных (его можно (и нужно) завести в базовом классе этого контрола). Из Valid вызывайте этот метод с нестрогой проверкой, т.е. сообщение выдавать, но фокус отпускать, чтоб пользователей не насиловать. А уже перед сохранением можно вызывать все методы проверки данные в контролах со строгой проверкой, т.е. сообщение выдавать и фокус возвращать на контрол с ошибочными данными. Тогда хоть клавиатурой, хоть мышой будет орудовать пользователь, но все предусмотренные вами проверки обязательно отработают, и во время ввода пользователю мешать не будут. (А спустя какое-то время придёте к выводу, что весь код по вызову методов проверки данных можно вообще вынести в родительские классы контролов и форм, не насилуя конечный прикладной класс)
...
Рейтинг: 0 / 0
Объект.Valid() формы FormSet-а + форма-мессага = вечный Valid()
    #36373664
CTAC-KO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сам код проверки ставить в Valid - это как раз очень даже правильно на мой взгляд. Другое дело возврат .F. в результате такой проверки - вот это уже реально "нехороший тон в программировании и источник проблем".
Вынос проверки из Valid-а в свой метод и вызов этого метода из Valid-а в данной ситуации - колхоз "Напрасный труд" (проверено). И потом - у меня только окно с сообщением-предупреждением, я фокус никоим образом не удерживаю, тем более с целью "насилования юзеров".
А вот окончательная проверка данных во всех контролах перед "записью" у меня тоже сделана давно, только вот с установкой фокуса куда надо у меня проблемы - там по PageFrame-ам ходить надо, а особенно радует матрёшка из PageFrame-ом, там нада заходить фокусом по всей иерархии до контрола, короче сделать можно, но влом. Пока обошелся подсветкой всех контролов, непрошедших валидацию. Потом юзер ищет че где не так. А вот чтобы этого избежать (поиска), сразу же и выдаю предупреждение.

Разве что действительно вешаться со своей валидацией на LostFocus...
...
Рейтинг: 0 / 0
Объект.Valid() формы FormSet-а + форма-мессага = вечный Valid()
    #36373698
CTAC-KO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
немного подумав, чисто теоретически...
В LostFocus-е если сделать, то в принципе это решит б0льшую часть проблем кроме одной - если ткнуть мышой в форму или что куда хуже мимо неё - получаю мессагу (а в случае с мимотыком - так и вовсе неожиданно), потом ткнуть таки в поле или куда там еще положено тыкать :) - опять получаю мессагу, т.к. реально фокус сначала уйдет, но сразу же вернеццо или если в масштабах формы (мимотык) - то и вообще из контрола не выйдет... Тут все равно надо вводить LastValidatedValue...
...
Рейтинг: 0 / 0
Объект.Valid() формы FormSet-а + форма-мессага = вечный Valid()
    #36374207
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ничего не понял из описания проблемы.

Вы хотите сказать, что при определенных условиях из TextBox.Valid() дается команда вроде

Код: plaintext
DO FORM MyModalForm.scx

Т.е. идет вызов модальной формы. И если из объекты пытаются выйти при помощи клавиатуры, то после закрытия этой модальной формы выход проходит без проблем, а если пытаются выйти при помощи мышки, то после закрытия модальной формы фокус возвращается в тот же объект. Т.е. выхода не происходит.

Сдалал FormSet. Сделал модальную форму. Сделал ее вызов в методе TextBox.Valid() одной из форм FormSet. Никаких проблем. Что мышкой, что клавишами. VFP9SP1.

Сделайте тестовый пример, заархивируйте и положите во вложение.
...
Рейтинг: 0 / 0
Объект.Valid() формы FormSet-а + форма-мессага = вечный Valid()
    #36378877
CTAC-KO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да, именно это я и хочу сказать. вырезать будет трудновато...
...
Рейтинг: 0 / 0
Объект.Valid() формы FormSet-а + форма-мессага = вечный Valid()
    #36379441
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CTAC-KOда, именно это я и хочу сказать. вырезать будет трудновато...
Не надо вырезать. Создайте ЗАНОВО. На базовых классах FoxPro.
...
Рейтинг: 0 / 0
Объект.Valid() формы FormSet-а + форма-мессага = вечный Valid()
    #36393561
CTAC-KO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет!
Вот, нашел время, собрал - эффект на месте. Только вот заковыка в том, что форма вызвается на DO FORM (но если вызывать так, то все ок), а создаеццо из класа через NEWOBJECT.
...
Рейтинг: 0 / 0
Объект.Valid() формы FormSet-а + форма-мессага = вечный Valid()
    #36393565
CTAC-KO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
блин,ё, если предварительный простмотр делаешь, то файл отваливается... как этот движек уже достал... ёмаё... редактирования нет, смайлов нет, еще и глюки...
...
Рейтинг: 0 / 0
Объект.Valid() формы FormSet-а + форма-мессага = вечный Valid()
    #36409441
CTAC-KO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Владимир Максимов
Привет! С прошедшими праздниками!

Так как, подтвердите "странное" поведение?
...
Рейтинг: 0 / 0
Объект.Valid() формы FormSet-а + форма-мессага = вечный Valid()
    #36409474
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
(test.zip - 12Kb) cкачать

ну и? в нем нет половины нужных файлов.
TestFocus?

сделай нормальный пример
и напиши как постучать, чтобы смоделировать ситуацию
и куда смотреть,
догадываться и разгадывать ребусы нет желания
...
Рейтинг: 0 / 0
Объект.Valid() формы FormSet-а + форма-мессага = вечный Valid()
    #36409997
CTAC-KO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извините, профтыкал добавить
Код: plaintext
SET CLASSLIB TO msger.vcx
и закаментить работу с чекбоксом одним (надо было его не убирать из окна...)
ну а описать проблему я уже описал, но, конечно, чтобы быстрее было:
Запускаем через прогу formsetfocus, появляется FormSet на две формы, но видно только первую, с двумя полями. В первом поле в методе Valid любом случае выводится сообщение. Попробуйте перейти фокусом на любой другой объект формы с помощью мышки. А потом попробуйте клавой, ТАБ-ом, к примеру.
...
Рейтинг: 0 / 0
Объект.Valid() формы FormSet-а + форма-мессага = вечный Valid()
    #36410041
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
выхожу на асфальт в лыжи обутая,
толи лыжи не едут,
толи я ....
...
Рейтинг: 0 / 0
Объект.Valid() формы FormSet-а + форма-мессага = вечный Valid()
    #36410411
CTAC-KO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, йолки-моталки! :) Я создал этот проект среди своего и запуталсо малёхо...
...
Рейтинг: 0 / 0
Объект.Valid() формы FormSet-а + форма-мессага = вечный Valid()
    #36410420
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CTAC-KOДа, йолки-моталки! :) Я создал этот проект среди своего и запуталсо малёхо...
Скачайте сами приложенный файл и посмотрите его содержимое. Если найдете в нем форму testFocus, то сообщите обязательно
...
Рейтинг: 0 / 0
Объект.Valid() формы FormSet-а + форма-мессага = вечный Valid()
    #36410432
CTAC-KO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот, еще раз, уже окончательно - сам проверил в отдельной директории
...
Рейтинг: 0 / 0
Объект.Valid() формы FormSet-а + форма-мессага = вечный Valid()
    #36410437
CTAC-KO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМСкачайте сами приложенный файл и посмотрите его содержимое. Если найдете в нем форму testFocus, то сообщите обязательно есть, только называется FormtestFocus
...
Рейтинг: 0 / 0
Объект.Valid() формы FormSet-а + форма-мессага = вечный Valid()
    #36410536
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CTAC-KOВладимирМСкачайте сами приложенный файл и посмотрите его содержимое. Если найдете в нем форму testFocus, то сообщите обязательно есть, только называется FormtestFocus

скачали, посмотрели.
CTAC-KO, отнеси на другой компутер распакуй свой проект и попробуй запустить.
когда поймешь в чем твоя ошибка - милости просим.
...
Рейтинг: 0 / 0
Объект.Valid() формы FormSet-а + форма-мессага = вечный Valid()
    #36410540
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще раз. СКАЧАЙТЕ тот файл, который Вы залили. Посмотрите ЧТО Вы залили. Вто то, что есть в последнем test.zip

formsetfocus.bak
formsetfocus.fxp
formsetfocus.pjt
formsetfocus.pjx
formsetfocus.prg
msger.vct
msger.vcx

Какой из этих файлов является формой?
...
Рейтинг: 0 / 0
Объект.Valid() формы FormSet-а + форма-мессага = вечный Valid()
    #36410579
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторвот, еще раз, уже окончательно - сам проверил в отдельной директории

2 CTAC-KO,

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

ты нам дал какой-то субдовыдер, который
невоможно запустить на машине отличной от твоей

будь добр,
сделай такой пример, который
можно будет запустить и посмотреть у нас,
не имеющих какого-то набора уникальных
файлов, которыми располагаешь ты сам,
т.е. пример должен быть таким,
чтобы он у нас запустился,
мы увидели, смоделировали проблему,
а не разгадывали ребусы,
которые нам сто лет не хочется разгадывать.
...
Рейтинг: 0 / 0
Объект.Valid() формы FormSet-а + форма-мессага = вечный Valid()
    #36410802
CTAC-KO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще раз выкладываю! Извините - все время выкладывал 1 и тот же архив, а обновлял другой.
...
Рейтинг: 0 / 0
Объект.Valid() формы FormSet-а + форма-мессага = вечный Valid()
    #36411411
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в валид текстбокса напишите
Код: plaintext
1.
2.
3.
4.
5.
6.
If Empty(this.Value)
	m.goMessager.Msg('Пусто. Укажите что-то')
	Return .f.
Else
	Return .t.
EndIf 

так устроит?
...
Рейтинг: 0 / 0
Объект.Valid() формы FormSet-а + форма-мессага = вечный Valid()
    #36412146
CTAC-KO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ни в коем случае не устроит, т.к. есть возврат .F.! А допустим мне не на пусто проверять, а на что-то другое, соотв. юзер даже закрыть форму не сможет пока не выполнит условие, даже если ему это все нах не нада,
...
Рейтинг: 0 / 0
Объект.Valid() формы FormSet-а + форма-мессага = вечный Valid()
    #36412159
CTAC-KO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вообще вопрос был поставлен про увод фокуса из контрола с помощью мышки при получении сообщения и разница при использовании клавы в этом же случае. Ну и в чем причина такого поведения.
...
Рейтинг: 0 / 0
Объект.Valid() формы FormSet-а + форма-мессага = вечный Valid()
    #36412192
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CTAC-KO,

я тоже возмущаться начну сейчас,
так как считаю все сотворенное бредом,
воткни тотже код в метод лостфокус тогда и радуйся
...
Рейтинг: 0 / 0
Объект.Valid() формы FormSet-а + форма-мессага = вечный Valid()
    #36412390
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во-первых, когда делаешь тестовый пример, надо делать ЧИСТУЮ форму. Без всевозможных "наворотов". Вот зачем мне разбираться в куче параметров, если ты используешь только один из них?

Во-вторых, если бы ты сделал в качестве класс MessageWindow просто форму с единственной кнопкой "Выход" без какого-либо кода (ЧИСТУЮ форму), то увидел бы, что проблемы не возникает.

Из этого, мог бы сделать вывод, что проблема в каких-то действиях непосредственно в твоем классе формы MessageWindow.

Далее, добавляя код из оригинальной формы мог бы найти, что проблема возникает если дается команда

this.btnOK.SetFocus()

Т.е. факт ЯВНОГО увода фокуса на другой объект и пораждает подобный эффект. Что, собственно, и следовало ожидать, ведь на момент подачи этой команды форма еще не видна (в init-формы - это запрещенная команда!). Значит, подобную команду давать не надо.

"Рулить" тем, какой объект получит фокус следует через указание значения свойства TabIndex. Или разнести кнопки по страницам PageFrame без закладок и просто активизировать нужную страницу.

====================================================

Вообще-же, выдача сообщений в событии Valid() объектов - это создание СЕБЕ больших проблем. Не должно быть здесь НИКАКИХ сообщений. Все сообщения выводятся при попытке сохранить сделанные изменения. Но никак не в процессе внесения этих изменений.
...
Рейтинг: 0 / 0
Объект.Valid() формы FormSet-а + форма-мессага = вечный Valid()
    #36412491
CTAC-KO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
прошелмимоCTAC-KO,
я тоже возмущаться начну сейчас,
да я не возмущался, просто вопрос был не в том, и по поводу Valid-а я уже отписывал.
прошелмимовоткни тотже код в метод лостфокус тогда и радуйся об этом тоже уже думал и писал, хотя не пробовал
прошелмимотак как считаю все сотворенное бредом,Действительно все так плохо? Или все из-за того что выбран метод Valid?

2Владимир
Спасибо!
Да, виноват, подумал на формсет, а оказалось все как обычно - hands.dll...
Так а как же мне выставить кнопку выбранной по-умолчанию, т.е. чтобы форма появилась с фокусом на ней? Надо тогда ей выставить как-то TabIndex=1... Ладно буду разбираться.

Что до проверки в методе валида а не перед записью - так удобнее, т.к. форма пошаговая, т.е. есть несколько страниц с данными и если просто в конце вывести предупреждение юзер потом долго думает а где это, ищет и все такое. А так его сразу предупреждают на текущей странице на текущем контроле.
...
Рейтинг: 0 / 0
Объект.Valid() формы FormSet-а + форма-мессага = вечный Valid()
    #36412497
CTAC-KOТак а как же мне выставить кнопку выбранной по-умолчанию, т.е. чтобы форма появилась с фокусом на ней? Надо тогда ей выставить как-то TabIndex=1...У кнопок есть свойство Default.
...
Рейтинг: 0 / 0
Объект.Valid() формы FormSet-а + форма-мессага = вечный Valid()
    #36412662
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторДействительно все так плохо? Или все из-за того что выбран метод Valid?

вместо подъема форм
можно подумать в сторону подсветки невалидных значений
+ вывода информационных сообщений в постоянное окно - лог

вариант метода Valid контрола, статусбар фокса для сообщатора - это как самый простой вариант,
всемто него может существовать особое окно для логирования действий аля 1-це(к примеру) и т.д.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
With thisform
	if !empty(.dateTo.value) and this.value>.dateTo.value
		_vfp.StatusBar = "Ошибка ввода диапазона дат."
		Store .f. to this.lValid ;
				   , .dateTo.lValid
	Else
		_vfp.StatusBar = ""
		Store .t. to this.lValid ;
				   , .dateTo.lValid
	EndIf
EndWith


в моей библиотеке у контролов есть св-во lValid
у свойства есть ассайн метод,
который анализирует св-во lAlertcolor (возможность/нужность подсветки невалидности)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
lparameters tlNewVal
with this
	.lvalid = tlNewVal
	if tlNewVal
		if .lAlertcolor or vartype(.OldValue)<>vartype(.Value) or .OldValue<>.Value
			* если даже держим  this.lAlertcolor
			* предв-но сбросили  this.lAlertcolor в .f.
			* но знач-е изменилось и оно валидное, то 
			* передергиваем цвет тексту и фону
			.ResetAlertColor()
		endif
	else
		if .lAlertcolor  
			* невалидное значение подсвечиваем 
			* если выставлен this.lAlertcolor в .f.,
			* то подсветки не будет
			.SetAlertColor()
		endif 
	endif
endwith
return .t.

+ в реальной библиотеке доп.танцы
с запоминанием старых, новых значений и т.д.,
но наличие заготовленных таким образом классов
решает проблему визуального отображения валидности ввода,
снижает трудозатраты


если интересно отказаться от вывода
пользователю взлетающих и надоедающих окон
+ разбор полетов в виде различных псевдо вопросов
про глюки от фокса, то поболтаем на эту тему
...
Рейтинг: 0 / 0
Объект.Valid() формы FormSet-а + форма-мессага = вечный Valid()
    #36412719
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторВсе сообщения выводятся при попытке сохранить сделанные изменения. Но никак не в процессе внесения этих изменений.

согласен

но иногда встречаются ТЗ, утвержденные ...,
в которых тупо ставится задача орать и светить во время
каждого телодвижения оператора до момента попытки сохранения всего документа,
и ничего с этим не поделать (как пример - ввод ПД в различных системах КБ).

и это благо, что в фокспро есть событийность на каждый чих.
...
Рейтинг: 0 / 0
Объект.Valid() формы FormSet-а + форма-мессага = вечный Valid()
    #36413186
CTAC-KO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот полностью по изложенному выше плану я и собираюсь действовать! И окошко лога типа 1цэ (не так давно как раз поднимал на форуме тему работы вфп с окнами и понял что придеццо ваять класс-форму) и подсветка контролов с инвалидной инфой, и подобное lValid св-во у меня тоже давно есть, я его назвал Validated. И подсветку тоже давно сделал именно для того чтобы юзеру было сразу видать че он криво понабрал (заливаю фон контрола желтым). Кроме того как раз заделал подсветку полей, в которых наличие инфы - обязательно. Уж не знаю как кто, но я решил обводить их красным прямоугольником.
Сообщения типа этих мне надо для случаев, к примеру, если тело вводит дату, которая является выходным днем, например, что недопустимо, или там год нетекущий. Выходит что инфа-то есть, но кривая и об этом я специально так предупреждаю, иначе юзер тупо не увидит и не отреагирует, а если и в этом случае не отреагирует - то потом будет искать постранично ту дату.
В любом случае интересно конечно же пообщаться по поводу.

Ты из этих логов (1цэ) инфу сохраняешь? Если да:
локально или в бд?
историю подтягиваешь?
еще какие-то делал по ним фичи - типа очистки там, поиска и тп?
...
Рейтинг: 0 / 0
33 сообщений из 33, показаны все 2 страниц
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Объект.Valid() формы FormSet-а + форма-мессага = вечный Valid()
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]