![]() |
Модераторы: Snowy, MetalFan, bems, Poseidon |
![]() ![]() ![]() |
|
AlexLogos |
|
||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 229 Регистрация: 23.4.2009 Репутация: нет Всего: 1 |
Решил немного переделать прогу и использовать вместо масива обьектов клас TObjectList, но так как никогда с ним не работал то возникли вопросы...
Народ, подскажите, создаю я некий клас:
создаю и отображаю на форме елементы согласно файлу конфигурации:
Вопрос: как правильно очистить CTableFields:TObjectList и соответственно форму? Пробую и так и этак - ну никак... |
||||
|
|||||
RomanEEP |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 424 Регистрация: 18.5.2006 Где: Коломна Репутация: 1 Всего: 8 |
Теперь всё очищается одной строчкой CTableFields.Free; или, что лучше FreeAndNil(CTableFields); |
|||
|
||||
AlexLogos |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 229 Регистрация: 23.4.2009 Репутация: нет Всего: 1 |
Бывалый, очень благодарен за помощь. Конечно все зараюотало как надо!
|
|||
|
||||
AlexLogos |
|
||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 229 Регистрация: 23.4.2009 Репутация: нет Всего: 1 |
Не могу себе позволить не обратиться к вам еще раз потому что сам не вытягиваю - знаний мало. Значит намудрил я здоровенный клас и его конструкторы-деструктори:
Код читает ини-файл выбирает свойства обьектов и зоздает форму для ввода. Все это работает. Я в главной форме двумя кнопками создаю обьекты з разными параметрами:
если я жму на кнопки на основной форме, даже по несколько раз - формы переключаються или пеперисовываються и как-будто все нормально, но если я нажимаю на кнопку которую создал в класе SaveButtonClick - форма исчезает (ну да, так задуманно) но при клике на кнопках для создания вилетает Инвалид Поинтер Оператион. Очень прошу помочь! |
||||
|
|||||
Rennigth |
|
||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 21.6.2004 Где: Moscow Репутация: 15 Всего: 76 |
1.
Кто тебе сказал что при втором нажатии на кнопки MainTableForm будет nil? Если и хочешь постоянно пересоздавать то уничножай объект или процедурой FreeAndNil или явно обнуляй указатель. 2. Странный у тебя деструктор списка какой-то...
Кто сами Item-ы будет удалять из списка? лжно это выглядеть примерно так:
А св-во OwnsObjects при создании выставить в True. -------------------- (* Honesta mors turpi vita potior *) |
||||||
|
|||||||
RomanEEP |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 424 Регистрация: 18.5.2006 Где: Коломна Репутация: 1 Всего: 8 |
AlexLogos, я думаю можно на ты и без формальностей
В коде if MainTableForm<>nil then MainTableForm.free; MainTableForm - это указатель на объект, это простое число которое означает адрес в оперативной памяти в котором находится объект если это число равно нулю, значит указатель не указывает ни на какой объект объект - это блок данных, в котором хранятся поля(переменные) этого объекта на один объект может быть неограниченное количество указателей метод Free объекта удаляет блок данных из памяти. При этом ни один указатель на объект НЕ ИЗМЕНЯЕТСЯ, не устанавливается в 0, потому что на один объект может быть множество указателей, о которых он знать не может. Повторное вызов любого метода этого класса, втч Free может вызвать различные ошибки обращения к памяти, т.к. на том месте куда указывает указатель ничего нет. Поэтому, чтобы запомнить что объект, на который указатель указывает больше не существует следует его установить в 0 принудительно
Правда если в MainTableForm.free; возникнет исключительня ситуация, то объект будет частично уничтожен (к нему больше обращаться нельзя, а указатель не будет установлен в 0. Чтобы этого избежать лучше воспользоваться функцией FreeAndNil(); из SysUtils - она сперва установит указатель в 0, а затем вызовет деструктор Добавлено через 2 минуты и 12 секунд
сами итемы из списка удалятся в TObjectList.Destroy который вызовет TList.Destroy, который в свою очередь вызовет TList.Clear; |
||||
|
|||||
Rennigth |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 21.6.2004 Где: Moscow Репутация: 15 Всего: 76 |
Все равно плохой тон... Если уж ручками уничтожаешь объекты, то не есть хорошо оставлять не валидные указатели, тем более это TObjectList и при выставленном OwnsObjects будет большой AV. -------------------- (* Honesta mors turpi vita potior *) |
|||
|
||||
AlexLogos |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 229 Регистрация: 23.4.2009 Репутация: нет Всего: 1 |
Спасибо, попробую
![]() |
|||
|
||||
AlexLogos |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 229 Регистрация: 23.4.2009 Репутация: нет Всего: 1 |
Я немного изменил деструкторы, всюду в коде где удаляються обьекты вместо вызова Free вызываю FreeAndNil, таким образом уничтожаю обьекты в памяти и указатели на них - и все заработало! Огромное спасибо что помогли разобраться
![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |