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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> TObjectList, TInterfaceList чем от TList ? Прошу показать, где они упрощают жизнь ? 
V
    Опции темы
EvilsInterrupt
Дата 27.5.2008, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

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



Привет.

Все по сабжу конечно могут сказать, что один хранит интерфейсы, другой объекты. Но я вот вижу, что от TList эти классы слишком не отличаются! Потому и прошу показать ситуации, т.е. куски кода по которым можно было понять, что эти классы действительно упрощают программирование или понимание кода. В кусках кода прошу привести случаи без использования класса, как бы было и как с использованием ;)

Сорри, что спрашиваю базовые вещи, но что-то никак не могу осознать чем в принципе помогают классы ? )
PM MAIL WWW ICQ Jabber   Вверх
aktuba
Дата 27.5.2008, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


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

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



По поводу TInterfaceList ничего сказать не могу, а по поводу TObjectList - все просто. Если используешь TList и хранишь там ссылки на объекты, то при удалении элемента из списка необходимо самому удалять объекты (Object.Free), а при использовании TObjectList, список делает это сам. За это отвечает параметр OwnsObjects.

Пример очистки списка с использованием TList:
Код

for Idx := 0 to FList.Count - 1 do
  FreeAndNil(TObject(FList));
FList.Clear;


А теперь тоже самое, но с помощью TObjectList:
Код

FObjList.Clear;



--------------------
user posted image
PM MAIL WWW Skype   Вверх
EvilsInterrupt
Дата 27.5.2008, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

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



aktuba, Только в очистке выгода ?
PM MAIL WWW ICQ Jabber   Вверх
Rennigth
Дата 27.5.2008, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(EvilsInterrupt @  27.5.2008,  15:17 Найти цитируемый пост)
Только в очистке выгода ? 

Еще ненадо тип переводить из Pointer в TObject и наоборот.

Добавлено через 1 минуту и 3 секунды
в Items имеется ввиду.

Добавлено через 1 минуту и 47 секунд
TInterfaceList тож самое только под интерфейсы заточен.

Это сообщение отредактировал(а) Rennigth - 27.5.2008, 15:22


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
EvilsInterrupt
Дата 27.5.2008, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

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



Rennigth, спасибо ;)
PM MAIL WWW ICQ Jabber   Вверх
aktuba
Дата 27.5.2008, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


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

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



Цитата(EvilsInterrupt @  27.5.2008,  16:17 Найти цитируемый пост)
aktuba, Только в очистке выгода ? 


Во многом, если правильно использовать. Например, выборочно удалять объекты:

TList:
Код

for Idx := FList.Count - 1 downto 0 do
  if not (TObject(FList[Idx]) is TLabel) then
  begin
    FreeAndNil(TObject(FList[Idx]));
    FList.Delete(Idx);
  end;


TObjectList:
Код

for Idx := FObjList.Count - 1 downto 0 do
  if not (FObjList[Idx] is TLabel) then
    FObjList.Delete(Idx); 



--------------------
user posted image
PM MAIL WWW Skype   Вверх
EvilsInterrupt
Дата 27.5.2008, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

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



aktuba, Спасибо ;)
PM MAIL WWW ICQ Jabber   Вверх
THandle
Дата 27.5.2008, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

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



Посмотрел я на эту темку и появилась у меня идея - а не написать ли статейку на тему этих классов? Кто что думает по этому поводу?

Сорри за оффтопик. 
PM   Вверх
EvilsInterrupt
Дата 27.5.2008, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

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



THandle, Я думаю, надо каждому умелому выложить все что он знает об извращениях с этими классами и потом можно написать статью ;)
PM MAIL WWW ICQ Jabber   Вверх
THandle
Дата 27.5.2008, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

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



Цитата(EvilsInterrupt @  27.5.2008,  18:40 Найти цитируемый пост)
THandle, Я думаю, надо каждому умелому выложить все что он знает об извращениях с этими классами и потом можно написать статью ;) 


Ну выкладывайте тогда smile 

Хотя главное что надо сделать - это полностью изучить сами эти классы, их реализацию, чем я и займусь тогда, хотя недавно я их уже ковырял smile 
PM   Вверх
Snowy
Дата 27.5.2008, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

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



Цитата(THandle @  27.5.2008,  17:26 Найти цитируемый пост)
Посмотрел я на эту темку и появилась у меня идея - а не написать ли статейку на тему этих классов?

http://forum.vingrad.ru/forum/topic-97983.html
PM MAIL   Вверх
THandle
Дата 27.5.2008, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

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



Snowy, так... хорошо smile  А TList, TInterfaceList? smile  Не надобно? smile

Добавлено через 1 минуту и 3 секунды
Кстати... не плохо было бы все статьи переместить как раз в раздел "статьи"... smile 
PM   Вверх
MetalFan
  Дата 27.5.2008, 21:14 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

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



1. Classes.TList наиболее универсален и предназначен для работы с указателями (4х байтовыми числами).
интересный на мой взгляд прием работы с TList'ом:
Код

  PMyListItem = ^TMyListItem;
  TMyListItem = record
    IntData: Integer;
    StringData: string;
  end;

  TMyList = class( TList )
  private
    function Get(AIndex: Integer): PMyListItem;
    procedure Put(AIndex: Integer; const Value: PMyListItem);
  protected
    procedure Notify(Ptr: Pointer; Action: TListNotification); override;
  public
    property Items[AIndex: Integer]: PMyListItem read Get write Put;
    function Add: PMyListItem;
  end;

implementation

{ TMyList }

function TMyList.Add: PMyListItem;
begin
  New(Result);
  inherited Add( Result );
end;

function TMyList.Get(AIndex: Integer): PMyListItem;
begin
  Result := inherited Get(AIndex);
end;

procedure TMyList.Notify(Ptr: Pointer; Action: TListNotification);
begin
  case Action of
    lnDeleted: Dispose(PMyListItem(Ptr)); //для корректного освобождения памяти необходимо привести указатель к типу
  end;
end;

procedure TMyList.Put(AIndex: Integer; const Value: PMyListItem);
begin
  inherited Put( AIndex, Value );
end;

т.о. получаем класс, который сам умеет управлять (выделять/освобождать) память под элементы типа запись.
з.ы. я не гарантирую работоспособность класса, приведенный код является лишь общим примером.

2. Contnrs.TObjectList = сlass(TList) - наследник TList'а, 
упрощающий работу со списком объектов.
имеет интересный метод FindInstanceOf, позволяющий производить поиск объекта в списке по классу.
так же может управлять "жизнью" ввереных ему объектов при OwnsObjects = true

3. Classes. TThreadList = class(TObject) – класс-список, нет, не потоков)
Просто потокобезопасный список указателей.
Инкапсулирует в себе TList, но список предоставляемых возможностей урезан (по сравнению с TList), правда вполне достаточен для безопасной работы со списком указателей на данные из разных потоков.

4. Classes.TInterfaceList = class(TInterfacedObject, IInterfaceList)
Потокобезопасный список интерфейсов, так же реализующий интерфейс IInterfaceList.
Удобен, как ни странно, при работе со списками интерфейсов. 
не является наследником TList.
инкапсулирует в себе работу с TThreadList (см.3)
Корректен с точки зрения подсчета ссылок на хранимые интерфейсы.

Так же стоит упомянуть о TCollection и TCollectionItem, о TStrings и его наследниках (TStringList).
а так же о множестве прекрасных классов-списков, помимо TObjectList, описаных в модуле Contnrs...
но об этом не в этот раз)





--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Snowy
Дата 27.5.2008, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

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



TList является родоначальником практически всех списков.
Остальные списки - наследники надстройки над ним.
ЗЫ. Он точно также позволяет искать объект по указателю.
А сам TObjectList и т.п. можно использовать, как руководство по такому наследнику.
Хотя особого смысла в этом нет - с появлением в этом году генериков в 2008-й дельфи, такая необходимость практически пропадёт.
Достаточно будет написать что-то вроде TGenericList<TMyClass> и готов специализированный список под нужный класс.
PM MAIL   Вверх
EvilsInterrupt
Дата 28.5.2008, 00:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

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



MetalFan, Кул! Молоток! ;)
PM MAIL WWW ICQ Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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