Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.10.2015, 12:30   #1
dock2005
 
Регистрация: 09.10.2015
Сообщений: 6
По умолчанию 3 If условия c под условиями (if) b одинаковыми телами.

Привет. Если кто нибудь может помочь с решение лёгкой задачи ответа на которую я к своему стыду не знаю прошу помочь.

Суть такая 3 if условия (chrcc = 1, 2, 0), в каждом условии еще одно под условие. Тела под условий одинаковые. Как оформить код таким образом, что бы "тело" if'оф употреблялось только один раз.

Объяснения №2: Есть три условия в каждом из которых, есть разные под условия (в количестве 1 шт). Тела, внутри каждого под условия одинаковы (имеем 3 одинаковые конструкции, но они внутри под условий, т.е. :
Первое условие со значением 1 -> Первое под условие -> тело
Второе условие со значением 2 -> Второе под условие -> тело
Треть условие со значением 0 -> Третье под условие -> тело).

Код:
if checc = 1 then
begin
  if (sel_NakladCuVIDPF_NO.Value = 1) or (sel_NakladCuVIDPF_NO.Value = 16) then
  begin
    VesIzol:=a;
  end
  else
  begin
    VesIzol:=b;
  end;
end;
 
if checc = 2 then
begin
  if (sel_NakladCuVIDPF_NO.Value = 5) or (sel_NakladCuVIDPF_NO.Value = 6) or (sel_NakladCuVIDPF_NO.Value = 7) or (sel_NakladCuVIDPF_NO.Value = 11) then
  begin
    VesIzol:=a;    
  end
  else
  begin
    VesIzol:=b;
  end;
end;
 
if (checc <> 1) and (checc <> 2) then
begin
  if (sel_NakladCumORkg.Value = 1) then
  begin
   VesIzol:=a;
  end
  else
  begin
    VesIzol:=b;
  end;
end;
Само тело
Код:
begin
    VesIzol:=a;
  end
  else
  begin
    VesIzol:=b;
  end;
Которое повторяется 3 раза. Необходимо сделать так, что бы "тело" было только одно.

Последний раз редактировалось dock2005; 09.10.2015 в 12:33. Причина: Правка условия.
dock2005 вне форума Ответить с цитированием
Старый 09.10.2015, 12:35   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Код:

case checc of
 1: if sel_NakladCuVIDPF_NO.Value in [1,16] then VesIzol:=a else VesIzol:=b;
 2: if sel_NakladCuVIDPF_NO.Value in [5,6,7,11] then VesIzol:=a else VesIzol:=b;
 else if sel_NakladCumORkg.Value = 1 then VesIzol:=a else VesIzol:=b;
end;
Не?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.10.2015, 12:49   #3
dock2005
 
Регистрация: 09.10.2015
Сообщений: 6
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Не?
Это оформление намного красивее моего.

Но тело "VesIzol:=a else VesIzol:=b;" всё еще используется 3 раза.

В приведённом примере тело это 1 строчка, в реальном 15 строчек (упрощено было для наглядности). Именно количество строчек --> кода (тело) хотелось бы уменьшить с 3 до 1. Как ума не приложу.

Вам за ответ спасибо.
dock2005 вне форума Ответить с цитированием
Старый 09.10.2015, 12:53   #4
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Оформите функцией делов-то.

Код:
function FOO(Flag:Boolean):Variant; // Тут вместо Variant подставте свой тип.
begin
if Flag then 
   Result:=a
  else 
    Result:=b;
end;
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 09.10.2015, 13:06   #5
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,777
По умолчанию

Код:
begin
  if ((checc = 1) and (sel_NakladCuVIDPF_NO.Value in [1, 16])) or
    ((checc = 2) and (sel_NakladCuVIDPF_NO.Value in [5, 7, 11])) or
    (sel_NakladCumORkg.Value = 1) then
  begin
    VesIzol:=a;
  end
  else
  begin
    VesIzol:=b;
  end;
end;
Vapaamies вне форума Ответить с цитированием
Старый 09.10.2015, 13:08   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Но тело "VesIzol:=a else VesIzol:=b;" всё еще используется 3 раза.
Не за теми метелками ты гонишься )
Если данные тебе приходят из БД, то такие вещи стоит решать вычисляемыми полями на уровне запроса.
А вообще я не вижу тут быдлокода. Да - много букаф, но если это работает и масштабируется то париться не стоит.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.10.2015, 13:19   #7
dock2005
 
Регистрация: 09.10.2015
Сообщений: 6
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Да - много букаф, но если это работает и масштабируется то париться не стоит.
Спасибо за ответ.

Да работает, просто очень много кода. А делфи7 не умеет делать Code-folding (скрывать часть кода). И конструкции получаются очень внушительные. Ну думаю придётся делать так.

А вам еще раз спасибо.
dock2005 вне форума Ответить с цитированием
Старый 09.10.2015, 13:23   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
И конструкции получаются очень внушительные.
В таком случае правильно выше сказано: Оборачивать узлы конструкции в функции ил методы классов. Ну и в отдельные юниты выносить (но с умом, а не каждую функу в отдельный юнит). И будет все ми-ми-ми.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.10.2015, 14:00   #9
dock2005
 
Регистрация: 09.10.2015
Сообщений: 6
По умолчанию

Цитата:
Сообщение от Vapaamies Посмотреть сообщение
Код:
begin
  if ((checc = 1) and (sel_NakladCuVIDPF_NO.Value in [1, 16])) or
    ((checc = 2) and (sel_NakladCuVIDPF_NO.Value in [5, 7, 11])) or
    (sel_NakladCumORkg.Value = 1) then
  begin
    VesIzol:=a;
  end
  else
  begin
    VesIzol:=b;
  end;
end;
Не заметил ваш ответ. Добавил в него лишь 1 условие и всё идельно подошло.
Код:
((checc = 0) and (sel_NakladCumORkg.Value = 1)) then
Финально выглядит так:

Код:
begin
  if ((checc = 1) and (sel_NakladCuVIDPF_NO.Value in [1,16])) or
  ((checc = 2) and (sel_NakladCuVIDPF_NO.Value in [5,6,7,11])) or
  ((checc = 0) and (sel_NakladCumORkg.Value = 1)) then
  begin
    VesIzol:=sel_vesizolCuSUM_IZOL.Value+(sel_NakladCuKOLVO.Value*sel_LIBCuKON_RAS_MED.Value);
    Parameters.ParamByName('CHER_VES').Value:=(sel_NakladCuKOLVO.Value*sel_LIBCuKON_RAS_MED.Value);
  end
  else
  begin
    VesIzol:=sel_vesizolCuSUM_IZOL.Value+(sel_NakladCuKOLVO.Value*sel_LIBCuKON_RAS_MED.Value)/1000;
    Parameters.ParamByName('CHER_VES').Value:=(sel_NakladCuKOLVO.Value*sel_LIBCuKON_RAS_MED.Value)/1000;
  end;
end;
dock2005 вне форума Ответить с цитированием
Старый 09.10.2015, 15:16   #10
dock2005
 
Регистрация: 09.10.2015
Сообщений: 6
По умолчанию

Цитата:
Сообщение от Vapaamies Посмотреть сообщение
Код:
begin
  if ((checc = 1) and (sel_NakladCuVIDPF_NO.Value in [1, 16])) or
    ((checc = 2) and (sel_NakladCuVIDPF_NO.Value in [5, 7, 11])) or
    (sel_NakladCumORkg.Value = 1) then
  begin
    VesIzol:=a;
  end
  else
  begin
    VesIzol:=b;
  end;
end;
А не поторопился, не правильно обрабатывается условия.

((checc = 1) and (sel_NakladCuVIDPF_NO.Value in [1, 16])) or

((checc = 2) and (sel_NakladCuVIDPF_NO.Value in [5, 7, 11])) or

например если sel_NakladCuVIDPF_NO.Value = 5 это не помешает при checc = 1 пройти в тело расчёта. А это уже нарушает условия выборки.
dock2005 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление строк с одинаковыми значениями artsanox Microsoft Office Excel 3 09.12.2013 04:45
Приведение типов с одинаковыми свойствами praeeo Общие вопросы Delphi 3 21.12.2010 14:14
несколько ComboBox-ов с одинаковыми данными.... brans Microsoft Office Excel 2 07.11.2010 14:06
max расстояние между плоскими телами! Flanker13 Общие вопросы Delphi 3 17.03.2009 13:46
Выборка данных, попадающих под определенные условия tambovsky Microsoft Office Excel 2 13.08.2008 14:48