Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.03.02;
Скачать: CL | DM;

Вниз

Советы по оптимизации   Найти похожие ветки 

 
Stenfit   (2008-02-05 20:53) [0]

Господа Мастера. Поделитесь советами по оптимизации кода. Имеются 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;


 
Johnmen ©   (2008-02-05 21:07) [1]

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

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


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


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:50) [3]


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

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


 
guav ©   (2008-02-06 11:15) [4]

>     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;


 
guav ©   (2008-02-06 11:16) [5]

> byte(MaxScaleValue = 0);

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



Страницы: 1 вся ветка

Текущий архив: 2008.03.02;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.021 c
2-1201860517
mrFreeman2007
2008-02-01 13:08
2008.03.02
Анализатор спектра


2-1202463532
alexsashkan
2008-02-08 12:38
2008.03.02
Проблема с загрузкой из Екселя


15-1200218991
Kolan
2008-01-13 13:09
2008.03.02
Рефакторин Extract resource string работает не так как ожидается.


15-1200865288
DillerXX
2008-01-21 00:41
2008.03.02
На материнке есть маркировка с названием модели?


2-1202111662
MZG
2008-02-04 10:54
2008.03.02
Не понятно в Tree View