Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.03.02;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.041 c
2-1202285277
взвзв
2008-02-06 11:07
2008.03.02
свойство только для чтения в классах


15-1201332607
Sergey Masloff
2008-01-26 10:30
2008.03.02
Еще про WinXP но не оффтопик


3-1192518920
Александр
2007-10-16 11:15
2008.03.02
Представление информации из баз данных в виде дерева


2-1202190088
Chebarov
2008-02-05 08:41
2008.03.02
TDbGriid


15-1196204041
KilkennyCat
2007-11-28 01:54
2008.03.02
А "Орешник" все-таки жалко.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский