| 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 делает такой код работоспособным, но так лучше не делать так как (а) я могу и ошибаться и (б) нет гарантий что в другой системе порядок событий останется прежним.
 | 
|  |