Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Классы на базе TList...


Страницы:   1 2 3

Knight ©   (2007-04-27 14:20:00) 

Сколько раз хотел разобраться с этим вопросом, но всё время что-то отвлекало... но надоело, хочу таки разобраться! Мож поможите? :)

Допустим есть какой-то тип
TMyItem=record
Str1:String;
...
end;

Надо загнать эти итемсы в лист так чтобы обрачаться с ним
MyList[i].Str1
а не
PMyItem(MyList[i])^.Str1
Мож кто накидает скелет класса?

TMyList=class(TList)

end;


Ega23   (2007-04-28 09:53:00) [21]


> Как правило при необходимости связать какие либо разнородные
> данные с каким либо объектом (классический пример TTreeNode.
> Data, содержащее ссылку на запись с разнородными данными)


Пихаем туда указатель на объект с разнородными данными, в чём проблема?


Ega23   (2007-04-28 09:52:00) [22]


>
> Постоянно. Хранить сложные объекты в массиве указателей
> геморнее, чем в списке.


Но-но!!! Где это я против списка выступал? Есть прекрасные TObjectList и TInterfaceList, которые я постоянно использую.

Речь шла о TList и class vs record


clickmaker   (2007-04-28 09:35:00) [23]


> [20] Knight ©   (27.04.07 19:16)

ну поскольку в самой коллекции ничего сугубо визуального нет, то кто мешает ее использовать и для невизуальных задач?
а можно и List заточить - дело вкуса


MsGuns   (2007-04-27 22:07:00) [24]

>Ega23 ©   (27.04.07 17:11) [18]
>Так вот мне интересно, когда такая необходимость возникает?

Постоянно. Хранить сложные объекты в массиве указателей геморнее, чем в списке. Кроме того, списки "разрешают" хранить указатели на объекты разных типов (классов).

Списки удобны также при динамическом контролировании некоторго множества объектов определенного класса, заранее не известного, и т.д.


stakan   (2007-04-27 19:26:00) [25]


> и "домиков" этих треклятых не надо...

Кстати, без домиков тоже работает:
 PRec = ^TRec;
 TRec = record
   I: Integer;
   S: String;
 end;
...
procedure TForm2.Button1Click(Sender: TObject);
var
 L: TList;
 R: PRec;
begin
 New(R);
 R.I := 1;
 R.S := '123';
 L := TList.Create;
 try
   L.Add(R);
   Edit1.Text := PRec(L[0]).S;
   Dispose(R);
 finally
   L.Free;
 end;
end;


Knight   (2007-04-27 19:16:00) [26]

> [16] clickmaker ©   (27.04.07 17:08)
> больше для визуальных? это почему?


http://www.delphikingdom.com/asp/viewitem.asp?catalogid=215


stakan   (2007-04-27 18:52:00) [27]


>
>
> Так вот мне интересно, когда такая необходимость возникает?
>

Как правило при необходимости связать какие либо разнородные данные с каким либо объектом (классический пример TTreeNode.Data, содержащее ссылку на запись с разнородными данными)


Ega23   (2007-04-27 17:11:00) [28]


> Используются по мере необходимости, буде таковая возникнет.


Так вот мне интересно, когда такая необходимость возникает?


Игорь Шевченко   (2007-04-27 17:08:00) [29]


> А кто и как использует рекорды?


Хороший вопрос. Аналогичный вопросу кто и как использует Integer, string и остальные типы :)
Используются по мере необходимости, буде таковая возникнет.


clickmaker   (2007-04-27 17:08:00) [30]


> [15] Knight ©   (27.04.07 17:04)

больше для визуальных? это почему?

вот скажем есть у тебя массив, в который ты кладешь некие элементы. Количество данных у тебя неизвестно заранее.
Как ты будешь наращивать массив?


Knight   (2007-04-27 17:04:00) [31]

> [12] default ©   (27.04.07 16:03)

Коллекции всё-же больше для визуальных вещей... а у меня больше различные структуры, поэтому чаще динамические массивы с несколькими функциями их обслуживающими.


Knight   (2007-04-27 16:18:00) [32]

> [13] Ega23 ©   (27.04.07 16:13)

Я в них обычно всякие свойства храню.. типа настроек проги.


Ega23   (2007-04-27 16:13:00) [33]

Кстати о пцыцах.
А кто и как использует рекорды? Ну, кроме типизированных файлов, структур пакетов для TCP и того, что VCL\WinAPI предлагает (типа TPoint или TTypeInfo)?

Просто заметил за собой, что года 4 назад практически полностью от них отказался. Там, где требуется - перешёл на классы. Их и хранить в TObjectList удобнее, и "домиков" этих треклятых не надо...


default   (2007-04-27 16:03:00) [34]

Knight ©   (27.04.07 15:48) [10]
ну коллекциями это нормальное решение!(особенно в отсутствии вещей типа генериков)


default   (2007-04-27 16:01:00) [35]

Knight ©   (27.04.07 15:48) [10]
очень советую читать литературу по проектирования программного обеспечения!
есть отличная книга "Совершенный код" Макконнелла(это не совсем по проектированию)


Knight   (2007-04-27 15:48:00) [36]

> [9] default ©   (27.04.07 15:38)

Пока хобби... и такие проблемы до сих пор решал динамическими массивами и коллекциями. Но разобраться таки охота %)

Спасибо всем, дальше порою сам :)


default   (2007-04-27 15:38:00) [37]

тот же принцип и классы используют в качестве типов элементов как я и рекомандовал(а не записи)
вообще, Knight, если ты таких элементарных вещей не понимаешь как же ты собираешься проектировать более-менее серьёзные программы?правда если программирование только хобии - то ещё можно жить, а так это полная труба


clickmaker   (2007-04-27 15:31:00) [38]

кстати, есть еще замечательный класс TCollection, от которого можно наследоваться.
К примеру
TMyItem= class(TCollectionItem)
 private
   FStr1:String;  
 public
   property Str1: string read FStr1 write FStr1;
 end;

TMyItems = class(TCollection)
 private
   function GetItem(Index: integer): TMyItem;
   procedure SetItem(Index: integer; Value: TMyItem);
 public
   constructor Create();
   function Add: TMyItem;
   property Items[Index: integer]: TMyItem read GetItem write SetItem; default;
 end;

constructor TMyItems .Create();
begin
 inherited Create(TMyItem);
end;

function TMyItems.Add: TMyItem;
begin
 Result:=TMyItem(inherited Add);
end;

function TMyItems.GetItem(Index: integer): TMyItem;
begin
 Result:=TMyItem(inherited GetItem(Index));
end;

procedure TMyItems.SetItem(Index: integer; Value: TMyItem);
begin
 inherited SetItem(Index, Value);
end;


clickmaker   (2007-04-27 15:14:00) [39]


> [4] Knight ©   (27.04.07 14:45)

я просто тупо выдрал пример из classes.pas. Хоть интерфейс, хоть структура - суть одна.


default   (2007-04-27 15:13:00) [40]

блин не так
procedure TYourCollection.Add(item: TYourItemType);
begin
 List.Add(@item)
end;
тут ведь в методе будет копия записи переданной методу как параметр
можешь использовать вместо записи класс, так будет проще, ибо класс это ссылка
или как-то подругому, но принцип главное ты понял надеюсь, детали сам продумай


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо