![]() |
|
|
![]()
|
|
| maroonorg |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 1.10.2007 Репутация: нет Всего: нет |
Здравствуйте, форумчане. Подскажите, пожалуйста, вот по какому вопросу:
При нажатии на кнопку происходит большое количество проверок, и последующая проверка вытекает из прошлой, т.е. например:
Можно как-нибудь приостановить выполнение функции, как это например реализовано на php (функция exit останавливает работу скрипта), чтобы не создавать множество вложенных if'ов, а сделать например так:
Заранее спасибо за помощь |
||||
|
|||||
| almagnit |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 283 Регистрация: 3.4.2008 Репутация: -1 Всего: 7 |
Конечно:
|
|||
|
||||
| maroonorg |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 1.10.2007 Репутация: нет Всего: нет |
Спасибо за предложение, но:
Выходит ошибка Misplaced break Это сообщение отредактировал(а) maroonorg - 10.5.2008, 10:29 |
|||
|
||||
| almagnit |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 283 Регистрация: 3.4.2008 Репутация: -1 Всего: 7 |
Извиняюсь, последнее время сижу на Java, нужно делать так:
Это сообщение отредактировал(а) almagnit - 10.5.2008, 10:43 |
|||
|
||||
| maroonorg |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 1.10.2007 Репутация: нет Всего: нет |
Как я уже говорил, проверки происходят когда мы нажимаем на кнопку. Тогда возникает следующий момент:
Функция не возвращает значение и компилятор не разрешает сменить void. Поэтому
не подходит |
||||
|
|||||
| almagnit |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 283 Регистрация: 3.4.2008 Репутация: -1 Всего: 7 |
А просто
|
|||
|
||||
| maroonorg |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 1.10.2007 Репутация: нет Всего: нет |
Да, все, спасибо, не подумал об этом
Благодарю за помощь |
|||
|
||||
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 3 Всего: 91 |
Т.е. ради красоты кода (избавления от вложенности условий) ты решил добавить пару десятков return'ов
А такой вариант в твоей программе не прокатит ?:
Это сообщение отредактировал(а) SABROG - 10.5.2008, 12:30 |
|||
|
||||
| maroonorg |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 1.10.2007 Репутация: нет Всего: нет |
Да, так точно.
Не думаю что это сильно усложнить читабельность кода ( в некоторых случаях даже уменьшит ) К твоему вопросу: на каждое условие должно быть свое сообщение об ошибке. Т.е. если не заполнено поле, то должно вывести что именно это поле не заполнено. Представь себе 20 вложенных условий ( Извиняюсь за |
|||
|
||||
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 3 Всего: 91 |
Неправильный подход для создания форм, где есть обязательные для заполнения поля.
Должно быть как-то так: - есть массив элементов-контролов, каждому элементу соответствует название "Название организации", "Пол", "Дата рождения" и флаг "Обязательно к заполнению" или "Необязательно заполнять". - в цикле, функция типа isAllValid проверяет каждое из полей - если поле не заполнено и стоит флаг "Обязательно к заполнению" - выводим сообщение: 'Поле "Название организации" должно быть заполнено'. - если параметр не обязательный, но данные не валидные (например e-mail не удовлетворяет регулярному выражению, скажем ввели vasya@mailru, т.е. точку забыли), то опять же выводим сообщение: 'Поле "Электронный адрес" не корректно'. В общем грубо говоря, вместо того, чтобы плодить if'ы надо перебирать контролы на форме и в зависимости от флагов и параметров ругаться. Т.е. работа с динамическим массивом. Это сообщение отредактировал(а) SABROG - 10.5.2008, 12:52 |
|||
|
||||
| maroonorg |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 1.10.2007 Репутация: нет Всего: нет |
А нельзя привести пример такого приложения, пожалуйста?
Заранее спасибо. |
|||
|
||||
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 3 Всего: 91 |
Вот упрощенный вариант.
![]() Идея тут такая: - в поле Tag пишем либо 0 либо 1 в зависимости от того требуется ли обязательное заполнение или нет. Если 1 - требуется, если 0 (по умолчанию) - не требуется - в коде я намеренно использую фильтр по классу TEdit, чтобы кнопки и ярлыки не обрабатывались. По сути грязный хак. Потом объясню почему. - если контрол нашелся и он должен быть заполнен (TAG == 1), но он пустой, то выдается ошибка, что такое-то поле не заполнено. Название поля берется из параметра Hint, который заполняется во время проектирования программы. На самом деле в поле Tag можно пихать не только цифры, но и указатели на структуры и классы, но это на этапе выполнения программы. Я бы создал структуру с двумя параметрами: bool и AnsiString. Т.е. обязательность заполнения и название объекта. При переборе всех контролов на форме я бы проверял, если Tag не равен нулю, то значит это нужный нам объект, который содержит ссылку на нужные данные. Можно конечно еще много чего напридумывать. Это сообщение отредактировал(а) SABROG - 10.5.2008, 13:36 Присоединённый файл ( Кол-во скачиваний: 4 )
CountControls.zip 252,46 Kb |
|||
|
||||
| maroonorg |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 1.10.2007 Репутация: нет Всего: нет |
Идея интересная, но почему бы ее немного не упростить?
Немного измененная версия. На 2007 Builder'е. Если нет 2007 билдера: ![]() Имена элементов Label1, Edit1, Label2, Edit2, Label3, Edit3. У Edit1 и Edit3 параметр Tag == 1. Воообще не имеет смысла, надо хоть одну единицу для проверки работы При нажатии на кнопку:
И еще вопрос, что будет работать быстрее:
или
Это сообщение отредактировал(а) maroonorg - 10.5.2008, 14:33 Присоединённый файл ( Кол-во скачиваний: 2 )
IsValid.rar 6,60 Kb |
||||||
|
|||||||
| SABROG |
|
||||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 3 Всего: 91 |
Тут у тебя жестко задано количество элементов, косяк появится, когда добавишь или удалиш поле:
Я бы не советовал привязываться к именам компонентов, также как и к их названиям классов. К ссылкам/указателям - пожалуйста. Кстати указывать this-> не обязательно, достаточно FindComponent. Тут тоже я бы не привязывался жестко:
Как я писал выше, вполне возможно, что поле может и не быть обязательным, но если его все-таки указали, то вероятно есть смысл проверить его на валидность (e-mail, ip адрес, номер ИНН, день рождения). К Label'ам я вообще не стал привязываться по той причине, что их может и не быть (например группа элементов для дня рождения: Edit - день рождения, combobox - месяц рождения, combobox - год рождения, элемента 3, а label один). Насчет того, что будет работать быстрее. Я использую isEmpty() потому, что именно для этого она и создана, следовательно любая оптимизация по ускорению проверки будет касаться именно этой функции, а сравнение строки с пустой строкой может оказаться медленней, хотя я в этом сомневаюсь потому, что обычно в таких функциях если длинны строк не совпадают изначально, то проверки вообще не происходит, т.к. ясно что они не могут быть идентичными. |
||||
|
|||||
| maroonorg |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 1.10.2007 Репутация: нет Всего: нет |
SABROG, спасибо, учту, запомню
|
|||
|
||||
![]()
|
| Правила форума "С++ Builder" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C++ Builder | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |