| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Ошибка при завершении программы |
| Автор: RemaGe 7.4.2010, 15:35 | ||||
| Доброго времени суток Есть код
Тут создается 2 массива элементов, панели и картинки, картинки выводятся на панелях. Код работает нормально, но при завершении программы выскакивает пачка ошибок "Инструкция ххх обратилась по адресу yyyy", если убрать код создания Image, то все нормально, не могу понять почему с панелями все хорошо, а картинки тянут за собой ошибку. Пробовал сделать так
Все равно выскакивает ошибка. Если верить точкам останова - ошибка происходит после выполнения FormClose, хотя и при пустом FormClose тоже происходит. Что я делаю не так? |
| Автор: CodeMonkey 7.4.2010, 15:46 |
| Потому что отсчёт в массивах с нуля. |
| Автор: Snowy 7.4.2010, 15:54 |
| Не верю. Зачем? Достаточно при создании в Create указать Owner'a, а не nil и тот сам позаботится об уничтожении детёныша. |
| Автор: RemaGe 7.4.2010, 15:55 | ||||
| CodeMonkey, Не догнал -) Что не так? Добавлено через 4 минуты и 35 секунд Snowy,
А где же табличка "Сарказм" ? -)
Self пойдет? Попробовал nil заменить на Self и на Form1, все равно ругается -( |
| Автор: Snowy 7.4.2010, 16:02 |
| Ну тут много неясностей. Зачем создаются массивы? Зачем в массивах заполняется только последний элемент? Откуда цифра 19? Зачем нужна переменная i? Если планировалось инициировать все элементы массива под каждый контрол, то зачем перебирать контролы, если можно просто уничтожить все объекты массивов. Ну и в конце концов, зачем вообще массивы, когда проще задействовать списки для старых версий или generic для новых версий delphi... Приведённый код, хоть и компилируется, но принципиально бессмысленный. |
| Автор: RemaGe 7.4.2010, 16:10 |
| Snowy, Там колличество элементов изначально неизвестно, выясняется по ходу программы, я просто лишний код с переменными убрал. "зачем вообще массивы, когда проще задействовать списки для старых версий или generic для новых версий delphi" Сел читать про дженерики -) |
| Автор: Snowy 7.4.2010, 16:21 | ||||
| В качестве Owner'a вполне подойдёт панель-папа Из-за наличия повторяющихся конструкций, код плохо читаем. При наличии неизвестного числа элементов, списки и выглядят и читаются куда лучше. Под новый элемент лучше завести переменную, а не обращаться каждый раз к массиву.
А ещё лучше
А причина скорее всего в автоуничтожении. Либо в деструкторах, либо что-то где-то некорректно привязано. Нужно либо найти что, либо уничтожить объекты по списку/массиву перед уничтожением формы. |
| Автор: RemaGe 7.4.2010, 18:25 |
| Snowy, Спасибо за помощь -) Сейчас с дженериками разберусь. потом буду с этим разбираться. |
| Автор: CodeMonkey 7.4.2010, 20:18 |
SetLength(pan_ar, ...) говорит о том, что pan_ar - динамический массив. Динамические массивы отсчитывают элементы с нуля. Т.е. если длина массива Length(pan_ar), то в нём доступны элементы с 0 по Length(pan_ar) - 1 (или, что то же самое: с Low(pan_ar) по High(pan_ar)). Вы же заполняете элементы с 1 по Length(pan_ar) - со сдвигом в 1 элемент вправо, портя, таким образом, память. Замена pan_ar[length(pan_ar)] на pan_ar[length(pan_ar) - 1] или pan_ar[High(pan_ar)] должна была решить проблему. |
| Автор: RemaGe 8.4.2010, 17:32 |
| CodeMonkey, Спасибо за помощь -) Snowy, А вам за указание пути. Перевел на тлист - проблема исчезла, кода стало меньше, и он стал проще -) |