Форум: "Основная";
Текущий архив: 2004.09.19;
Скачать: [xml.tar.bz2];
ВнизПереход к фиксированному значению через текущее Найти похожие ветки
← →
Aono4ever (2004-09-04 07:09) [0]Доброго времени суток.
Задача такая: есть, допустим, TImage, TCombobox и 2 кнопки "Уменьшить" и "Увеличить". В TImage имеется картинка которую будем увеличивать. Итак, возможные действия пользователя для увеличения картинки:
1. Выбрать значение из Combobox (всякие там 10, 30, 50, 70, 100 etc)
2. Написать произвольное значение в текст-поле Combobox.
3. Воспользоваться кнопками "Увеличить"/"Уменьшить".
Проблема вот в чем: пользователь может написать произвольное значение в Combobox, а потом воспользоваться кнопками. Т.е должен быть осуществлен переход от произвольного числа в Combobox к ближайшему фиксированному (которое в items). Написал для этих целей две функции: Первая это просто сортировка TStringList по числам (в результате должна получиться запись вида 1,2,3,4,5,6,7,8,9,10,11,12,13... - стандартная сортировка так не работает), а вторая, собственно сама функция вычисления ближайшего фиксированного числа из TStrings (в моем случае Combobox.Items) по текущему значению. Очень подозреваю, что можно сделать гораздо проще. Помогите упростить код. Заранее благодарен.
function NumbersSort(List: TStringList; Index1, Index2: Integer): Integer;
begin
Result := -1;
if StrToInt(List.Strings[Index1]) > StrToInt(List.Strings[Index2]) then
Result := 1
else
if StrToInt(List.Strings[Index1]) = StrToInt(List.Strings[Index2]) then
Result := 0;
end;
function GetPrevNextValue(const Current: Integer; const Next: Boolean; const
CurrenList: TStrings): Integer;
var
I, I1: Integer;
Sl: TStringList;
begin
Result := -1;
Sl := TStringList.Create;
try
for I := 0 to CurrenList.Count - 1 do
Sl.Add(CurrenList[I]);
if Sl.IndexOf(IntToStr(Current)) = -1 then
Sl.Add(IntToStr(Current));
Sl.CustomSort(NumbersSort);
if Next = True then
begin
I1 := Sl.IndexOf(IntToStr(Current)) + 1;
if I1 < Sl.Count then
Result := StrToInt(Sl.Strings[Sl.IndexOf(IntToStr(Current)) + 1]);
end
else
begin
I1 := Sl.IndexOf(IntToStr(Current)) - 1;
if I1 > -1 then
Result := StrToInt(Sl.Strings[Sl.IndexOf(IntToStr(Current)) - 1]);
end;
finally
Sl.Free;
end;
end;
← →
Mim1 © (2004-09-04 08:44) [1]
> а вторая, собственно сама функция вычисления ближайшего
> фиксированного числа из TStrings (в моем случае Combobox.Items)
> по текущему значению
Мне кажется что в вашем случе надо две процы. Одна возвращающая ближайшее число меньшее переданного в параметрах (или его индекс), втораяя ближайшее большее. (соответственно для кнопок уменьшить, увеличить);
> for I := 0 to CurrenList.Count - 1 do
> Sl.Add(CurrenList[I]);
Вероятнее всего можно заменить на assign;
← →
Aono4ever (2004-09-04 08:58) [2]2 Mim1 © (04.09.04 08:44) [1]
> Мне кажется что в вашем случе надо две процы. Одна возвращающая > ближайшее число меньшее переданного в параметрах (или его
> индекс, втораяя ближайшее большее. (соответственно для кнопок
> уменьшить, увеличить);
Идея данного алгоритма следующая. Есть список с фиксированными значениями, я вношу в него текущее значение, сортирую, а потом от этого текущего значения и идет весь процесс. Т.е фактически, чтобы получить меньшее/большее значение нужно только отнять/прибавить 1 соответственно.
> Вероятнее всего можно заменить на assign;
Спасибо, конечно же глупость написал. Не увидел.
← →
Aono4ever (2004-09-04 09:16) [3]Подправленный вариант:
function GetPrevNextValue(const Current: Integer; const Next: Boolean; const
CurrList: TStrings): Integer;
var
I: Integer;
Sl: TStringList;
begin
Result := Current;
Sl := TStringList.Create;
try
Sl.Assign(CurrList);
if Sl.IndexOf(IntToStr(Current)) = -1 then
Sl.Add(IntToStr(Current));
Sl.CustomSort(NumbersSort);
if Next = True then
begin
I := Sl.IndexOf(IntToStr(Current)) + 1;
if I < Sl.Count then
Result := StrToInt(Sl[I]);
end
else
begin
I := Sl.IndexOf(IntToStr(Current)) - 1;
if I > -1 then
Result := StrToInt(Sl[I]);
end;
finally
Sl.Free;
end;
end;
← →
Aono4ever (2004-09-04 09:23) [4]И совсем законченный. Но все же думается можно проще...
function GetPrevNextValue(const Current: Integer; const Next: Boolean; const
CurrList: TStrings): Integer;
var
I: Integer;
Sl: TStringList;
begin
Result := Current;
Sl := TStringList.Create;
try
Sl.Assign(CurrList);
if Sl.IndexOf(IntToStr(Current)) = -1 then
Sl.Add(IntToStr(Current));
Sl.CustomSort(NumbersSort);
if Next = True then
I := Sl.IndexOf(IntToStr(Current)) + 1
else
I := Sl.IndexOf(IntToStr(Current)) - 1;
if (I < Sl.Count) and (I > -1) then
Result := StrToInt(Sl[I]);
finally
Sl.Free;
end;
end;
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.09.19;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.033 c