Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выход из функции 
V
    Опции темы
maroonorg
Дата 10.5.2008, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 1.10.2007

Репутация: нет
Всего: нет



Здравствуйте, форумчане. Подскажите, пожалуйста, вот по какому вопросу:

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

Код

if (условие1)
{
    if (условие2)
    {
        if (условие3)
        {
            .....
        }
        else ...
    }
    else ...
}
else
{
    ShowMessage("Условие 1 не выполнено");
}


Можно как-нибудь приостановить выполнение функции, как это например реализовано на php (функция exit останавливает работу скрипта), чтобы не создавать множество вложенных if'ов, а сделать например так:

Код

if (!условие1)
{
    ShowMessage("Условие 1 не выполнено");
    // Выход из функции
}

if (!условие2)
{
    ShowMessage("Условие 2 не выполнено");
    // Выход из функции
}

if (!условие3)
{
    ShowMessage("Условие 3 не выполнено");
    // Выход из функции
}


Заранее спасибо за помощь
PM MAIL   Вверх
almagnit
Дата 10.5.2008, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 283
Регистрация: 3.4.2008

Репутация: -1
Всего: 7



Конечно:

Код

break;

PM MAIL ICQ   Вверх
maroonorg
Дата 10.5.2008, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 1.10.2007

Репутация: нет
Всего: нет



Спасибо за предложение, но:

Код

if ( true ) {
    ShowMessage("True now");
    break;
    if ( true ) {
        ShowMessage("And now too");
    }
}


Выходит ошибка Misplaced break

Это сообщение отредактировал(а) maroonorg - 10.5.2008, 10:29
PM MAIL   Вверх
almagnit
Дата 10.5.2008, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 283
Регистрация: 3.4.2008

Репутация: -1
Всего: 7



Извиняюсь, последнее время сижу на Java, нужно делать так:

Код

return 0;


Это сообщение отредактировал(а) almagnit - 10.5.2008, 10:43
PM MAIL ICQ   Вверх
maroonorg
Дата 10.5.2008, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 1.10.2007

Репутация: нет
Всего: нет



Как я уже говорил, проверки происходят когда мы нажимаем на кнопку. Тогда возникает следующий момент:

Код

void __fastcall TfMainForm::sButton1Click(TObject *Sender)


Функция не возвращает значение и компилятор не разрешает сменить void. Поэтому

Код

return 0;


не подходит
PM MAIL   Вверх
almagnit
Дата 10.5.2008, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 283
Регистрация: 3.4.2008

Репутация: -1
Всего: 7



А просто 
Код
return;
, если void.  smile 
PM MAIL ICQ   Вверх
maroonorg
Дата 10.5.2008, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 1.10.2007

Репутация: нет
Всего: нет



Да, все, спасибо, не подумал об этом  smile 

Благодарю за помощь
PM MAIL   Вверх
SABROG
Дата 10.5.2008, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 3
Всего: 91



Т.е. ради красоты кода (избавления от вложенности условий) ты решил добавить пару десятков return'ов smile ?

А такой вариант в твоей программе не прокатит ?:

Код

if (условие1 && условие2 && условие3 && условие4 && условие5 && условие6)
{
    // Все условия удовлетворяют
}


Это сообщение отредактировал(а) SABROG - 10.5.2008, 12:30


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
maroonorg
Дата 10.5.2008, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 1.10.2007

Репутация: нет
Всего: нет



Да, так точно. 

Не думаю что это сильно усложнить читабельность кода ( в некоторых случаях даже уменьшит )

К твоему вопросу: на каждое условие должно быть свое сообщение об ошибке. Т.е. если не заполнено поле, то должно вывести что именно это поле не заполнено.

Представь себе 20 вложенных условий (  smile  ) , я бы лично даже читать бы такое отказался

Извиняюсь за smile 
PM MAIL   Вверх
SABROG
Дата 10.5.2008, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 3
Всего: 91



Неправильный подход для создания форм, где есть обязательные для заполнения поля.

Должно быть как-то так:

- есть массив элементов-контролов, каждому элементу соответствует название "Название организации", "Пол", "Дата рождения" и флаг "Обязательно к заполнению" или "Необязательно заполнять".
- в цикле, функция типа isAllValid проверяет каждое из полей
- если поле не заполнено и стоит флаг "Обязательно к заполнению" - выводим сообщение: 'Поле "Название организации" должно быть заполнено'.
- если параметр не обязательный, но данные не валидные (например e-mail не удовлетворяет регулярному выражению, скажем ввели vasya@mailru, т.е. точку забыли), то опять же выводим сообщение: 'Поле "Электронный адрес" не корректно'.

В общем грубо говоря, вместо того, чтобы плодить if'ы надо перебирать контролы на форме и в зависимости от флагов и параметров ругаться. Т.е. работа с динамическим массивом.

Это сообщение отредактировал(а) SABROG - 10.5.2008, 12:52


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
maroonorg
Дата 10.5.2008, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 1.10.2007

Репутация: нет
Всего: нет



А нельзя привести пример такого приложения, пожалуйста?
 smile 
Заранее спасибо.
PM MAIL   Вверх
SABROG
Дата 10.5.2008, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 3
Всего: 91



Вот упрощенный вариант.

user posted image

Идея тут такая:

- в поле 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


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
maroonorg
Дата 10.5.2008, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 1.10.2007

Репутация: нет
Всего: нет



Идея интересная, но почему бы ее немного не упростить?

Немного измененная версия. На 2007 Builder'е. Если нет 2007 билдера:

user posted image

Имена элементов Label1, Edit1,  Label2, Edit2,  Label3, Edit3.
У Edit1 и Edit3 параметр Tag == 1. Воообще не имеет смысла, надо хоть одну единицу для проверки работы  smile

При нажатии на кнопку:

Код

    for (register int i = 1; i <= 3; i++)
    {
        TEdit *pEdit = dynamic_cast <TEdit*> (this->FindComponent("Edit" + IntToStr(i) ) );
        if ( pEdit->Tag && pEdit->Text.IsEmpty() )
        {
            TLabel *pLabel = dynamic_cast <TLabel*> (this->FindComponent("Label" + IntToStr(i) ) );
            ShowMessage("Заполните поле \"" + pLabel->Caption + "\"");
            return;
        }
    }


И еще вопрос, что будет работать быстрее:
Код

Edit->Text.isEmpty()

или
Код

Edit->Text == ""



Это сообщение отредактировал(а) maroonorg - 10.5.2008, 14:33

Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  IsValid.rar 6,60 Kb
PM MAIL   Вверх
SABROG
Дата 10.5.2008, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 3
Всего: 91



Тут у тебя жестко задано количество элементов, косяк появится, когда добавишь или удалиш поле:

Код

for (register int i = 1; i <= 3; i++)


Я бы не советовал привязываться к именам компонентов, также как и к их названиям классов. К ссылкам/указателям - пожалуйста. Кстати указывать this-> не обязательно, достаточно FindComponent.

Тут тоже я бы не привязывался жестко:

Код

if ( pEdit->Tag && pEdit->Text.IsEmpty() )


Как я писал выше, вполне возможно, что поле может и не быть обязательным, но если его все-таки указали, то вероятно есть смысл проверить его на валидность (e-mail, ip адрес, номер ИНН, день рождения). К Label'ам я вообще не стал привязываться по той причине, что их может и не быть (например группа элементов для дня рождения: Edit - день рождения, combobox - месяц рождения, combobox - год рождения, элемента 3, а label один).

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


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
maroonorg
Дата 10.5.2008, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 1.10.2007

Репутация: нет
Всего: нет



SABROG, спасибо, учту, запомню
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.1219 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.