Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сортировка по VALUE в ValueListEditor, Сортировка по VALUE в ValueListEditor 
:(
    Опции темы
Pcrepair
Дата 13.11.2013, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 16.1.2011

Репутация: нет
Всего: нет



Добрый день. Есть процедура,которая сортирует пару 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

Вопрос: где ошибка и как поправить?
--------------------
Сборник рабочего кода Процедур и Функций DelPhi     http://validcoderepo.narod.ru/
PM MAIL WWW   Вверх
БелАмор
Дата 13.11.2013, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 10.6.2010
Где: Россия

Репутация: 7
Всего: 17



В данном случае сравнивать нужно не как строки, а переводить строки в числа и сравнивать уже их.
Вы невнимательно смотрели в прошлом вопросе по этой теме:
http://forum.vingrad.ru/forum/topic-372348...y2584577/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.
Задавая очень большое или очень малое число, можно группировать, например, пустые строки в начале или в конце списка.

PM   Вверх
Pcrepair
Дата 13.11.2013, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 16.1.2011

Репутация: нет
Всего: нет



Спасибо, будем пробовать
--------------------
Сборник рабочего кода Процедур и Функций DelPhi     http://validcoderepo.narod.ru/
PM MAIL WWW   Вверх
Poseidon
Дата 13.11.2013, 23:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 9
Всего: 133



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


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Pcrepair
Дата 14.11.2013, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 16.1.2011

Репутация: нет
Всего: нет



правильный ответ

Код

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


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

Это сообщение отредактировал(а) Pcrepair - 14.11.2013, 08:48
--------------------
Сборник рабочего кода Процедур и Функций DelPhi     http://validcoderepo.narod.ru/
PM MAIL WWW   Вверх
Poseidon
Дата 14.11.2013, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 9
Всего: 133



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


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Pcrepair
Дата 14.11.2013, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 16.1.2011

Репутация: нет
Всего: нет



это исключено на предыдущем этапе
--------------------
Сборник рабочего кода Процедур и Функций DelPhi     http://validcoderepo.narod.ru/
PM MAIL WWW   Вверх
БелАмор
Дата 14.11.2013, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 10.6.2010
Где: Россия

Репутация: 7
Всего: 17



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

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

PM   Вверх
Pcrepair
Дата 15.11.2013, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 16.1.2011

Репутация: нет
Всего: нет



никуда никакой пользователь не лезет. оператор нажимает на Ф3, это фсе.  остальное делает прграмма, автоматически
жаль пока нельзя оператора иллюминировать 
--------------------
Сборник рабочего кода Процедур и Функций DelPhi     http://validcoderepo.narod.ru/
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0500 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.