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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.02.2014, 19:12   #1
FleXik
Форумчанин
 
Регистрация: 01.11.2012
Сообщений: 770
По умолчанию case of - Too many local constants. Use shorter procedures

Код:
var
w:string;
begin 
w:='0';
 if sComboBox3.ItemIndex=2 then
  begin
    case sComboBox4.ItemIndex of
      1 : case sComboBox5.ItemIndex of
        1 : w:='11';
      end;
      2 : case sComboBox5.ItemIndex of
        1 : w:='196';         2 : w:='259'; // цифры меняются в зависимости от ItemIndex комбобокса
        3 : w:='47';         4 : w:='181';
        5 : w:='135';
      end;
    end;
  end;
end;
такого кода ~5000 строк, в итоге при компиляции проэкта получаю следующее:
Код:
Too many local constants.  Use shorter procedures
проверял, перебор 70 строк, если 70 строк из 5000 удалить - проэкт компилится, как решить проблему не переписывая проэкт? Уже второй раз переписываю в итоге каких-то 70 строк ставят под вопрос мою 3-х дневную работу...



Код:
Плодить темы прекращай.
я знаю, извиняюсь...

Последний раз редактировалось FleXik; 17.02.2014 в 19:15.
FleXik вне форума Ответить с цитированием
Старый 17.02.2014, 19:15   #2
doktor255
Заблокирован
 
Регистрация: 31.03.2011
Сообщений: 976
По умолчанию

Плодить темы прекращай.
doktor255 вне форума Ответить с цитированием
Старый 17.02.2014, 19:56   #3
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Я бы советовал уйти в горы постигать дзен. Программирование, очевидно, не Ваше.
Любой человек увидев что для задачи требуется труд, дурной и монотонный, который как раз и должна выполнять машина, сообразит, что _тут что-то не так_ и сей труд надо поручить машине, а не будет сам сидеть и как обезьянка пытаться добиться своего самым тупым способом, чего бы оно не стоило, вместо того, чтобы применить голову. Вашему способу даже есть официальное название - китайский код.

Ваша задача (если её правильно можно понять, см. опять же сагу о xyz) решается несколькими способами.
Во-первых, файл, в нём лежит массив данных по индексам комбобокса.
читаете файл в массив потом по индексу подставляете значение.
Во-вторых, массив в коде, одной константой. Дельфи Вам прямо говорит о переизбытке локальных констант, т.к. любая строка или число в коде процедуры уже является константой, просто объявленной неявно. (надо же программе как-то хранить информацию о том как производить операции - вот и хранит в локальных константах).
То, что на Ваш взгляд кажется сложным из-за разных условий по комбобоксам, на самом деле лишь вопрос организации структуры хранения, например можно дополнительно хранить индекс другого комбобокса постоянно (тот что для более "высокого" кейса используется) или же озаботиться структурой данных "дерево" и сделать через неё, а уж готовую структуру можно опять же залить в файл или ещё как.
Ещё один способ - хранить в базе данных, тогда загрузку в комбобоксы можно сделать полуавтоматической (через датасеты), и сопоставление нужных данных нужным индексам будет браться из базы.

Есть ещё один волшебный способ, но его сложно будет Вам реализовать - полиморфизм на классах, в нём даже кейсы не понядобятся, индексы комбобоксов будут определяющими данными для построения нужных экземпляров, которые и будут производить дальнейшую Вашу работу (которую Вы опять же скрыли, по канонам Саги)

Последний раз редактировалось phomm; 17.02.2014 в 19:58.
phomm вне форума Ответить с цитированием
Старый 17.02.2014, 20:05   #4
FleXik
Форумчанин
 
Регистрация: 01.11.2012
Сообщений: 770
По умолчанию

phomm, понимаете, код переписываю уже второй раз (3-4 дня занимает один раз переписать код т.к все значения задаются вручную), или по вашему я должен год над этой задачей сидеть или может лет двадцать? я и гуглил но нигде толком ничего не пишут, этот форум а уж тем более раздел и создан для того чтобы помогать друг другу, все индивидуально, никто никого помогать не заставляет.
FleXik вне форума Ответить с цитированием
Старый 17.02.2014, 20:17   #5
ReportCube
Форумчанин
 
Аватар для ReportCube
 
Регистрация: 11.03.2011
Сообщений: 426
По умолчанию

Так вам же объяснили, что такие вещи лучше не в коде писать, а во внешних хранилищах, хотя бы в том же Combobox-е числовое значение можно сохранять вместе со строками, как объекты. Лучше подумайте над организацией программы, а не над трёхдневном написании одного и того же алгоритма.
ReportCube вне форума Ответить с цитированием
Старый 17.02.2014, 20:29   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

не хотелось бы поддерживать Вас в вашему упорном желании писать индусский код, но, с другой стороны, жалко, что Вы пытаетесь лбом прошибить стенку, даже не понимая, что для этого давно уже придумали другие средства....

короче, создайте ОТДЕЛЬНЫЙ модуль (например, File - New... Unit... )
и вынесите свой код туда, например, в функцию:
Код:
function GetComboBox5Value2(const ItemIndex5 : integer) : string;
begin
   Result := '';
   case ItemIndex5 of
        1 : Result:='196';         2 : Result:='259'; // цифры меняются в зависимости от ItemIndex комбобокса
        3 : Result:='47';         Result : w:='181';
        5 : Result:='135';
      end;
end;
тогда в основном модуле нужно будет подключить даннуй unit через Uses <ИмяВашегоUnit>

и можно будет писать так:
Код:
if sComboBox3.ItemIndex=2 then
  begin
    case sComboBox4.ItemIndex of
      1 : case sComboBox5.ItemIndex of
        1 : w:='11';
      end;
      2 : w :=  GetComboBox5Value2( sComboBox5.ItemIndex );
    end;
  end;

но вообще, Вы абсолютно зря не хотите переделать свой код так, как это положено!
Перечитывайте пост #3 и #5 в данной теме до ПОЛНОГО просветления. Если что-то непонятно - спрашивайте совета.
И переписывать код в нормальный можно с помощью автоматизации - в полуавтоматическом режиме (макросы и обработку текста программы никто не отменял).



Код:
код переписываю уже второй раз (3-4 дня занимает один раз переписать код т.к все значения задаются вручную)
может быть, стоит уже подключить к рукам голову и написать так, чтобы не нужно было год переписывать одно и то же?!!

Последний раз редактировалось Serge_Bliznykov; 17.02.2014 в 20:32.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 17.02.2014, 20:36   #7
FleXik
Форумчанин
 
Регистрация: 01.11.2012
Сообщений: 770
По умолчанию

Serge_Bliznykov, спасибо.


Serge_Bliznykov, сейчас буду пробовать, код ясен и понятен, спасибо, просто некоторые здесь пишут заумными формулировками которые не всегда мне понятны. Я не обижаюсь, а так должно получиться конечно, я и раньше работал с функциями просто руки не доходили до написания их самому...


Serge_Bliznykov, проверил, идеально работает, какраз прям в точку, то что надо, спасибо огромное

Последний раз редактировалось FleXik; 17.02.2014 в 21:11.
FleXik вне форума Ответить с цитированием
Старый 17.02.2014, 20:39   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Пожалуйста.
Получилось?


И не обижайтесь на правду, все мы когда-то были новичками..
Если нужна помощь(хоть методологическая, хоть практическая) в переработке вашего кода в более-менее нормальный - обращайтесь!
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Too many local constants. Use shorter procedures FleXik Общие вопросы Delphi 22 12.02.2014 13:56
thread-local storage 220Volt Общие вопросы C/C++ 4 13.08.2013 20:12
Перемещение из case 1 в case 2(switch(), язык Си) Павел_95 Помощь студентам 13 11.01.2013 14:18
Delphi7 создание формы Runtime, constants cannot be used as open array arguments BoozZzilla Помощь студентам 2 29.03.2011 17:27