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 вылетает не стабильно, т.е. может подряд вылететь а раз-два нет или наеборот. Вроде по всему видать, что не в функции дело, а вот как отловить глюкавое место.
Как найти место с ошибкой ? |
|
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
|
М-дааа... Блин, похоже перегрев идет.
Вроде так оно и есть, самого из себя. Я валяюсь
Попробовал шлепнуть другой объект из обработчика, все пучком
Спасибо за подсказку. |
|
Romikgy |
Отправлено: 18.12.2006, 14:52 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 72
|
Да пазям |
|
AVC |
Отправлено: 18.12.2006, 14:59 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
QUOTE (OnixLab @ 18.12.2006, 12:31) | Функция отрабатывает нормально, но после вылетает AV. |
Скорее всего это связано с обработкой событий. Пометьте компонент на удаление и удалите когда очередь сообщений к компоненту будет обработана.
PS. А самого себя удалять можно, лишь бы ни кто больше тебя не тспользовал. |
|
OnixLab |
Отправлено: 18.12.2006, 15:26 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 5
|
>To AVC
>Пометьте компонент на удаление и удалите когда очередь>сообщений к компоненту будет обработана.
А можно по подробнее, пожалуйста.
Как это пометить на удаление и как отследить что очередь сообщений пуста ? |
|
AVC |
Отправлено: 18.12.2006, 15:55 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
QUOTE |
А можно по подробнее ?
|
Например так
1. добавить в список удаляемых етот компонент и вызвать invalidate родителя или формы у которых в OnDraw стоит анализ у удаление списка объектов.
2. Послать сообщение любому родителю (проще форме) типа "убей меня" (сообщение определяемое пользователем) и в обработчике сообщений таки убить этот объект.
3. Помнится мне, что перенос подобного кода в событие KeyUp делает такой код работоспособным, но так лучше не делать так как (а) я могу и ошибаться и (б) нет гарантий что в другой системе порядок событий останется прежним. |
|