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

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

Правильно ли написал наследника TList? [D7]


Страницы:   1 2

Ega23 ©   (2008-06-26 12:19:00) 

Всё с объектами да с объектами. А тут работу с рекордами и простыми указателями пришлось вспоминать. Короче, правильный ли код?


 TGUIDList = class (TList)
 private
   function GetItem(Index: Integer): TGUID;
 public
   function Add(Item : TGUID) : Integer;
   procedure Clear; override;
   property Items[Index : Integer] : TGUID read GetItem; default;
 end;

{ TGUIDList }

function TGUIDList.Add(Item: TGUID): Integer;
var
 p : PGUID;
begin
 New(p);
 p^ := Item;
 Result := inherited Add(p);
end;

procedure TGUIDList.Clear;
var
 i : Integer;
 p : Pointer;
begin
 for i:=0 to Count-1 do
 begin
   p := Get(i);
   Dispose(PGUID(p));
 end;
 inherited;
end;

function TGUIDList.GetItem(Index: Integer): TGUID;
begin
 Result := PGUID(Get(Index))^;
end;



Только не надо сейчас говорить, что дин.массив тут проще и т.п. Сам знаю. Я "технологию" обкатываю.


Игорь Шевченко   (2008-06-26 21:00:00) [1]

RTFS: db.pas, TLookupList


clickmaker   (2008-06-26 13:41:00) [2]

> если в составе записи есть longstring'и, динмассивы, интерфейсы
> и прочая мишура из вышеуказанной группы типов, то обязательно

да, точно. Ей же Finalize нужно еще вызвать
вот FreeMem точно пофиг )


Ega23   (2008-06-26 13:36:00) [3]

Всё ясно, всем большое спасибо!!!


Palladin   (2008-06-26 13:31:00) [4]


> лучше всегда приводить, хуже от этого не будет.

в точку :)


Palladin   (2008-06-26 13:30:00) [5]


> Ega23 ©   (26.06.08 13:25) [18]

если в составе записи есть longstring'и, динмассивы, интерфейсы и прочая мишура из вышеуказанной группы типов, то обязательно


Sapersky   (2008-06-26 13:30:00) [6]

Если в записях есть длинные (+Wide) строки, дин. массивы, интерфейсы, варианты - надо. Если нет - необязательно, но чтобы не путаться, лучше всегда приводить, хуже от этого не будет.


Ega23   (2008-06-26 13:25:00) [7]


> это в случае TGUID не нужно, там нет ниодного типа со временем
> жизни управляемом, RTL, то бишь повезло, а в общем случае
> приводить нужно.


Так надо или нет? Это на списке GUID-ов пример простой, там ещё пойдут другие списки packed record-ов


Palladin   (2008-06-26 13:16:00) [8]


> Всё верно, не нужно приводить к нужному типу. Dispose просто
> вызывает FreeMem

это в случае TGUID не нужно, там нет ниодного типа со временем жизни управляемом, RTL, то бишь повезло, а в общем случае приводить нужно.


Ega23   (2008-06-26 12:57:00) [9]

ммать-перемать... lnExtracted, конечно... :)


> Зачем реализовывать функционал родителя?


1. Это не совсем функционал родителя.
2. Должен уметь загружаться из стрима.


Palladin   (2008-06-26 12:53:00) [10]


>  if Action in [lnDeleted, lnDeleted] then

мне кажется, один lnDeleted лишний :)


Ega23   (2008-06-26 12:52:00) [11]


procedure TGUIDList.Notify(Ptr: Pointer; Action: TListNotification);
begin
 inherited;
 if Action in [lnDeleted, lnDeleted] then
   Dispose(Ptr);
end;


Тын-Дын   (2008-06-26 12:51:00) [12]

Зачем реализовывать функционал родителя?


Ega23   (2008-06-26 12:48:00) [13]


> рекомундую посмотреть исходники, TList не сложно реализован,
>  по коду понятно, что происходит... уведомление lnExtracted
> приходит при вызове метода TList.Extract, а оно в справке
> есть...
>


уже посмотрел и то и другое. Вон оно как... А мужики-то и не знали. Я всё время свой обработчик писал...
Воистину - век живи, век учись!
Спасибо за наводку!


Palladin   (2008-06-26 12:47:00) [14]


> За распределение памяти подо что?

угадай


Palladin   (2008-06-26 12:47:00) [15]


> Ega23 ©   (26.06.08 12:43) [8]

рекомундую посмотреть исходники, TList не сложно реализован, по коду понятно, что происходит... уведомление lnExtracted приходит при вызове метода TList.Extract, а оно в справке есть...


Тын-Дын   (2008-06-26 12:45:00) [16]


> Тын-Дын ©   (26.06.08 12:37) [6]
>
> > Не надо? MM сам помнит, что какого типа?
>
>
> Что-то сомнительно.


Всё верно, не нужно приводить к нужному типу. Dispose просто вызывает FreeMem
> Palladin ©   (26.06.08 12:40) [7]
>
> > Тын-Дын ©   (26.06.08 12:37) [6]
>
> в случаего его наследника - нужно, за распределение памяти
> он (наследник) отвечает


За распределение памяти подо что?


Ega23   (2008-06-26 12:43:00) [17]


> lnExtracted


А это что? (в хелпе почему-то нет...)


Palladin   (2008-06-26 12:40:00) [18]


> Тын-Дын ©   (26.06.08 12:37) [6]

в случаего его наследника - нужно, за распределение памяти он (наследник) отвечает, а не программист-пользователь, так же нужно реагировать на lnExtracted


Тын-Дын   (2008-06-26 12:37:00) [19]


> Ega23 ©   (26.06.08 12:31) [4]
>
> > метод Notify не реализовал для реакции на удаление
>
>
> А, это чтобы Dispose вызвать?
> Спасибо, действительно не подумал...


А смысл? Разве всегда нужно освобождать память при удалении объекта из TList?


> Не надо? MM сам помнит, что какого типа?


Что-то сомнительно.


clickmaker   (2008-06-26 12:36:00) [20]

> Не надо? MM сам помнит, что какого типа?

пофиг. Он с областью памяти работает, а не с типом.


Страницы:   1 2

Наверх

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