Форум: "Начинающим";
Текущий архив: 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