![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
массив объектов [D7, WinXP]
Maxim____ © (2004-08-19 13:23:00)Привет всем!
Есть массив объектов,
пишу в деструкторе освобождение объектов этого объекта и смещение массива так что другие записи задвигают удалённый объект. И укорачиваю массив.
Но на втором шаге стабильно AV .
В чем может быть дело?
почему незьзя сделать arr[i-1]:=arr[i]?
Может быть в Delphi есть какие-нибудь процедуры,
упрощающие работу с массивами?
Юрий Зотов (2004-08-23 01:31:00) [1]> Maxim____ (23.08.04 01:01) [8]
1. В справке, естественно, все сказано верно, только какое же отношение имеет Assign к удалению ссылок из массива? Совершенно никакого.
2. > destructor pimg.Free;
Именно Free ???????????????????????
3. Вот Вы пишете:
next := false;
for i := 0 to length(imgs) - 1 do
begin
if next then
begin
imgs[i - 1] := imgs[i];
imgs[i - 1].panel.tag := imgs[i-1].panel.tag-1;
end;
if Self = imgs[i] then
next := true;
end;
setlength(imgs, length(imgs) - 1);
В случае использования TList весь этот код заменяется одной строчкой: List.Remove(Self).
И что же проще?
Maxim____ (2004-08-23 01:01:00) [2]>Смею Вас уверить, что такого быть не могло.
>Если от замены TObject на TPersistent проблема исчезла,
>значит, она была совсем не в том, о чем Вы спрашивали.
я не стал бы писать, если бы оно не стало работать, оно действительно работает теперь,
а до этого не работало.
Может быть вызывается метод Assign, не знаю, но оно стабильно копирует все свойства
Это изменение я сделал после того как прочитал в help про TPersistent:
(в скобках я приблизительно перевёл)
Provide the means to assign the contents of one object to another.
)Является средством для копирования содержимого одного объекта в другой.)
Use TPersistent as a
base class when declaring objects that are not components,
but that need to be saved to a stream or
have their properties assigned to other objects.
(Используйте TPersistent как базовый класс,
при объявлении объектов, которые не являются компонентами,
но нуждаются в сохранении в поток или
должны переписывать(копировать) свои свойства
в другие объекты.)
вот кусок моего кода:
pimg =class(TPersistent)
destructor pimg.Free;
var
i: integer;
next: boolean;
begin
panel.free;
panel:=nil;
if pnl1<>nil then begin pnl1.Free; pnl1:=nil; end;
if pnl2<>nil then begin pnl2.Free; pnl2:=nil; end;
next := false;
for i := 0 to length(imgs) - 1 do
begin
if next then
begin
imgs[i - 1] := imgs[i];
imgs[i - 1].panel.tag := imgs[i-1].panel.tag-1;
end;
if Self = imgs[i] then
next := true;
end;
setlength(imgs, length(imgs) - 1);
sortpanels;
inherited Destroy;
end;
Юрий Зотов (2004-08-22 22:15:00) [3]> Maxim____ (22.08.04 20:45) [6]
> проблема разрешилась после того как я сделал не TObject а
> TPersistent.
Смею Вас уверить, что такого быть не могло. Если от замены TObject на TPersistent проблема исчезла, значит, она была совсем не в том, о чем Вы спрашивали.
> заработало myobj[i]:=myobj[i-1]
Я бы не назвал это укорачиванием массива. Скорее, наоборот. Кстати, Ваш вопрос мог быть вызван тем, что по массиву делался прямой проход вместо обратного. Чтобы сказать точнее, нужно видеть код.
> Массив удобен тем что можно писать:
> var array of myclasstype;
> array[i].myitem ....
> а с tList и подобными вещами насколько я понимаю только так:
> tclasstype(objlist.items[i]).myitem
Свойство Items у TList и TObjectList - свойство по умолчанию, поэтому можно его и не писать, но приводить тип к конкретному, конечно, придется. То есть, писать еще одно слово.
Если Вы считаете, что это менее удобно, чем писать свой код добавления/удаления в/из массива (вместо уже полностью готовой функциональности, которую дают TList и TObjectList) - ну, что ж, тогда конечно.
Правда, никто не мешает написать свой класс-потомок, где Items переопределено на нужный тип. Работы - на 10 минут.
Maxim____ (2004-08-22 20:45:00) [4]Народ, спасибо за помощь!
проблема разрешилась после того как я сделал не TObject а TPersistent.
заработало myobj[i]:=myobj[i-1] ! и никаких AV
Массив удобен тем что можно писать:
var array of myclasstype;
array[i].myitem ....
а с tList и подобными вещами насколько я понимаю только так:
tclasstype(objlist.items[i]).myitem
TUser (2004-08-19 13:34:00) [5]
> почему незьзя сделать arr[i-1]:=arr[i]?
Потому что это указатели. Ты указатель переписываешь при таком коде, а сам объект никуда не девается.
PS. Какие еще будут Максимы?
Семен Сорокин (2004-08-19 13:32:00) [6]используй TList, TObjectList
P.N.P. (2004-08-19 13:32:00) [7]Проще всего воспользоваться TObjectList (uses Contnrs)
он специально предназначен для работы с массивами объектов
Digitman (2004-08-19 13:30:00) [8]
> И укорачиваю массив
а есть смысл ? "укорачивать" ? запиши в освободившийся эл-т NIL, и при первой же необходиммости создания нового объекта и фиксации ссылки на него в массиве найди первый же встреченный NIL-элемент и запиши туда ссылку !
Мастер (2004-08-19 13:27:00) [9]Ошибка в строке №17.