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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> сортировка TList, Как? 
:(
    Опции темы
WERITAS
Дата 20.4.2006, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


********
**


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

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



Допустим, что у меня в переменной TList хранятся объекты пользовательского класса, содержащего поля string. Как мне, используя метод класса TlLst Sort, отсортировать объекты в алфавитном порядке и вывести их в ListBox? Я так понимаю в Sort передается функция, выполняющая сортировку, но какие параметры передать в эту функцию при ее описании? Вобщем нужен пример.   


--------------------
Арт-менеджер клуба, разрешивший концерт Алексея Глызина, уволен с формулировкой "Мудак"
PM MAIL   Вверх
Poseidon
Дата 20.4.2006, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


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

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



Код
type tp=^string[255];
var  List:TList;
...................
function Comp(i1,i2:pointer): integer;
begin
  if(tp(i1)^ < tp(i2)^) then Result := -1
  else
  if(tp(i1)^ = tp(i2)^) then Result := 0
  else Result := 1;
end;
....................
List.Sort(@Comp);
 


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


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

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



type TListSortCompare = function (Item1, Item2: Pointer): Integer;
Item1,Item2 - указатели (из TList.Items)

Тебе нужно всего лишь определить эту функцию:

Код

function MySort(Item1, Item2: Pointer): Integer;
begin
  Result := 0;
  if TMyObject(Item1).Code<TMyObject(Item2).Code then Result := -1;
  if TMyObject(Item1).Code<TMyObject(Item2).Code then Result := 1;
end;

 


--------------------
    
PM MAIL ICQ Skype   Вверх
x77
Дата 20.4.2006, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Демо, 

Цитата
  if TMyObject(Item1).Code<TMyObject(Item2).Code then Result := -1;
  if TMyObject(Item1).Code<TMyObject(Item2).Code then Result := 1;


это из области "найди 10 отличий? smile у тебя оба условия одинаковые ;) 


--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
Демо
Дата 21.4.2006, 08:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

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



Цитата(x77 @  20.4.2006,  21:28 Найти цитируемый пост)
это из области "найди 10 отличий?  у тебя оба условия одинаковые ;) 


Да уж. Что-то я вчера торопился...

Код

function MySort(Item1, Item2: Pointer): Integer;    
begin    
  Result := 0;    
  if TMyObject(Item1).Code<TMyObject(Item2).Code then Result := -1;    
  if TMyObject(Item1).Code>TMyObject(Item2).Code then Result := 1;    
end;
 


--------------------
    
PM MAIL ICQ Skype   Вверх
WERITAS
Дата 21.4.2006, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


********
**


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

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



А как теперь добавить отсортированные объекты из TList'a в TListBox'ы? Проблема в том, что TList содержит объекты двух типов. И теперь, когда они перемешались, их надо добавить в соответствующие TListBox'ы    


--------------------
Арт-менеджер клуба, разрешивший концерт Алексея Глызина, уволен с формулировкой "Мудак"
PM MAIL   Вверх
_hunter
Дата 21.4.2006, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



заведи у объектов свойство Тип (или просто is' ом проверяй) и в зависимости от него рассовывай 


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Alexeis
Дата 21.4.2006, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



WERITAS, можно в свойство tag одних записать 1 другиих 2,
а потом проверять 
if TMyObject(Item1).tag = 1 then ...
if TMyObject(Item1).tag = 2 then ... 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
WERITAS
Дата 21.4.2006, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


********
**


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

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



_hunter
Что-то я не могу разобраться с is'ом. Выдает ошибку: Operator not applicable to this type. Возможно, проблема в том, что я не зарегестрировал свои классы (не знаю где их регистрировать надо). 


Код

var TL: TList;
...............................................
for TL[b] to TL.Count do
begin
  if TL[b] is [I]MyClass[/I] then ............
 .................................................
end;

  


--------------------
Арт-менеджер клуба, разрешивший концерт Алексея Глызина, уволен с формулировкой "Мудак"
PM MAIL   Вверх
_hunter
Дата 21.4.2006, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



стоп. если TL -- TList как он может быть MyClass? 


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
WERITAS
Дата 21.4.2006, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


********
**


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

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



Там было TL[b]. Как мне к объектам, которые у меня в TL хранятся, получить доступ? К их полям? 


--------------------
Арт-менеджер клуба, разрешивший концерт Алексея Глызина, уволен с формулировкой "Мудак"
PM MAIL   Вверх
Ryn
Дата 21.4.2006, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



надо  TObject(TL[b]) is MyClass  писать 
PM MAIL   Вверх
WERITAS
Дата 21.4.2006, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


********
**


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

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



Ryn 
А ничего, что у меня MyClass наследован от TComponent? Просто сделал как вы сказали и приложение аварийно закрывается, хотя компилится.
  

Это сообщение отредактировал(а) WERITAS - 21.4.2006, 18:45


--------------------
Арт-менеджер клуба, разрешивший концерт Алексея Глызина, уволен с формулировкой "Мудак"
PM MAIL   Вверх
Ryn
Дата 21.4.2006, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



какую ошибку выдает ?
напиши код где ты добавляешь компоненты в Tlist. к примеру:

Код
var
  Form1 : TForm1;
  fList : TList;

fList := TList.Create;

fList.Add( TButton.Create( Form1 ) );
fList.Add( TSpeedButton.Create( Form1 )  );
fList.Add( TPanel.Create( Form1 )  );

//....
//
теперь можно узнать имя класса

TObject(fList.Item[1]).ClassName

//или 

if TObject(fList.Item[1]) is TButton then ShowMessage('class TButton');   
  

Это сообщение отредактировал(а) Girder - 23.4.2006, 16:04
PM MAIL   Вверх
WERITAS
Дата 22.4.2006, 06:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


********
**


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

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



Ryn
Ошибка в том, что типы несовместимы. Я их попробовал привести оператором as и у меня это не получилось. 
Объект в TList я добавляю конструктором с параметрами этого класса (параметры конструктора берутся из Edit'ов) 

Даже разыменование объекта не помогло привести типы... Люди, помогите! smile 

Это сообщение отредактировал(а) WERITAS - 22.4.2006, 08:29


--------------------
Арт-менеджер клуба, разрешивший концерт Алексея Глызина, уволен с формулировкой "Мудак"
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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