Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

массив объектов [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.


Наверх

Титульная страница Поиск, карта сайта Написать письмо