C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Удалить динамически созданный объект, Удалить динамически созданный объект
OnixLab
Отправлено: 18.12.2006, 13:31


Ученик-кочегар

Группа: Участник
Сообщений: 5



Доброго здоровья всем.
Помогите пожалуйста разобраться с проблеммой. Начинаю изучать С++. Столькнулся с такой проблемой, методом Drag&Drop создаю объекты типа TEdit, TMemo и т.д. К событию KeyDown, прикрутил функцию CompKeyDown. Хочу удалять эти объекты по нажатию комбинации клавиш Shift+Delete. Функция имеет вид:

void __fastcall TFReport::CompKeyDown(TObject *Sender, WORD &Key, TShiftState Shift)
{
if ( Shift.Contains(ssShift)&&(Key == VK_DELETE) )
{
delete Sender);
}
}
Функция отрабатывает нормально, но после вылетает AV. Причем самое отвратительное, что AV вылетает не стабильно, т.е. может подряд вылететь а раз-два нет или наеборот. Вроде по всему видать, что не в функции дело, а вот как отловить глюкавое место.
Как найти место с ошибкой ? angry2.gif
Romikgy
Отправлено: 18.12.2006, 13:41


Дежурный стрелочник

Группа: Участник
Сообщений: 72



А причем здесь
delete Sender ?
имхо в делете надо подставлять указатели на динамически созданые объекты, а не форму,
если это обработчик от формы!
OnixLab
Отправлено: 18.12.2006, 13:55


Ученик-кочегар

Группа: Участник
Сообщений: 5



Это обработчик не от формы, а от компоненты TEdit.
Я так понимаю, что в Sender'е передается объект вызвавший обработчик. Поэтому и решил его прибивать.
OnixLab
Отправлено: 18.12.2006, 14:04


Ученик-кочегар

Группа: Участник
Сообщений: 5



Самое интересное позабыл написать. Компонента удаляется с формы, визуально.
Romikgy
Отправлено: 18.12.2006, 14:17


Дежурный стрелочник

Группа: Участник
Сообщений: 72



Имхо тяжко будет удалить компонент из "самого себя"
скрывай их видимость и ставь какой либо признак что компонент надо удалить и по таймеру, сноси все компоненты помеченые этим признаком
OnixLab
Отправлено: 18.12.2006, 14:21


Ученик-кочегар

Группа: Участник
Сообщений: 5



М-дааа... Блин, похоже перегрев идет.

Вроде так оно и есть, самого из себя. Я валяюсь biggrin.gif
Попробовал шлепнуть другой объект из обработчика, все пучком
Спасибо за подсказку.
Romikgy
Отправлено: 18.12.2006, 14:52


Дежурный стрелочник

Группа: Участник
Сообщений: 72



Да пазям
AVC
Отправлено: 18.12.2006, 14:59


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE (OnixLab @ 18.12.2006, 12:31)
Функция отрабатывает нормально, но после вылетает AV.

Скорее всего это связано с обработкой событий. Пометьте компонент на удаление и удалите когда очередь сообщений к компоненту будет обработана.

PS. А самого себя удалять можно, лишь бы ни кто больше тебя не тспользовал. smile.gif
OnixLab
Отправлено: 18.12.2006, 15:26


Ученик-кочегар

Группа: Участник
Сообщений: 5



>To AVC
>Пометьте компонент на удаление и удалите когда очередь>сообщений к компоненту будет обработана.

А можно по подробнее, пожалуйста.
Как это пометить на удаление и как отследить что очередь сообщений пуста ?
AVC
Отправлено: 18.12.2006, 15:55


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE

А можно по подробнее ?

Например так

1. добавить в список удаляемых етот компонент и вызвать invalidate родителя или формы у которых в OnDraw стоит анализ у удаление списка объектов.

2. Послать сообщение любому родителю (проще форме) типа "убей меня" (сообщение определяемое пользователем) и в обработчике сообщений таки убить этот объект.

3. Помнится мне, что перенос подобного кода в событие KeyUp делает такой код работоспособным, но так лучше не делать так как (а) я могу и ошибаться и (б) нет гарантий что в другой системе порядок событий останется прежним.

Вернуться в Вопросы программирования в C++Builder