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

Вниз

Переход к фиксированному значению через текущее   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.052 c
6-1089282957
Гость778
2004-07-08 14:35
2004.09.19
Подскажите как вытащить нужную информацию с сайта курса валют


14-1093937936
ИМХО
2004-08-31 11:38
2004.09.19
Мегаполисы


3-1093332973
Некто
2004-08-24 11:36
2004.09.19
Запрос в файле БД vs программый запрос.


4-1091516920
sohat
2004-08-03 11:08
2004.09.19
Как определить наименование текущего приложения?


1-1093967567
Alekc
2004-08-31 19:52
2004.09.19
Работа с ТВ тюнерами