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

Вниз

Сортировка TList   Найти похожие ветки 

 
AlexLLL   (2009-06-21 22:25) [0]

Есть массив ссылок на "большие" структуры
Не совсем понятно как работатает метод сорт

Вот к примеру есть в списке сруктура: 5 - записей типа int и 3 String
как правильно отсортировать Список Tlist по какому то из полей.


 
{RASkov} ©   (2009-06-21 22:33) [1]

> [0] AlexLLL   (21.06.09 22:25)
> как правильно отсортировать

Наверное только тебе и известно :)


 
AlexLLL   (2009-06-21 22:38) [2]


> Наверное только тебе и известно :)


Ну нет пузырьком и вставкой владею :)
не понятно как sort работает

просто может не нужно постоянно "достававть" из списка
ARecord := List.items[i]
........
if ARecord^.sortfield ....


 
Юрий Зотов ©   (2009-06-21 22:38) [3]

1. В списке TList не может быть структур, в нем могут быть только указатели на структуры.

2. Надо написать свою функцию сравнения, например:

type
 TMyRecord = record
   S1: string;
   ...
 end;
 PMyRecord = ^TMyRecord;

function MyFunc(Item1, Item2: Pointer): Integer;
begin
 Result := CompareText(PMyRecord(Item1)^.S1, PMyRecord(Item2)^.S1
end;


И потом можно будет сортировать:
List.Sort(@MyFunc);

В справке есть пример.


 
AlexLLL   (2009-06-21 22:42) [4]


> Юрий Зотов ©   (21.06.09 22:38) [3]

О прям как в справке.
Ну вот это как раз и немогу понять, с указателями работаю совсем недавно:

List.Sort(@MyFunc) - а параметры когда подставлять в функцию?


 
Юрий Зотов ©   (2009-06-21 22:47) [5]

> AlexLLL   (21.06.09 22:42) [4]

> параметры когда подставлять в функцию?

Никогда. Надо вызвать метод Sort и передать ему адрес функции сравнения, а все остальное метод Sort сделает сам - и функцию вызовет, и параметры ей передаст.


 
Юрий Зотов ©   (2009-06-21 22:52) [6]

> AlexLLL   (21.06.09 22:42) [4]

Это называется "обратный вызов" (callback). Мы вызываем одну функцию и передаем ей адрес другой функции, заранее известного типа. И первая функция, когда ей надо, вторую вызывает сама.


 
AlexLLL   (2009-06-21 22:56) [7]


> Юрий Зотов ©   (21.06.09 22:47) [5]

Ну как бы просто задать правило для двух и все ?
по типу

CompareText сравнить S1 и S2 и возвращает 0, если они равны. Если S1 больше S2, CompareText возвращает целое число больше 0. Если S1 меньше S2, CompareText возвращает целое меньше 0. CompareText не учитывается и не зависит от текущей локали.

Ну вот конкретно мене нужно сортировать по типу Double, получается просту пишу свою функцию и вожращаю по логике то что возращает CompareText текст и все!?


 
Юрий Зотов ©   (2009-06-21 23:21) [8]

> AlexLLL   (21.06.09 22:56) [7]

Все так, кроме одного - если сравнивать надо числа, то CompareText тут ни при чем (она же строки сравнивает, а надо числа). Удобно использовать функцию Sign из модуля Math (см. в справке), либо написать свою:

if PMyRecord(Item1)^.D1 > PMyRecord(Item2)^.D1 then
 Result := 1
else
 if PMyRecord(Item1)^.D1 < PMyRecord(Item2)^.D1 then
   Result := -1
 else
     Result := 0;


 
AlexLLL   (2009-06-21 23:23) [9]


> Юрий Зотов ©   (21.06.09 23:21) [8]

Спасибо большое, я это и имел введу, яб уже давно попробовал, сужу в гостях тут Delphi не стоит а вопрос в стоит.


 
Германн ©   (2009-06-22 01:00) [10]


> сужу в гостях тут Delphi не стоит а вопрос в стоит.

???
:)


 
Andy BitOff ©   (2009-06-22 01:04) [11]

Прости, кто на ком стоял? (с) профессор Преображенский


 
AlexLLL   (2009-06-22 21:02) [12]


> Германн ©   (22.06.09 01:00) [10]

"в" это опечатка, хотя да был у подруги



Страницы: 1 вся ветка

Текущий архив: 2009.08.23;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.009 c
15-1245250048
Empleado
2009-06-17 18:47
2009.08.23
Если бы у наших маленьких детей был свой форум, какие бы темы ...


15-1245816012
Дмитрий С
2009-06-24 08:00
2009.08.23
Поиск точки


2-1245989782
novai
2009-06-26 08:16
2009.08.23
Директивы компилятора в релизе программы


15-1245683991
Tornado
2009-06-22 19:19
2009.08.23
А можно ли...


2-1245765164
Priest
2009-06-23 17:52
2009.08.23
Проблема с TBitmap