Форум: "Основная";
Текущий архив: 2004.09.05;
Скачать: [xml.tar.bz2];
Внизмассив объектов Найти похожие ветки
← →
Maxim____ (2004-08-19 13:23) [0]Привет всем!
Есть массив объектов,
пишу в деструкторе освобождение объектов этого объекта и смещение массива так что другие записи задвигают удалённый объект. И укорачиваю массив.
Но на втором шаге стабильно AV .
В чем может быть дело?
почему незьзя сделать arr[i-1]:=arr[i]?
Может быть в Delphi есть какие-нибудь процедуры,
упрощающие работу с массивами?
← →
Мастер © (2004-08-19 13:27) [1]Ошибка в строке №17.
← →
Digitman © (2004-08-19 13:30) [2]
> И укорачиваю массив
а есть смысл ? "укорачивать" ? запиши в освободившийся эл-т NIL, и при первой же необходиммости создания нового объекта и фиксации ссылки на него в массиве найди первый же встреченный NIL-элемент и запиши туда ссылку !
← →
Семен Сорокин © (2004-08-19 13:32) [3]используй TList, TObjectList
← →
P.N.P. © (2004-08-19 13:32) [4]Проще всего воспользоваться TObjectList (uses Contnrs)
он специально предназначен для работы с массивами объектов
← →
TUser © (2004-08-19 13:34) [5]
> почему незьзя сделать arr[i-1]:=arr[i]?
Потому что это указатели. Ты указатель переписываешь при таком коде, а сам объект никуда не девается.
PS. Какие еще будут Максимы?
← →
Maxim____ (2004-08-22 20:45) [6]Народ, спасибо за помощь!
проблема разрешилась после того как я сделал не TObject а TPersistent.
заработало myobj[i]:=myobj[i-1] ! и никаких AV
Массив удобен тем что можно писать:
var array of myclasstype;
array[i].myitem ....
а с tList и подобными вещами насколько я понимаю только так:
tclasstype(objlist.items[i]).myitem
← →
Юрий Зотов © (2004-08-22 22:15) [7]> 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-23 01:01) [8]>Смею Вас уверить, что такого быть не могло.
>Если от замены 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-23 01:31) [9]> 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).
И что же проще?
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.09.05;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.049 c