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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.04.2010, 20:57   #1
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию Оптимизация и сокращение кода (if + сдвиг)

Никак не приходит в голову, как сократить это безобразие написанное бессонной ночью:

Код:
Procedure DrawArrows(_Z : Byte);
 Begin
  FRMMain.IMGMain.Canvas.Draw(20,200,Arrows[0]);
  If _Z > 4 Then
   FRMMain.IMGMain.Canvas.Draw(20,250,Arrows[3])
  Else
   FRMMain.IMGMain.Canvas.Draw(20,250,Arrows[2]);

  If _Z > 3 Then
   FRMMain.IMGMain.Canvas.Draw(20,300,Arrows[3])
  Else
   FRMMain.IMGMain.Canvas.Draw(20,300,Arrows[2]);

  If _Z > 2 Then
   FRMMain.IMGMain.Canvas.Draw(20,350,Arrows[3])
  Else
   FRMMain.IMGMain.Canvas.Draw(20,350,Arrows[2]);

  If _Z > 1 Then
   FRMMain.IMGMain.Canvas.Draw(20,400,Arrows[3])
  Else
   FRMMain.IMGMain.Canvas.Draw(20,400,Arrows[2]);

  If _Z > 0 Then
   FRMMain.IMGMain.Canvas.Draw(20,450,Arrows[3])
  Else
   FRMMain.IMGMain.Canvas.Draw(20,450,Arrows[2]);

  FRMMain.IMGMain.Canvas.Draw(20,500,Arrows[1]);
 End;
Заранее благодарю.

P.S. Если кроме сокращение возможна и скоростная оптимизация, прошу сообщить
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 06.04.2010, 21:34   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

вариант понятный
Код:
case _Z
0: здесь конечно же нужен begin end
   FRMMain.IMGMain.Canvas.Draw(20,250,Arrows[2]);
   FRMMain.IMGMain.Canvas.Draw(20,300,Arrows[2]);
   FRMMain.IMGMain.Canvas.Draw(20,350,Arrows[2]);
   FRMMain.IMGMain.Canvas.Draw(20,400,Arrows[2]);
   FRMMain.IMGMain.Canvas.Draw(20,450,Arrows[2]);
1:
   FRMMain.IMGMain.Canvas.Draw(20,250,Arrows[2]);
   FRMMain.IMGMain.Canvas.Draw(20,300,Arrows[2]);
   FRMMain.IMGMain.Canvas.Draw(20,350,Arrows[2]);
   FRMMain.IMGMain.Canvas.Draw(20,400,Arrows[2]);
   FRMMain.IMGMain.Canvas.Draw(20,450,Arrows[3])
2:
   FRMMain.IMGMain.Canvas.Draw(20,250,Arrows[2]);
   FRMMain.IMGMain.Canvas.Draw(20,300,Arrows[2]);
   FRMMain.IMGMain.Canvas.Draw(20,350,Arrows[2]);
   FRMMain.IMGMain.Canvas.Draw(20,400,Arrows[3])
   FRMMain.IMGMain.Canvas.Draw(20,450,Arrows[3])
3:
   FRMMain.IMGMain.Canvas.Draw(20,250,Arrows[2]);
   FRMMain.IMGMain.Canvas.Draw(20,300,Arrows[2]);
   FRMMain.IMGMain.Canvas.Draw(20,350,Arrows[3])
   FRMMain.IMGMain.Canvas.Draw(20,400,Arrows[3])
   FRMMain.IMGMain.Canvas.Draw(20,450,Arrows[3])
4:
   FRMMain.IMGMain.Canvas.Draw(20,250,Arrows[2]);
   FRMMain.IMGMain.Canvas.Draw(20,300,Arrows[3])
   FRMMain.IMGMain.Canvas.Draw(20,350,Arrows[3])
   FRMMain.IMGMain.Canvas.Draw(20,400,Arrows[3])
   FRMMain.IMGMain.Canvas.Draw(20,450,Arrows[3])
else                                                                   
   FRMMain.IMGMain.Canvas.Draw(20,250,Arrows[3])
   FRMMain.IMGMain.Canvas.Draw(20,300,Arrows[3])
   FRMMain.IMGMain.Canvas.Draw(20,350,Arrows[3])
   FRMMain.IMGMain.Canvas.Draw(20,400,Arrows[3])
   FRMMain.IMGMain.Canvas.Draw(20,450,Arrows[3])
end;
после такой записи на ум приходит и такой вариант
вариант короткий
Код:
for i:=4 downto _z do
    begin// pа точность координатных значений не уверен
   FRMMain.IMGMain.Canvas.Draw(20,250+I-z*50,Arrows[2])
end;

for i:=min(4,_z) downto  0 do
    begin
   FRMMain.IMGMain.Canvas.Draw(20,250+I-z*50,Arrows[3])
end;
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 06.04.2010 в 21:37.
evg_m на форуме Ответить с цитированием
Старый 06.04.2010, 21:37   #3
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Цитата:
вариант понятный
О_о мощно
Цитата:
вариант короткий
сейчас попробую.
Цитата:
точность координатных значений не уверен
У меня у самого координаты "скачут", подобрать не могу...


UPD --------------------

Не, не пашет второй способ. По координатам может чуть-чуть и совпадает (изменил 250 на 550), но за собой не "вытирает".
UPD 2 ------------------

В принципе можно сначала "фоновые" нарисовать:
Код:
For I := 0 to 4 do
   Begin
    FRMMain.IMGMain.Canvas.Draw(20,250 + 50 * I, Arrows[2]);
   End;
А потом возиться с индикатором.


UPD 3 ----------------------

О! Нашел!:

Код:
For I := 0 to 4 do
   Begin
    FRMMain.IMGMain.Canvas.Draw(20,250 + 50 * I, Arrows[2]);
   End;
 For I := 1 to Min(5,_z) Do
  Begin
   FRMMain.IMGMain.Canvas.Draw(20,500-I*50,Arrows[3])
  End;
Спасибо за наводку.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ

Последний раз редактировалось Alex Cones; 06.04.2010 в 21:53.
Alex Cones вне форума Ответить с цитированием
Ответ


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

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Оптимизация кода в си dampirik Помощь студентам 4 07.07.2009 11:30
Оптимизация кода viscas PHP 3 31.05.2009 16:04
Оптимизация кода nusik Общие вопросы Delphi 2 21.05.2009 17:55
Оптимизация кода Terran Общие вопросы Delphi 6 01.11.2008 16:57
Оптимизация кода. MAKTECYMA Общие вопросы C/C++ 2 05.06.2008 16:48