![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Здравствуйте!
Никак не могу понять почему вываливается ошибка доступа к памяти. Пользователь динамически создаёт список запрещённых частот, при удалении уже созданной из списка появляется ошибка. Частоты хранятся в динамическом массиве freq_array. Помогите пожалуйста! Код:
|
#2
|
||||
|
||||
![]() Очень тяжелый код. Упростить можно много чего, но речь не об этом.
1. С какой целью Вы используете Finalize(freq_array[Index])? Вы же не динамическую структуру уничтожаете, да и для этого есть Dispose(). 2. Полагаю Вы не правильно понимаете действие процедуры Finalize. Она не удалит элемент массива. Вам нужно сдвинуть все элементы массива с индеском больше Index, на место удаляемого элемента (с индексом Index). Move(freq_array[Index+1], freq_array[Index], Length(freq_array) - Index + 1); Мог ошибиться в длине сдвигаемого участка массива, проверьте сами. Грамотно поставленный вопрос содержит не менее 50% ответа. Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть. |
#3
|
|||
|
|||
![]() Цитата:
![]() С Finalize я экспериментировал (что с ней, что без - всё равно ошибка). С массивом у меня так: на место удаляемого элемента вставляется последний, а потом уменьшается длина массива на 1. Проблема возникает, когда нажимается динамически созданная кнопка с надписью "Удалить из списка", появляющаяся в списке вместе с добавленной частотой. Причём, если добавить две частоты и удалять вторую, происходит удаление частоты и кнопки из списка без ошибки (как надо). При этом, после каждого добавления или удаления частоты происходит перерисовка списка через процедуру ListShow. А вот если удалять первую частоту, третью и т.д. - всё грустно. ![]() Последний раз редактировалось Bosa, 30.04.2018 в 14:03. |
#4
|
||||
|
||||
![]() Мне лень перепечатывать код. Если не затруднит - выложите проект. Быстрее будет отладить, чем искать ошибку в браузере.
Грамотно поставленный вопрос содержит не менее 50% ответа. Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть. |
#5
|
|||
|
|||
![]() dr. F.I.N.
Ок, архив проекта во вложении |
#6
|
|||
|
|||
![]() Да, а не проще просто взять TListBox и в него напихать частоты, а кнопки сделать общими. Кстати, сами частоты можно прямо там в итемах хранить (через .Objects[]). Если число целое, то и вообще можно просто так туда засунуть через приведение типа. И интерфейс будет более стандартный, как у большинства программ...
|
#7
|
|||
|
|||
![]() Цитата:
![]() Обнаружил странную вещь: делаю "добавил - удалил" с одной частотой, два раза срабатывает - на третий ошибка. Загадка ![]() Хотя кажется на первый взгляд ничего сложного не должно быть. Даже появился спортивный интерес найти причину такого поведения ![]() В любом случае всем откликнувшимся - СПАСИБО, LIKE и т.д. ![]() |
#8
|
||||
|
||||
![]() Ошибка была не очевидная, но таки понятная
![]() Когда Вы нажимаете на динамически созданную кнопку, срабатывает метод ListButtonClick, который в свою очередь вызывает ShowList. Ну а в ShowList Вы удаляете все ранее созданные динамические объекты и создаете их по новой. По завершению метода ShowList программа возвращается в ListButtonClick и когда завершается он, то происходит внутреннее обращение к вызвавшему этот метод объекту. А он уже уничтожен. Вот Вам и ошибка доступа к памяти. Почему она происходила не всегда? Да потому, что под массив Form2.Components[] память выделена и только перераспределяется по необходимости при добавлении или удалении элементов, а адресация при этом сохраняется. Если Вы удаляете элемент из середины списка, то ошибки не будет, т.к. весь массив элементов сдвигается на место удаленных и ссылка на объект не NULL. А когда удаляете последний, то его место уже никто не занимает и ссылка - NULL. Привет ошибка доступа к памяти. Код для удаления объектом самого себя можно найти в интернете. Вариантов для этого уйма. Удачи! Грамотно поставленный вопрос содержит не менее 50% ответа. Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть. Последний раз редактировалось dr. F.I.N., 02.05.2018 в 07:55. |
Этот пользователь сказал Спасибо dr. F.I.N. за это полезное сообщение: | ||
Bosa (02.05.2018)
|
#9
|
|||
|
|||
![]() dr. F.I.N.
Вот это ёпрст ... (непереводимый русский язык) хитроумная наука - понять в чём ошибка. Мне таки надо больше d'эльфийской грамоте учиться. ![]() |