Форум: "Начинающим";
Текущий архив: 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.008 c