Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.10.14;
Скачать: [xml.tar.bz2];

Вниз

Снова проблемы (вырезка элементов массива)   Найти похожие ветки 

 
ProgRAMmer Dimonych ©   (2007-09-15 14:45) [0]

Имеется массив record"ов, причём в описании record"а входит одно поле-объект. Т.е. что-то типа

TMyObjectClass=class(TObject)
private
...
public
...
end;

TMyRec=record
Something1:Integer;
Something2:Boolean;
SomeObject:TMyObjectClass;
end;

TMyRecArray=array of TMyRec;


Этот массив в свою очередь является полем другого объекта. И в этом большом объекте есть методы для добавления элементов в конец массива и для удаления заданного элемента. Собственно, последний метод у меня и вызывает проблемы.

Стоит задача: после вырезания (удаления) указанного элемента массива все остальные сместить, т.е., например, при удалении 0-го элемент из массива

A[0]=...
A[1]=...

Должен остаться только A[0], полученный в результате его перемещения к началу массива.

Использую такой код:

procedure TLesson.RemoveEl(ID:Integer);
var
i,L:Integer;
begin
L:=Length(FArray)-1;
if L<>-1 then
begin
 for i:=ID+1 to L do FArray[i-1]:=FArray[i];
end;
FPages[L].SomeObject.Free;
SetLength(FPages,L);
end;


Удаление вроде как происходит, но при попытке обратиться к SomeObject (наследнику TObject) за нумером 0 вылетает AV.

Как всё-таки правильно здесь выполнить эту операцию?


 
Плохиш ©   (2007-09-15 14:51) [1]


procedure TLesson.RemoveEl(ID:Integer);
var
i,L:Integer;
begin
L:=Length(FArray)-1;
if L<>-1 then
begin
FPages[ID].SomeObject.Free;
for i:=ID+1 to L do FArray[i-1]:=FArray[i];
end;
SetLength(FPages,L);
end;


 
ProgRAMmer Dimonych ©   (2007-09-15 15:06) [2]

> Плохиш ©   (15.09.07 14:51) [1]

Как всегда, чтобы завуалировать реальное назначение программы и сделать вопрос более общим, позаменял названия переменных и проч., но как всегда не все :(

Но идею понял: сначала удаляем объект из удаляемого record"а, потом выполняем перезапись всего остального. Работает. Правда, честно говоря, не смог с ходу вникнуть в суть происходящего, так что буду благодарен небольшому пояснению.

А в целом уже огромное спасибо.


 
Плохиш ©   (2007-09-15 15:14) [3]


> Но идею понял: сначала удаляем объект из удаляемого record"а,
>  потом выполняем перезапись всего остального.

Из логики вытекает. Сам смотри. Если сначала перезапишешь ссылку на объект, то как ты его потом удалять будешь. Ссылка-то потеряна...
А в твоём коде удаляется объект в последнем элементе массива, тебе просто повезло, что элементов было всего 2 и ты сразу получил исключение :-) представляешь, что при паре миллионов элементов, исключение возникло бы месяца через три, как бы ты её искать стал ;-)


 
ProgRAMmer Dimonych ©   (2007-09-15 20:36) [4]

> Плохиш ©   (15.09.07 15:14) [3]
> Из логики вытекает. Сам смотри. Если сначала перезапишешь
> ссылку на объект, то как ты его потом удалять будешь. Ссылка-
> то потеряна...
> А в твоём коде удаляется объект в последнем элементе массива,
>  тебе просто повезло, что элементов было всего 2 и ты сразу
> получил исключение :-) представляешь, что при паре миллионов
> элементов, исключение возникло бы месяца через три, как
> бы ты её искать стал ;-)

Прочитал, подумал, сообразил. Спасибо ещё раз.


 
Вася Правильный   (2007-09-15 21:05) [5]


> TMyRecArray=array of TMyRec;

замени на TList, пока не поздно


 
ProgRAMmer Dimonych ©   (2007-09-15 22:10) [6]

> Вася Правильный   (15.09.07 21:05) [5]
> > TMyRecArray=array of TMyRec;
> замени на TList, пока не поздно

Поздно :(


 
Loginov Dmitry ©   (2007-09-16 11:36) [7]

> Имеется массив record"ов, причём в описании record"а входит
> одно поле-объект


При появлении подобных ситуаций всегда переправляю record на class, а array of на TList. После этого испорченная логика встает на место.


 
Вася Правильный   (2007-09-16 17:44) [8]


> Поздно :(

поздно подтираться, когда обосрался
а пока прога в релиз не пошла, не поздно


 
Denis_ ©   (2007-09-16 17:51) [9]


> поздно подтираться, когда обосрался
> а пока прога в релиз не пошла, не поздно

А что, Вы подтираетесь до того как...?


 
ProgRAMmer Dimonych ©   (2007-09-16 20:01) [10]

> Denis_ ©   (16.09.07 17:51) [9]
> > поздно подтираться, когда обосрался
> > а пока прога в релиз не пошла, не поздно
> А что, Вы подтираетесь до того как...?

:)


 
Вася Правильный   (2007-09-16 21:06) [11]


> Denis_ ©   (16.09.07 17:51) [9]

я не обсираюсь



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2007.10.14;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.047 c
2-1190119032
artem779
2007-09-18 16:37
2007.10.14
Помогите выбрать БД


4-1176455742
Серге И
2007-04-13 13:15
2007.10.14
Как получить список административных ресурсов компьютера в сети.


3-1181047173
Альф
2007-06-05 16:39
2007.10.14
Прерывание выполнения SELECT


1-1185883153
Егоров А.Н.
2007-07-31 15:59
2007.10.14
ToolBar


2-1190372911
webpauk
2007-09-21 15:08
2007.10.14
Array of TmyRec





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский