Главная страница
    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.045 c
11-1173682470
vampir_infernal
2007-03-12 09:54
2007.10.14
ThreadTerminate


3-1181301983
denis24
2007-06-08 15:26
2007.10.14
select top 10


2-1189676356
gray_falcon
2007-09-13 13:39
2007.10.14
храненилище информации


2-1190044966
ANTPro
2007-09-17 20:02
2007.10.14
procedure RotateX


3-1180935795
ambhtr
2007-06-04 09:43
2007.10.14
Удаление дубликатов из таблиц





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский