Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-1093983709
dms_main
2004-09-01 00:21
2004.09.19
dll


6-1089413341
НовиЧок
2004-07-10 02:49
2004.09.19
Проверка открытия сайта


3-1092905893
Alex_Bredin
2004-08-19 12:58
2004.09.19
Выделение области в DBGridEH


1-1094043254
Subdigger
2004-09-01 16:54
2004.09.19
Excel


1-1094018106
Zhekson
2004-09-01 09:55
2004.09.19
Как из полного пути к экзэшнику выделить только имя?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский