Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

Ответ
 
Опции темы
Старый 06.04.2010, 20:57   #1
Alex Cones
Trust no one.
Профессионал
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Адрес: In the middle of nowhere.
Сообщений: 6,524
Репутация: 1440
По умолчанию Оптимизация и сокращение кода (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
Сообщений: 4,741
Репутация: 2097
По умолчанию

вариант понятный
Код:

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
Адрес: In the middle of nowhere.
Сообщений: 6,524
Репутация: 1440
По умолчанию

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


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 вне форума   Ответить с цитированием
Ответ

Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Оптимизация кода в си 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 17:57
Оптимизация кода. MAKTECYMA Общие вопросы C/C++ 2 05.06.2008 16:48


10:44.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru