Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.07.27;
Скачать: CL | DM;

Вниз

Правильно ли написал наследника TList?   Найти похожие ветки 

 
Ega23 ©   (2008-06-26 12:19) [0]

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


 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;



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


 
clickmaker ©   (2008-06-26 12:24) [1]

> Dispose(PGUID(p));

а зачем приводить к PGUID?


 
Ega23 ©   (2008-06-26 12:25) [2]


> а зачем приводить к PGUID?


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


 
Palladin ©   (2008-06-26 12:28) [3]

метод Notify не реализовал для реакции на удаление


 
Ega23 ©   (2008-06-26 12:31) [4]


> метод Notify не реализовал для реакции на удаление


А, это чтобы Dispose вызвать?
Спасибо, действительно не подумал...


 
clickmaker ©   (2008-06-26 12:36) [5]

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

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


 
Тын-Дын ©   (2008-06-26 12:37) [6]


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


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


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


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


 
Palladin ©   (2008-06-26 12:40) [7]


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

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


 
Ega23 ©   (2008-06-26 12:43) [8]


> lnExtracted


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


 
Тын-Дын ©   (2008-06-26 12:45) [9]


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


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


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


 
Palladin ©   (2008-06-26 12:47) [10]


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

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


 
Palladin ©   (2008-06-26 12:47) [11]


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

угадай


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


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


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


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

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


 
Ega23 ©   (2008-06-26 12:52) [14]


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



 
Palladin ©   (2008-06-26 12:53) [15]


>  if Action in [lnDeleted, lnDeleted] then

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


 
Ega23 ©   (2008-06-26 12:57) [16]

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


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


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


 
Palladin ©   (2008-06-26 13:16) [17]


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

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


 
Ega23 ©   (2008-06-26 13:25) [18]


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


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


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

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


 
Palladin ©   (2008-06-26 13:30) [20]


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

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


 
Palladin ©   (2008-06-26 13:31) [21]


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

в точку :)


 
Ega23 ©   (2008-06-26 13:36) [22]

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


 
clickmaker ©   (2008-06-26 13:41) [23]

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

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


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

RTFS: db.pas, TLookupList



Страницы: 1 вся ветка

Текущий архив: 2008.07.27;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.016 c
2-1214817272
from kz
2008-06-30 13:14
2008.07.27
Оракул + Odac + Error


2-1214822127
Igor23
2008-06-30 14:35
2008.07.27
Работа с IdHTTP


2-1214237843
cr@nk
2008-06-23 20:17
2008.07.27
Помогите с условием входения в заштрих. область


15-1213187241
Dennis I. Komarov
2008-06-11 16:27
2008.07.27
MS SQL Server 2005 EE


1-1196343735
serg128
2007-11-29 16:42
2008.07.27
Как получить HWND окна зная имя номер процесса?