Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 29.04.2011, 20:59
crazypiters crazypiters вне форума
Прохожий
 
Регистрация: 26.04.2011
Сообщения: 4
Репутация: 10
По умолчанию Как написать короче и оптимальнее

А можно ли сократить данный код?

Код:
procedure TForm2.RadioGroup7Click(Sender: TObject);
begin
if (RadioGroup1.ItemIndex=0)  and (RadioGroup2.ItemIndex=5) and (RadioGroup4.ItemIndex=0) and (RadioGroup5.ItemIndex=0) and (RadioGroup6.ItemIndex=4) and (RadioGroup7.ItemIndex=3) then a:=2.8;
if (RadioGroup1.ItemIndex=0)  and (RadioGroup2.ItemIndex=5) and (RadioGroup4.ItemIndex=0) and (RadioGroup5.ItemIndex=0) and (RadioGroup6.ItemIndex=7) and (RadioGroup7.ItemIndex=3) then a:=3.7;
if (RadioGroup1.ItemIndex=0)  and (RadioGroup2.ItemIndex=5) and (RadioGroup4.ItemIndex=0) and (RadioGroup5.ItemIndex=2) and (RadioGroup6.ItemIndex=4) and (RadioGroup7.ItemIndex=3) then a:=3.3;
if (RadioGroup1.ItemIndex=0)  and (RadioGroup2.ItemIndex=5) and (RadioGroup4.ItemIndex=0) and (RadioGroup5.ItemIndex=2) and (RadioGroup6.ItemIndex=7) and (RadioGroup7.ItemIndex=3) then a:=4.3;
if (RadioGroup1.ItemIndex=0)  and (RadioGroup2.ItemIndex=5) and (RadioGroup4.ItemIndex=1) and (RadioGroup5.ItemIndex=0) and (RadioGroup6.ItemIndex=5) and (RadioGroup7.ItemIndex=0) then a:=20.7;
if (RadioGroup1.ItemIndex=0)  and (RadioGroup2.ItemIndex=0) and (RadioGroup4.ItemIndex=0) and (RadioGroup5.ItemIndex=1) and (RadioGroup6.ItemIndex=4) and (RadioGroup7.ItemIndex=3) then a:=1;
if (RadioGroup1.ItemIndex=0)  and (RadioGroup2.ItemIndex=0) and (RadioGroup4.ItemIndex=0) and (RadioGroup5.ItemIndex=2) and (RadioGroup6.ItemIndex=4) and (RadioGroup7.ItemIndex=3) then a:=0.7;
if (RadioGroup1.ItemIndex=0)  and (RadioGroup2.ItemIndex=6) and (RadioGroup4.ItemIndex=0) and (RadioGroup5.ItemIndex=1) and (RadioGroup6.ItemIndex=7) and (RadioGroup7.ItemIndex=3) then a:=5.4;
if (RadioGroup1.ItemIndex=0)  and (RadioGroup2.ItemIndex=6) and (RadioGroup4.ItemIndex=0) and (RadioGroup5.ItemIndex=2) and (RadioGroup6.ItemIndex=7) and (RadioGroup7.ItemIndex=3) then a:=3.8;
end;
Ответить с цитированием
  #2  
Старый 29.04.2011, 21:52
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Да. Можно.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #3  
Старый 29.04.2011, 22:14
crazypiters crazypiters вне форума
Прохожий
 
Регистрация: 26.04.2011
Сообщения: 4
Репутация: 10
По умолчанию

А как можно?
Ответить с цитированием
  #4  
Старый 29.04.2011, 22:51
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,035
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

1. Для начала завели несколько переменных, в которые положи значения из RadioGroupX.ItemIndex\
Код:
procedure TForm2.RadioGroup7Click(Sender: TObject);
var
  rb1, rb2, rb4, rb5, rb6, rb7 : Integer;
