Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Советы по оптимизации


Stenfit ©   (2008-02-05 20:53:00) 

Господа Мастера. Поделитесь советами по оптимизации кода. Имеются edit и Action привязанный к кнопке.

     В методе Execute, Action'a рассматриваются две возможные ситуации:  

     1. Если число, введенное в edit содержится в массиве, то выводим следующее идущее за ним число в массиве.
     2. Если число в массиве не содержится, значит находим ближайшее большее число в массиве.
 
     Я сделал это так (Может можно было сделать проще):

Массив:

array [1..12] of Integer = (100, 200, 300, 400, 600, 800,
     1000, 1200, 1400, 1600, 1800, 2000);



// Execute Action
procedure Tform_Color_Range.act_ScaleInExecute(Sender: TObject);
var
  Index, delta, i: Integer;
  F: Boolean;
begin
   F := False;
   for i := Low(const_ArrayScale) to High(const_ArrayScale) do
      if const_ArrayScale[i] = StrToInt(edt_Scale.Text) then
      begin
          Index := i;
          F := True;
      end;
      if not F then
      begin
          delta := const_MaxScaleValue;
          Index := 1;
          for i := Low(const_ArrayScale) to High(const_ArrayScale) do
             if const_ArrayScale[i] > StrToInt(edt_Scale.Text) then
                 if abs((const_ArrayScale[i] - StrToInt(edt_Scale.Text))) < delta then
                 begin
                     delta := abs(const_ArrayScale[i] - StrToInt(edt_Scale.Text));
                     Index := i;
                 end;
      end;
   case F of
      False:
         param_Scale := const_ArrayScale[Index];  
      True:
         param_Scale := const_ArrayScale[Index + 1];
    end;
end;


guav   (2008-02-06 11:16:00) [1]

> byte(MaxScaleValue = 0);

Это лучше case, но ещё лучше нормальный if.


guav   (2008-02-06 11:15:00) [2]

>     1. Если число, введенное в edit содержится в массиве,
> то выводим следующее идущее за ним число в массиве.
>     2. Если число в массиве не содержится, значит находим
> ближайшее большее число в массиве.

То есть, надо просто найти число в массиве, которое больше заданного числа ?
Ну тогда
function ScaleUpperBound(const A: array of Integer; Value: Integer): Integer;
 for i := Low(const_ArrayScale) to High(const_ArrayScale) do
   if A[i] > Value then
   begin
     Result := A[i];
     Exit;
   end;
 // здесь надо определить что делать если число больше всех чисел в массиве
end;


procedure Tform_Color_Range.act_ScaleInExecute(Sender: TObject);
var
 Index, delta, i: Integer;
 F: Boolean;
begin
 edt_Scale.Text := IntToStr(ScaleUpperBound(const_ArrayScale, StrToInt(edt_Scale.Text)));
end;


Johnmen   (2008-02-05 21:50:00) [3]


> Index := i + byte(MaxScaleValue = 0);

Приводить тип надо к тому, с которым оперируем, т.е. к integer.


Stenfit   (2008-02-05 21:34:00) [4]


procedure Tform_Color_Range.act_ScaleInExecute(Sender: TObject);
var
 i, Value, Index, MaxScaleValue, delta: integer;
begin
  Value := StrToInt(edt_Scale.Text);
  MaxScaleValue := High(Integer);
  Index := -1;
  for i := Low(const_ArrayScale) to High(const_ArrayScale) do
  begin
     delta := Abs(const_ArrayScale[i] - Value);
     if (delta < MaxScaleValue) and (const_ArrayScale[i] > Value) then
     begin
        MaxScaleValue := delta;
        Index := i + byte(MaxScaleValue = 0);
     end;
  end;
  edit1.Text := (IntToStr(const_ArrayScale[Index]));
end;


Так подойдет ...


Johnmen   (2008-02-05 21:07:00) [5]

1. StrToInt делать 1 раз.
2. всё свести в один цикл.
3. не вычислять два раза одно и то же
4. case здесь зачем???
5. param_Scale := const_ArrayScale[Index+Ord(F)]

6. форматировать текст по-человечески.


Наверх

Титульная страница Поиск, карта сайта Написать письмо