Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.09.05;
Скачать: CL | DM;

Вниз

массив объектов   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.05 c
3-1092130430
Dr. Andrey
2004-08-10 13:33
2004.09.05
Параметры процедуры AddNew для ADORecordset


1-1092846426
dimon1979
2004-08-18 20:27
2004.09.05
Гиперссылка


1-1092819673
yaric
2004-08-18 13:01
2004.09.05
Работа с TStrings


8-1087123247
Barnaul
2004-06-13 14:40
2004.09.05
Вопрос по поводу Canvas a


1-1092847643
Aleksandr.
2004-08-18 20:47
2004.09.05
Как указатель превратить в строку?