begin
  rb1 := RadioGroup1.ItemIndex;
  rb2 := RadioGroup2.ItemIndex;
  rb4 := RadioGroup4.ItemIndex;
  rb5 := RadioGroup5.ItemIndex;
  rb6 := RadioGroup6.ItemIndex;
  rb7 := RadioGroup7.ItemIndex;
  if (rb1=0) and (rb2=5) and (rb4=0) and (rb5=0) and (rb6=4) and (rb7=3) then a:=2.8;
  if (rb1=0) and (rb2=5) and (rb4=0) and (rb5=0) and (rb6=7) and (rb7=3) then a:=3.7;
  if (rb1=0) and (rb2=5) and (rb4=0) and (rb5=2) and (rb6=4) and (rb7=3) then a:=3.3;
  if (rb1=0) and (rb2=5) and (rb4=0) and (rb5=2) and (rb6=7) and (rb7=3) then a:=4.3;
  if (rb1=0) and (rb2=5) and (rb4=1) and (rb5=0) and (rb6=5) and (rb7=0) then a:=20.7;
  if (rb1=0) and (rb2=0) and (rb4=0) and (rb5=1) and (rb6=4) and (rb7=3) then a:=1;
  if (rb1=0) and (rb2=0) and (rb4=0) and (rb5=2) and (rb6=4) and (rb7=3) then a:=0.7;
  if (rb1=0) and (rb2=6) and (rb4=0) and (rb5=1) and (rb6=7) and (rb7=3) then a:=5.4;
  if (rb1=0) and (rb2=6) and (rb4=0) and (rb5=2) and (rb6=7) and (rb7=3) then a:=3.8;
end;
Уже читабельнее и быстрее, хотя и требует немного больше памяти.

2. У тебя rb1 может быть только 0. Все остальные случаи игнорируем. Соответсвенно:
Код:
procedure TForm2.RadioGroup7Click(Sender: TObject);
var
  rb1, rb2, rb4, rb5, rb6, rb7 : Integer;
begin
  rb1 := RadioGroup1.ItemIndex;
  rb2 := RadioGroup2.ItemIndex;
  rb4 := RadioGroup4.ItemIndex;
  rb5 := RadioGroup5.ItemIndex;
  rb6 := RadioGroup6.ItemIndex;
  rb7 := RadioGroup7.ItemIndex;
  if rb1=0 then
    begin
      if (rb2=5) and (rb4=0) and (rb5=0) and (rb6=4) and (rb7=3) then a:=2.8;
      if (rb2=5) and (rb4=0) and (rb5=0) and (rb6=7) and (rb7=3) then a:=3.7;
      if (rb2=5) and (rb4=0) and (rb5=2) and (rb6=4) and (rb7=3) then a:=3.3;
      if (rb2=5) and (rb4=0) and (rb5=2) and (rb6=7) and (rb7=3) then a:=4.3;
      if (rb2=5) and (rb4=1) and (rb5=0) and (rb6=5) and (rb7=0) then a:=20.7;
      if (rb2=0) and (rb4=0) and (rb5=1) and (rb6=4) and (rb7=3) then a:=1;
      if (rb2=0) and (rb4=0) and (rb5=2) and (rb6=4) and (rb7=3) then a:=0.7;
      if (rb2=6) and (rb4=0) and (rb5=1) and (rb6=7) and (rb7=3) then a:=5.4;
      if (rb2=6) and (rb4=0) and (rb5=2) and (rb6=7) and (rb7=3) then a:=3.8;
    end;
end;

3. Теперь переходим к rb4. Тут у нас 2 случая: 0 и 1
Код:
procedure TForm2.RadioGroup7Click(Sender: TObject);
var
  rb1, rb2, rb4, rb5, rb6, rb7 : Integer;
begin
  rb1 := RadioGroup1.ItemIndex;
  rb2 := RadioGroup2.ItemIndex;
  rb4 := RadioGroup4.ItemIndex;
  rb5 := RadioGroup5.ItemIndex;
  rb6 := RadioGroup6.ItemIndex;
  rb7 := RadioGroup7.ItemIndex;
  if rb1=0 then
    begin
      if rb4=1
        then
          begin		
	if (rb2=5) and (rb5=0) and (rb6=5) and (rb7=0) then a:=20.7;
          end
        else
          begin
            if (rb2=5) and (rb5=0) and (rb6=4) and (rb7=3) then a:=2.8;
            if (rb2=5) and (rb5=0) and (rb6=7) and (rb7=3) then a:=3.7;
            if (rb2=5) and (rb5=2) and (rb6=4) and (rb7=3) then a:=3.3;
            if (rb2=5) and (rb5=2) and (rb6=7) and (rb7=3) then a:=4.3;
            if (rb2=0) and (rb5=1) and (rb6=4) and (rb7=3) then a:=1;
            if (rb2=0) and (rb5=2) and (rb6=4) and (rb7=3) then a:=0.7;
            if (rb2=6) and (rb5=1) and (rb6=7) and (rb7=3) then a:=5.4;
            if (rb2=6) and (rb5=2) and (rb6=7) and (rb7=3) then a:=3.8;
         end;
    end;
end;

4. Теперь смотрим на rb7 - может быть только 3:
Код:
procedure TForm2.RadioGroup7Click(Sender: TObject);
var
  rb1, rb2, rb4, rb5, rb6, rb7 : Integer;
begin
  rb1 := RadioGroup1.ItemIndex;
  rb2 := RadioGroup2.ItemIndex;
  rb4 := RadioGroup4.ItemIndex;
  rb5 := RadioGroup5.ItemIndex;
  rb6 := RadioGroup6.ItemIndex;
  rb7 := RadioGroup7.ItemIndex;
  if rb1=0 then
    begin
      if rb4=1
        then
          begin		
	if (rb2=5) and (rb5=0) and (rb6=5) and (rb7=0) then a:=20.7;
          end
        else
          begin
	if rb7=3 then
	  begin
	    if (rb2=5) and (rb5=0) and (rb6=4) then a:=2.8;
                 if (rb2=5) and (rb5=0) and (rb6=7) then a:=3.7;
                 if (rb2=5) and (rb5=2) and (rb6=4) then a:=3.3;
                 if (rb2=5) and (rb5=2) and (rb6=7) then a:=4.3;
                 if (rb2=0) and (rb5=1) and (rb6=4) then a:=1;
                 if (rb2=0) and (rb5=2) and (rb6=4) then a:=0.7;
                 if (rb2=6) and (rb5=1) and (rb6=7) then a:=5.4;
                 if (rb2=6) and (rb5=2) and (rb6=7) then a:=3.8;
              end;
         end;
    end;
end;

Ну дальше можно не оптимизировать, уже достаточно читабельно.
А вообще, я бы скорее подумал как вообще это переделать, а то как-то странно выглядит - из кучи возможных вариантов ты рассматриваешь только 9. А с остальными что? Тут скорее надо менять интерфейс. Но условие задачи не описано.
Ответить с цитированием
  #5  
Старый 29.04.2011, 23:11
crazypiters crazypiters вне форума
Прохожий
 
Регистрация: 26.04.2011
Сообщения: 4
Репутация: 10
По умолчанию

ну у меня 7 RadioGroup, в каждой от 4 до 20 строк значений....
и выложил я лишь маленькую часть
там куча всевозможных выборов((( да еще и ошибки выводятся если не так выбрал....или скрываются те строки которые нельзя выбрать...
но гдет допустил ошибку и пересматривать 400 строк не оч, хочу написать по новой, и вот думаю как это все сократить можно...
Ответить с цитированием
  #6  
Старый 30.04.2011, 13:46
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Может просто функцию сделать и всех делов?
Код:
function ProstoFunction(Idx1,Idx2,Idx4,Idx5,Idx6,Idx7: Integer): Boolean;
begin
 Result := (RadioGroup1.ItemIndex=Idx1)  and (RadioGroup2.ItemIndex=Idx2) and
    (RadioGroup4.ItemIndex=Idx4) and (RadioGroup5.ItemIndex=Idx5) and
    (RadioGroup6.ItemIndex=Idx6) and (RadioGroup7.ItemIndex=Idx7) 
end;
Тогда условия запишутся так:
Код:
If ProstoFunction(0,5,0,0,4,3) then a := 2.8;
If ProstoFunction(0,5,0,0,7,3) then a := 3.7;
If ProstoFunction(0,5,0,2,4,3) then a := 3.3;
If ProstoFunction(0,5,0,2,7,3) then a := 4.3;
if ProstoFunction(0,5,1,0,5,0) then a := 20.7;
if ProstoFunction(0,0,0,1,4,3) then a := 1;
if ProstoFunction(0,0,0,2,4,3) then a := 0.7;
if ProstoFunction(0,6,0,1,7,3) then a := 5.4;
if ProstoFunction(0,6,0,2,7,3) then a := 3.8;
А вообще все это можно в матрицу прописать и тогда в цикле можно будет получать нужное значение а
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.

Последний раз редактировалось Страдалецъ, 30.04.2011 в 13:48.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 05:55.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter