|
Объект.Valid() формы FormSet-а + форма-мессага = вечный Valid()
|
|||
---|---|---|---|
#18+
Привет! Такая проблема - есть FormSet, 2 формы, обе открыты/активны/видимы, одна поверх другой. Есть на форме текстбоксы в которых в методе Valid проверяется правильность некоего введенного кода. !!!Внимание: в любом случае Valid возвращает .Т.!!! Просто если код неверен выводится сообщение-предупреждение об этом и все - это единственное что мне необходимо. И раз из метода не возвращается .F. - ситуация когда пока не сотрешь/исправишь неправильный код даже выйти нельзя - исключена. Так оно и было пока были только отдельные формы, а вот формы в FormSet-е видимо ведут себя несколько по-другому. Дело в том, что выводом предупреждения занимается отдельный класс, т.е. это отдельная форма. Если пользоваться мышкой , в случае когда выводится окно-сообщение, то по его закрытию и возврату к текстбоксу, фокус остается в нем! Получается вечный цикл... Что интересно - если дебажить - цикла нет, если нажимать для перехода к следующему полю Tab, Enter или стрелку курсора вниз - все нормально: сообщение, "переход хода". Мышкой же - никак, ни в следующее поле, ни в любые контролы формы вообще - во что ни тыкай - получаю мессагу, а фокус из текстбокса не уходит и всё тут! Что делать и кто виноват?(с) Пока идея только одна (так и сделал) - ввести в текстбокс поле LastValidatedValue и если оно=текущему Value не выполнять метод Valid. Но это, как говорится, лечение последствий/симптомов болезни, но не самой болезни. Важно понимать почему сие происходит, т.е. в чем, собственно, проблема? спасибо! вфп9 ... |
|||
:
Нравится:
Не нравится:
|
|||
17.12.2009, 19:30 |
|
Объект.Valid() формы FormSet-а + форма-мессага = вечный Valid()
|
|||
---|---|---|---|
#18+
В 1С 8.2 это назвается что-то вроде "ПроверкаЗаполнения" и на фоксе перед записью объекта - проверял все ли поля заполнены - а форме только предупреждал, что что-то введено некорректно. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.12.2009, 20:39 |
|
Объект.Valid() формы FormSet-а + форма-мессага = вечный Valid()
|
|||
---|---|---|---|
#18+
CTAC-KO, Кто виноват - не знаю. Можно попробовать перенести вызов формы для выдачи сообщений из Valid в LostFocus - если я правильно помню, он выполняется после Valid. Либо выдавать сообщение об ошибке с помощью WAIT .... NOWAIT - он не возвращает управление в тот объект, откуда был вызван. Сам я не не использовал FORMSET-ы и с такой ситуацией не сталкивался ... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2009, 09:46 |
|
Объект.Valid() формы FormSet-а + форма-мессага = вечный Valid()
|
|||
---|---|---|---|
#18+
CTAC-KO, Не надо код проверки помещать непосредственно в Valid - это нехороший тон в программировании и источник проблем. Сделайте отдельный метод в контролах, ответственный за проверку данных (его можно (и нужно) завести в базовом классе этого контрола). Из Valid вызывайте этот метод с нестрогой проверкой, т.е. сообщение выдавать, но фокус отпускать, чтоб пользователей не насиловать. А уже перед сохранением можно вызывать все методы проверки данные в контролах со строгой проверкой, т.е. сообщение выдавать и фокус возвращать на контрол с ошибочными данными. Тогда хоть клавиатурой, хоть мышой будет орудовать пользователь, но все предусмотренные вами проверки обязательно отработают, и во время ввода пользователю мешать не будут. (А спустя какое-то время придёте к выводу, что весь код по вызову методов проверки данных можно вообще вынести в родительские классы контролов и форм, не насилуя конечный прикладной класс) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2009, 10:23 |
|
Объект.Valid() формы FormSet-а + форма-мессага = вечный Valid()
|
|||
---|---|---|---|
#18+
Сам код проверки ставить в Valid - это как раз очень даже правильно на мой взгляд. Другое дело возврат .F. в результате такой проверки - вот это уже реально "нехороший тон в программировании и источник проблем". Вынос проверки из Valid-а в свой метод и вызов этого метода из Valid-а в данной ситуации - колхоз "Напрасный труд" (проверено). И потом - у меня только окно с сообщением-предупреждением, я фокус никоим образом не удерживаю, тем более с целью "насилования юзеров". А вот окончательная проверка данных во всех контролах перед "записью" у меня тоже сделана давно, только вот с установкой фокуса куда надо у меня проблемы - там по PageFrame-ам ходить надо, а особенно радует матрёшка из PageFrame-ом, там нада заходить фокусом по всей иерархии до контрола, короче сделать можно, но влом. Пока обошелся подсветкой всех контролов, непрошедших валидацию. Потом юзер ищет че где не так. А вот чтобы этого избежать (поиска), сразу же и выдаю предупреждение. Разве что действительно вешаться со своей валидацией на LostFocus... ... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2009, 13:18 |
|
Объект.Valid() формы FormSet-а + форма-мессага = вечный Valid()
|
|||
---|---|---|---|
#18+
немного подумав, чисто теоретически... В LostFocus-е если сделать, то в принципе это решит б0льшую часть проблем кроме одной - если ткнуть мышой в форму или что куда хуже мимо неё - получаю мессагу (а в случае с мимотыком - так и вовсе неожиданно), потом ткнуть таки в поле или куда там еще положено тыкать :) - опять получаю мессагу, т.к. реально фокус сначала уйдет, но сразу же вернеццо или если в масштабах формы (мимотык) - то и вообще из контрола не выйдет... Тут все равно надо вводить LastValidatedValue... ... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2009, 13:27 |
|
Объект.Valid() формы FormSet-а + форма-мессага = вечный Valid()
|
|||
---|---|---|---|
#18+
Ничего не понял из описания проблемы. Вы хотите сказать, что при определенных условиях из TextBox.Valid() дается команда вроде Код: plaintext
Т.е. идет вызов модальной формы. И если из объекты пытаются выйти при помощи клавиатуры, то после закрытия этой модальной формы выход проходит без проблем, а если пытаются выйти при помощи мышки, то после закрытия модальной формы фокус возвращается в тот же объект. Т.е. выхода не происходит. Сдалал FormSet. Сделал модальную форму. Сделал ее вызов в методе TextBox.Valid() одной из форм FormSet. Никаких проблем. Что мышкой, что клавишами. VFP9SP1. Сделайте тестовый пример, заархивируйте и положите во вложение. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2009, 16:01 |
|
Объект.Valid() формы FormSet-а + форма-мессага = вечный Valid()
|
|||
---|---|---|---|
#18+
да, именно это я и хочу сказать. вырезать будет трудновато... ... |
|||
:
Нравится:
Не нравится:
|
|||
22.12.2009, 07:51 |
|
Объект.Valid() формы FormSet-а + форма-мессага = вечный Valid()
|
|||
---|---|---|---|
#18+
CTAC-KOда, именно это я и хочу сказать. вырезать будет трудновато... Не надо вырезать. Создайте ЗАНОВО. На базовых классах FoxPro. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.12.2009, 12:08 |
|
Объект.Valid() формы FormSet-а + форма-мессага = вечный Valid()
|
|||
---|---|---|---|
#18+
Привет! Вот, нашел время, собрал - эффект на месте. Только вот заковыка в том, что форма вызвается на DO FORM (но если вызывать так, то все ок), а создаеццо из класа через NEWOBJECT. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.12.2009, 12:23 |
|
Объект.Valid() формы FormSet-а + форма-мессага = вечный Valid()
|
|||
---|---|---|---|
#18+
блин,ё, если предварительный простмотр делаешь, то файл отваливается... как этот движек уже достал... ёмаё... редактирования нет, смайлов нет, еще и глюки... ... |
|||
:
Нравится:
Не нравится:
|
|||
30.12.2009, 12:25 |
|
Объект.Valid() формы FormSet-а + форма-мессага = вечный Valid()
|
|||
---|---|---|---|
#18+
2 Владимир Максимов Привет! С прошедшими праздниками! Так как, подтвердите "странное" поведение? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2010, 12:23 |
|
Объект.Valid() формы FormSet-а + форма-мессага = вечный Valid()
|
|||
---|---|---|---|
#18+
(test.zip - 12Kb) cкачать ну и? в нем нет половины нужных файлов. TestFocus? сделай нормальный пример и напиши как постучать, чтобы смоделировать ситуацию и куда смотреть, догадываться и разгадывать ребусы нет желания ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2010, 12:33 |
|
Объект.Valid() формы FormSet-а + форма-мессага = вечный Valid()
|
|||
---|---|---|---|
#18+
Извините, профтыкал добавить Код: plaintext
ну а описать проблему я уже описал, но, конечно, чтобы быстрее было: Запускаем через прогу formsetfocus, появляется FormSet на две формы, но видно только первую, с двумя полями. В первом поле в методе Valid любом случае выводится сообщение. Попробуйте перейти фокусом на любой другой объект формы с помощью мышки. А потом попробуйте клавой, ТАБ-ом, к примеру. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2010, 14:57 |
|
Объект.Valid() формы FormSet-а + форма-мессага = вечный Valid()
|
|||
---|---|---|---|
#18+
выхожу на асфальт в лыжи обутая, толи лыжи не едут, толи я .... ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2010, 15:10 |
|
Объект.Valid() формы FormSet-а + форма-мессага = вечный Valid()
|
|||
---|---|---|---|
#18+
Да, йолки-моталки! :) Я создал этот проект среди своего и запуталсо малёхо... ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2010, 17:03 |
|
Объект.Valid() формы FormSet-а + форма-мессага = вечный Valid()
|
|||
---|---|---|---|
#18+
CTAC-KOДа, йолки-моталки! :) Я создал этот проект среди своего и запуталсо малёхо... Скачайте сами приложенный файл и посмотрите его содержимое. Если найдете в нем форму testFocus, то сообщите обязательно ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2010, 17:07 |
|
Объект.Valid() формы FormSet-а + форма-мессага = вечный Valid()
|
|||
---|---|---|---|
#18+
вот, еще раз, уже окончательно - сам проверил в отдельной директории ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2010, 17:10 |
|
Объект.Valid() формы FormSet-а + форма-мессага = вечный Valid()
|
|||
---|---|---|---|
#18+
ВладимирМСкачайте сами приложенный файл и посмотрите его содержимое. Если найдете в нем форму testFocus, то сообщите обязательно есть, только называется FormtestFocus ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2010, 17:12 |
|
Объект.Valid() формы FormSet-а + форма-мессага = вечный Valid()
|
|||
---|---|---|---|
#18+
CTAC-KOВладимирМСкачайте сами приложенный файл и посмотрите его содержимое. Если найдете в нем форму testFocus, то сообщите обязательно есть, только называется FormtestFocus скачали, посмотрели. CTAC-KO, отнеси на другой компутер распакуй свой проект и попробуй запустить. когда поймешь в чем твоя ошибка - милости просим. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2010, 17:36 |
|
Объект.Valid() формы FormSet-а + форма-мессага = вечный Valid()
|
|||
---|---|---|---|
#18+
Еще раз. СКАЧАЙТЕ тот файл, который Вы залили. Посмотрите ЧТО Вы залили. Вто то, что есть в последнем test.zip formsetfocus.bak formsetfocus.fxp formsetfocus.pjt formsetfocus.pjx formsetfocus.prg msger.vct msger.vcx Какой из этих файлов является формой? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2010, 17:37 |
|
Объект.Valid() формы FormSet-а + форма-мессага = вечный Valid()
|
|||
---|---|---|---|
#18+
авторвот, еще раз, уже окончательно - сам проверил в отдельной директории 2 CTAC-KO, у тябя картинки и формы по путям ищет, у нас этих путей и каталогов нет. ты нам дал какой-то субдовыдер, который невоможно запустить на машине отличной от твоей будь добр, сделай такой пример, который можно будет запустить и посмотреть у нас, не имеющих какого-то набора уникальных файлов, которыми располагаешь ты сам, т.е. пример должен быть таким, чтобы он у нас запустился, мы увидели, смоделировали проблему, а не разгадывали ребусы, которые нам сто лет не хочется разгадывать. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2010, 17:43 |
|
Объект.Valid() формы FormSet-а + форма-мессага = вечный Valid()
|
|||
---|---|---|---|
#18+
Еще раз выкладываю! Извините - все время выкладывал 1 и тот же архив, а обновлял другой. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2010, 18:59 |
|
Объект.Valid() формы FormSet-а + форма-мессага = вечный Valid()
|
|||
---|---|---|---|
#18+
в валид текстбокса напишите Код: plaintext 1. 2. 3. 4. 5. 6.
так устроит? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2010, 09:16 |
|
Объект.Valid() формы FormSet-а + форма-мессага = вечный Valid()
|
|||
---|---|---|---|
#18+
ни в коем случае не устроит, т.к. есть возврат .F.! А допустим мне не на пусто проверять, а на что-то другое, соотв. юзер даже закрыть форму не сможет пока не выполнит условие, даже если ему это все нах не нада, ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2010, 13:31 |
|
Объект.Valid() формы FormSet-а + форма-мессага = вечный Valid()
|
|||
---|---|---|---|
#18+
вообще вопрос был поставлен про увод фокуса из контрола с помощью мышки при получении сообщения и разница при использовании клавы в этом же случае. Ну и в чем причина такого поведения. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2010, 13:34 |
|
Объект.Valid() формы FormSet-а + форма-мессага = вечный Valid()
|
|||
---|---|---|---|
#18+
CTAC-KO, я тоже возмущаться начну сейчас, так как считаю все сотворенное бредом, воткни тотже код в метод лостфокус тогда и радуйся ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2010, 13:44 |
|
Объект.Valid() формы FormSet-а + форма-мессага = вечный Valid()
|
|||
---|---|---|---|
#18+
Во-первых, когда делаешь тестовый пример, надо делать ЧИСТУЮ форму. Без всевозможных "наворотов". Вот зачем мне разбираться в куче параметров, если ты используешь только один из них? Во-вторых, если бы ты сделал в качестве класс MessageWindow просто форму с единственной кнопкой "Выход" без какого-либо кода (ЧИСТУЮ форму), то увидел бы, что проблемы не возникает. Из этого, мог бы сделать вывод, что проблема в каких-то действиях непосредственно в твоем классе формы MessageWindow. Далее, добавляя код из оригинальной формы мог бы найти, что проблема возникает если дается команда this.btnOK.SetFocus() Т.е. факт ЯВНОГО увода фокуса на другой объект и пораждает подобный эффект. Что, собственно, и следовало ожидать, ведь на момент подачи этой команды форма еще не видна (в init-формы - это запрещенная команда!). Значит, подобную команду давать не надо. "Рулить" тем, какой объект получит фокус следует через указание значения свойства TabIndex. Или разнести кнопки по страницам PageFrame без закладок и просто активизировать нужную страницу. ==================================================== Вообще-же, выдача сообщений в событии Valid() объектов - это создание СЕБЕ больших проблем. Не должно быть здесь НИКАКИХ сообщений. Все сообщения выводятся при попытке сохранить сделанные изменения. Но никак не в процессе внесения этих изменений. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2010, 14:41 |
|
Объект.Valid() формы FormSet-а + форма-мессага = вечный Valid()
|
|||
---|---|---|---|
#18+
прошелмимоCTAC-KO, я тоже возмущаться начну сейчас, да я не возмущался, просто вопрос был не в том, и по поводу Valid-а я уже отписывал. прошелмимовоткни тотже код в метод лостфокус тогда и радуйся об этом тоже уже думал и писал, хотя не пробовал прошелмимотак как считаю все сотворенное бредом,Действительно все так плохо? Или все из-за того что выбран метод Valid? 2Владимир Спасибо! Да, виноват, подумал на формсет, а оказалось все как обычно - hands.dll... Так а как же мне выставить кнопку выбранной по-умолчанию, т.е. чтобы форма появилась с фокусом на ней? Надо тогда ей выставить как-то TabIndex=1... Ладно буду разбираться. Что до проверки в методе валида а не перед записью - так удобнее, т.к. форма пошаговая, т.е. есть несколько страниц с данными и если просто в конце вывести предупреждение юзер потом долго думает а где это, ищет и все такое. А так его сразу предупреждают на текущей странице на текущем контроле. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2010, 15:09 |
|
Объект.Valid() формы FormSet-а + форма-мессага = вечный Valid()
|
|||
---|---|---|---|
#18+
CTAC-KOТак а как же мне выставить кнопку выбранной по-умолчанию, т.е. чтобы форма появилась с фокусом на ней? Надо тогда ей выставить как-то TabIndex=1...У кнопок есть свойство Default. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2010, 15:10 |
|
Объект.Valid() формы FormSet-а + форма-мессага = вечный Valid()
|
|||
---|---|---|---|
#18+
авторДействительно все так плохо? Или все из-за того что выбран метод Valid? вместо подъема форм можно подумать в сторону подсветки невалидных значений + вывода информационных сообщений в постоянное окно - лог вариант метода Valid контрола, статусбар фокса для сообщатора - это как самый простой вариант, всемто него может существовать особое окно для логирования действий аля 1-це(к примеру) и т.д. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
в моей библиотеке у контролов есть св-во lValid у свойства есть ассайн метод, который анализирует св-во lAlertcolor (возможность/нужность подсветки невалидности) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
+ в реальной библиотеке доп.танцы с запоминанием старых, новых значений и т.д., но наличие заготовленных таким образом классов решает проблему визуального отображения валидности ввода, снижает трудозатраты если интересно отказаться от вывода пользователю взлетающих и надоедающих окон + разбор полетов в виде различных псевдо вопросов про глюки от фокса, то поболтаем на эту тему ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2010, 16:04 |
|
Объект.Valid() формы FormSet-а + форма-мессага = вечный Valid()
|
|||
---|---|---|---|
#18+
авторВсе сообщения выводятся при попытке сохранить сделанные изменения. Но никак не в процессе внесения этих изменений. согласен но иногда встречаются ТЗ, утвержденные ..., в которых тупо ставится задача орать и светить во время каждого телодвижения оператора до момента попытки сохранения всего документа, и ничего с этим не поделать (как пример - ввод ПД в различных системах КБ). и это благо, что в фокспро есть событийность на каждый чих. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2010, 16:16 |
|
Объект.Valid() формы FormSet-а + форма-мессага = вечный Valid()
|
|||
---|---|---|---|
#18+
Вот полностью по изложенному выше плану я и собираюсь действовать! И окошко лога типа 1цэ (не так давно как раз поднимал на форуме тему работы вфп с окнами и понял что придеццо ваять класс-форму) и подсветка контролов с инвалидной инфой, и подобное lValid св-во у меня тоже давно есть, я его назвал Validated. И подсветку тоже давно сделал именно для того чтобы юзеру было сразу видать че он криво понабрал (заливаю фон контрола желтым). Кроме того как раз заделал подсветку полей, в которых наличие инфы - обязательно. Уж не знаю как кто, но я решил обводить их красным прямоугольником. Сообщения типа этих мне надо для случаев, к примеру, если тело вводит дату, которая является выходным днем, например, что недопустимо, или там год нетекущий. Выходит что инфа-то есть, но кривая и об этом я специально так предупреждаю, иначе юзер тупо не увидит и не отреагирует, а если и в этом случае не отреагирует - то потом будет искать постранично ту дату. В любом случае интересно конечно же пообщаться по поводу. Ты из этих логов (1цэ) инфу сохраняешь? Если да: локально или в бд? историю подтягиваешь? еще какие-то делал по ним фичи - типа очистки там, поиска и тп? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2010, 20:05 |
|
|
start [/forum/topic.php?all=1&fid=41&tid=1585687]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
58ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
others: | 367ms |
total: | 530ms |
0 / 0 |