Последняя версия DataExpress 3 beta от 4 апреля 2020 года.
Изображение Скачать | Изображение Что нового?
См. также: Энциклопедия DX | Форум на develop-soft | Песочница
ИзображениеИзображениеИзображение

Уничтожение глобальных переменных

jurist23rus
Эксперт
Сообщения: 2684
Зарегистрирован: Пт сен 30, 2016 9:42 am
Откуда: Майкоп
Благодарил (а): 2 раза
Поблагодарили: 18 раз

Уничтожение глобальных переменных

Сообщение jurist23rus » Ср ноя 01, 2017 6:07 pm

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

Это к разговору о том что лучше 10 раз создавать форму и 10 раз её уничтожать, или один раз создать и пусть живёт. Но если глобальная переменная не уничтожается сама, то кто же уничтожит форму?
Destiny is a very convenient word for those who never take decisions.

Аватара пользователя
admin
Разработчик
Сообщения: 4756
Зарегистрирован: Пн мар 14, 2016 11:32 am
Откуда: Ленинградская
Благодарил (а): 24 раза
Поблагодарили: 207 раз

Re: Уничтожение глобальных переменных

Сообщение admin » Ср ноя 01, 2017 8:56 pm

Освобождать память, занимаемую формой, надо самостоятельно.

Аватара пользователя
Иван
Интересующийся
Сообщения: 115
Зарегистрирован: Сб дек 22, 2018 2:16 pm
Благодарил (а): 16 раз
Поблагодарили: 3 раза

Уничтожение глобальных переменных

Сообщение Иван » Пн янв 13, 2020 12:24 pm

Не разберусь без помощи. Как корректно уничтожить подключенное расширение при закрытии окна таблицы (в данном случае Товар. Если закрыть и потом снова открыть окно набора данных то возвращает ошибка) или вызова из другой формы EditWindow (вызывая один раз все ок, второй раз аналогично выдает ошибку, расширение не уничтожено при уничтожении формы). Судя по всему расширение не уничтожено после закрытия набора данных или окна формы EditWindow при вызове из другой формы. Пробовал OnDestroyForm, не помогло.

Прикрепил пример на Demo_db. Там расширение на форме Товар. Если закрыть окно набора данных Товар. Потом снова открыть выдаст ошибку.
Вложения
DEMO_DB_c_подключенным_расширением_примером.rar
(72.72 КБ) 9 скачиваний

Аватара пользователя
admin
Разработчик
Сообщения: 4756
Зарегистрирован: Пн мар 14, 2016 11:32 am
Откуда: Ленинградская
Благодарил (а): 24 раза
Поблагодарили: 207 раз

Уничтожение глобальных переменных

Сообщение admin » Пн янв 13, 2020 2:09 pm

В обработчиках событий надписи Sender - это сама надпись TdxLabel, а поиск индекса ведется по объекту формы SelfT (TdxForm). Т. е. в обработчике определите, к какой форме принадлежит компонент и по ней ищите индекс. Можно так например: Fm := TComponent(Sender).Owner

Еще заметил ошибку с сохранением обработчика закрытия базы. Обработчик должен быть установлен только один раз. А сейчас получается при каждом подключении действия снова назначается обработчик, сохраняя в переменной самого себя. Это приведет к зацикливанию при закрытии базы.

Аватара пользователя
Иван
Интересующийся
Сообщения: 115
Зарегистрирован: Сб дек 22, 2018 2:16 pm
Благодарил (а): 16 раз
Поблагодарили: 3 раза

Уничтожение глобальных переменных

Сообщение Иван » Пн янв 13, 2020 2:57 pm

[quote="admin"]В обработчиках событий надписи Sender - это сама надпись TdxLabel, а поиск индекса ведется по объекту формы SelfT (TdxForm). Т. е. в обработчике определите, к какой форме принадлежит компонент и по ней ищите индекс. Можно так например: Fm := TComponent(Sender).Owner

Вопрос решен, спасибо)

Аватара пользователя
Иван
Интересующийся
Сообщения: 115
Зарегистрирован: Сб дек 22, 2018 2:16 pm
Благодарил (а): 16 раз
Поблагодарили: 3 раза

Уничтожение глобальных переменных

Сообщение Иван » Вт янв 14, 2020 12:32 pm

admin писал(а):В обработчиках событий надписи Sender - это сама надпись TdxLabel, а поиск индекса ведется по объекту формы SelfT (TdxForm). Т. е. в обработчике определите, к какой форме принадлежит компонент и по ней ищите индекс. Можно так например: Fm := TComponent(Sender).Owner


Возник еще вопрос. Хотел при открытии формы сделать переход на первую вкладку (в расширении обновления запросов при переходе по вкладкам), так как на первой запросы в режим не ручного обновления выставлены по инструкции (следовательно логично что б на этой вкладке и открывало).

Используя OnEdit OnInsert что б при открытии формы переходило на первую вкладку все хорошо пока не закроешь и снова не откроешь набор данных. После чего начинает выдавать ошибку конкретно на QT.dxPC.ActivePageIndex:=0;. Прописал там try что б сразу было все понятно при ошибке. Прикрепил пример на демо ДХ.
Вложения
DEMO_DB_ошибка_on_edit_при_втором_запуске_таблицы.rar
(80.42 КБ) 6 скачиваний


Вернуться в «Разработка расширений»