Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.07.27;
Скачать: [xml.tar.bz2];

Вниз

Правильно ли написал наследника 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.006 c
2-1214230754
evgenij
2008-06-23 18:19
2008.07.27
В чем рисовать


2-1214540511
alex810
2008-06-27 08:21
2008.07.27
Ошибка при подключении


15-1213250723
savyhinst
2008-06-12 10:05
2008.07.27
компонент для icq


15-1213198540
тимохов
2008-06-11 19:35
2008.07.27
WinXP Home Ed + Корпоративная сеть + Прокси


2-1214234765
savyhinst
2008-06-23 19:26
2008.07.27
Not enough timers available!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский