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