Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Сортировка по VALUE в ValueListEditor


Автор: Pcrepair 13.11.2013, 20:55
Добрый день. Есть процедура,которая сортирует пару KEY--VALUE(слово--число) по значению VALUE и передает результат в ValueListEditor, для просмотра
Код

procedure SortVLE;
(*---------------------------*)
function MyCompare(List: TStringList; Index1, Index2: Integer): Integer;
begin
  Result := AnsiCompareStr(List.ValueFromIndex[Index2], List.ValueFromIndex[Index1])
end;
(*---------------------------*)

var
  fSL : TStringList;
begin
  fSL := TStringList.Create;
  try
    fSL.Text := MainForm.ValueListEditor1.Strings.Text;
    fSL.CustomSort(@MyCompare);
    MainForm.ValueListEditor1.Strings.Text := fSL.Text;
  finally
    FreeAndNil(fSL);
  end
end;

Но сортировка идет немного не так как нужно, в частности:
рпрпропопр--99
пиропиррор--87
прррпррппр--33
титититьит--223
рпрпрпрпрр--12

хотя строка титититьит--223 в ValueListEditor должна быть наверху так как 223 больше чем 99

Вопрос: где ошибка и как поправить?

Автор: БелАмор 13.11.2013, 22:32
В данном случае сравнивать нужно не как строки, а переводить строки в числа и сравнивать уже их.
Вы невнимательно смотрели в прошлом вопросе по этой теме:
http://forum.vingrad.ru/forum/topic-372348/anchor-entry2584577/0.html

Код

// Values - целые по убыванию
function CompareDigitValsDesc(List: TStringList; Index1, Index2: Integer): Integer;
const
  DefVal = 0;
begin
  Result :=
    StrToIntDef(List.ValueFromIndex[Index2], DefVal) -
    StrToIntDef(List.ValueFromIndex[Index1], DefVal);
end;


DefVal - значение, принимаемое для строк, которые не удаётся перевести в Integer.
Задавая очень большое или очень малое число, можно группировать, например, пустые строки в начале или в конце списка.

Автор: Pcrepair 13.11.2013, 22:44
Спасибо, будем пробовать

Автор: Poseidon 13.11.2013, 23:24
Где-то на форуме был код Вита, по которому вычислялась длинна самого большого числа и все строки, короче этой длинны забивались нулями в начале. Получалось сравнение строк 099, 087, 033, 223, 012. Такие строки отсортируются как числа.

Автор: Pcrepair 14.11.2013, 08:48
правильный ответ

Код

function MyCompare(List: TStringList; Index1, Index2: Integer): Integer;
begin
  Result:=CompareValue(StrToFloat(List.ValueFromIndex[Index2]),StrToFloat(List.ValueFromIndex[Index1]));
end;


там еще дробные числа нужно обрабатывать

Автор: Poseidon 14.11.2013, 15:44
Pcrepair, очень приятно будет наблюдать ошибки конвертации при передаче в List текстовых строк. 

Автор: Pcrepair 14.11.2013, 19:42
это исключено на предыдущем этапе

Автор: БелАмор 14.11.2013, 20:40
Цитата(Pcrepair @  14.11.2013,  20:42 Найти цитируемый пост)
это исключено на предыдущем этапе

Поспешное утверждение.
Конкретная ситуация на вскидку:
После заполнения ValueListEditor (или даже во время заполнения) пользователь лезет в панель управления, от скуки играется с региональными настройками, и меняет десятичный разделитель.
Как отреагирует ваш код?
Вы хотя бы предусмотрели запрет автоматического обновления региональных настроек внутри программы при изменении их в системе?

Автор: Pcrepair 15.11.2013, 12:19
никуда никакой пользователь не лезет. оператор нажимает на Ф3, это фсе.  остальное делает прграмма, автоматически
жаль пока нельзя оператора иллюминировать 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)