![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Классы на базе TList...
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;
тут ведь в методе будет копия записи переданной методу как параметр
можешь использовать вместо записи класс, так будет проще, ибо класс это ссылка
или как-то подругому, но принцип главное ты понял надеюсь, детали сам продумай