Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
1 / 1 / 2
Регистрация: 08.12.2015
Сообщений: 24

Корректная работа с массивами компонентов (XE2)

06.01.2016, 11:31. Показов 1298. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Есть программа, состоящая из нескольких форм. На одних формах есть массивы компонентов - таблиц StringGrid, на других формах - обработчики событий, которые обращаются к этим массивам. Программа компилируется без ошибок, запускается и работает в штатном режиме. Но при выходе вылетает ошибка - invalid pointer operation - abnormal program termination.

Опытным путём было установлено, что ошибка возникает из-за этих самых массивов.

Пораскинув скудным умом новичка, я пришёл к выводу, что при завершении программы отдельные её части закрываются в определённой последовательности. И в результате одна часть программы обращается к массиву из другой части, которая уже закрыта.

Попытался сделать костыли путём последовательного удаления компонентов массивов в обработчике события на выход.
C++
1
for(i=1;i<=10;i++) delete MSG[i];
Помогло ровно наполовину . Одна часть массивов (статическая) перестала вызывать ошибку, но с динамическими массивами всё осталось по-прежнему.

Не подскажете, как избавиться от этой проблемы? И вообще, как следует работать с массивами компонентов, чтобы не вылезали такие "сюрпризы"?

Если не получается дать ответ навскидку, то могу привести пример. Правда, программа большая. Вряд ли кто-то захочет под утренний кофеёк перелопачивать кучу строк кода. Поэтому лучше было бы указать, какое конкретно место в программе я должен скинуть.

Заранее спасибо!
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.01.2016, 11:31
Ответы с готовыми решениями:

Корректная загрузка с помощью стандартных компонентов UIloader и List
Взял UiLoader из компонентов, взял List из компонентов, выставил нужные значения для полей data, взял код из книжки. Никакий отличий от...

Где находятся файлы компонентов Delphi xe2
Возможно, глупый вопрос, но все же: где находятся файлы компонентов в Delphi XE2. У меня возник трабл с одним из них: не находит файл .dcu....

Как всё-таки поменять цвет шрифта компонентов в Delphi XE2
Установил Delphi XE2. Есть большой старый проект. В нём обилие компонентов TGroupBox, TCheckBox и т.д. Для наглядности они отличались...

6
34 / 34 / 21
Регистрация: 22.09.2013
Сообщений: 401
07.01.2016, 14:51
Без малейшей капли кода, не понятно что у вас там делается и соотвественно как либо помочь вам не представляется возможным.
0
1408 / 572 / 127
Регистрация: 31.10.2011
Сообщений: 1,960
07.01.2016, 17:47
как обьявлено MSG?

а вообще для хранения обьектов можно использовать TObjectList
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
07.01.2016, 17:51
Enzi, покажите код... сложно подсказать, не видя кода...
0
1 / 1 / 2
Регистрация: 08.12.2015
Сообщений: 24
07.01.2016, 20:02  [ТС]
Спасибо за проявленный интерес!

В приложении к письму архив с проектом.

Попробую вкратце описать ситуацию:

Массивы таблиц находятся на формах Geology и Result.

На форме Geology изначально присутствует одна таблица, которая является первым членом массива MSG. При нажатии на кнопки"добавить колонку" и "удалить колонку" на форме появляются и удаляются такие же таблицы, которые также объявляются членами массива. При объявлении самого массива MSG в .h файле количество его членов задаётся с запасом - 100 элементов.
Ошибка возникает при создании нескольких таблиц - членов массива MSG на этой форме. Тогда при закрытии программы вылетает Abnormal program termination. Если же на форме таблица только одна, то всё закрывается нормально.

На форме Result присутствует 3 массива таблиц - OR, MR, VR. Размерность каждого массива - 10, все элементы отрисовываются сразу.
После создания костылей путём последовательного удаления всех элементов этих массивов в обработчике события OnClose формы DataInput ошибка в этом месте перестала возникать

Работа с массивами ведётся с формы DataInput, при нажатии на кнопки "Подобрать откос" и "Результат". Ещё при нажатии на кнопки "добавить строку" и "удалить строку" меняется количество строк в таблицах на всех формах, кроме Geology.

Не знаю, что ещё я могу написать. В общем, смотрите сами.
Вложения
Тип файла: rar ESoil test.rar (4.65 Мб, 4 просмотров)
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33399 / 21509 / 8236
Регистрация: 22.10.2011
Сообщений: 36,907
Записей в блоге: 12
07.01.2016, 20:22
Лучший ответ Сообщение было отмечено Enzi как решение

Решение

Enzi, а с какого перепуга тебе вообще надо эти массивы удалять-то? Ты ж когда создаешь StringGrid-ы, назначаешь им владельца, вот он и позаботится о том, чтобы корректно удалить гриды при завершении самого себя (то есть, владелец сначала удалит все те объекты, которыми владеет, и только потом удалится сам...). Я уж не говорю, что
C++
1
for(i=1;i<=10;i++)
при описании
C++
1
TStringGrid *OR[10];
- это гарантированный вылет за пределы массива, и порча памяти за его пределами. Массивы-то в С++ индексируются с 0, а не с 1-цы...
1
1 / 1 / 2
Регистрация: 08.12.2015
Сообщений: 24
07.01.2016, 21:12  [ТС]
volvo-сенсей, здравствуй! С праздниками тебя!

Переписал все циклы с учётом индексации с 0, и всё заработало! Дурацкая ошибка, наследие старого режима... Самое смешное, что программа работала и вычисляла всё правильно.

Спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.01.2016, 21:12
Помогаю со студенческими работами здесь

Не корректная работа мыши
Добрый день всем. Проблема- мышь. Она корректно работает в играх, но категорически не работает в системе на рабочем столе - невозможно...

Не корректная работа Windows 7
Доброго время суток!!! Проблема с ноутбуком, приобретал новый с лицензионной системой.Спустя год полетел винт. Купил новый винт и отдал...

Не корректная работа кода
Всем привет! Возникла проблема с данным кодом,не могу понять почему когда ставлю число меньше -5 пишет что функция не существует , хотя...

Не корректная работа программы
Друзья, я снова вас беспокою, многим уже наверное надоел. Но мне просто необходима ваша помощь. Суть вот в чем: есть задача, которую...

Не корректная работа FMX
Решил вынести в отдельную тему.. дело в том что сама форма фмх жутко лагает при добавление и перемещении компонент мигает чёрным и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru