Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Почему EAccessViolation


Автор: Zzz 17.3.2005, 18:30
Создаю панель:
Код

   static int a;
   TPanel *Panel = new TPanel(Frame21);
   Panel->Width = Frame21->Width-4;
   Panel->Left = 2;
   Panel->Height = 50;
   Panel->Top = a*50;
   Panel->Name = "Panel" + IntToStr(a);
   Panel->Parent = Frame21;
   Panel->OnClick = PanelClick;
   a++;


Описываю PanelClick:
Код

void __fastcall TForm1::PanelClick(TObject *Sender)
{
  TComponent *CP;
  CP = Frame21->FindComponent(((TComponent *) Sender)->Name);
  delete CP;
  Frame21->Repaint();
}


А он мне AccessViolation, почему? Хотя если продолжить выполнение панельку он удаляет...

Как правильно это сделать?

P.S. Код написан специально для выяснения проблемы smile

Автор: Borisff2003 18.3.2005, 06:29
Код

Frame21->RemoveComponent(CP);

Автор: Zzz 18.3.2005, 16:08
Цитата(Borisff2003 @ 17.3.2005, 22:29)
Код

Frame21->RemoveComponent(CP);

Спасибо - помогло. Только после выполнения, количество компонент (Frame21->ComponentsCount) уменьшается, но все равно все отображаются. Не помогает ни Update() ни Repaint(). То есть получается что компоненты нет, но она видна. Как это разрулить? smile

Автор: Adil' 19.3.2005, 18:15
Цитата(Zzz @ 18.3.2005, 16:08)
Спасибо - помогло
- это просто удаленеи CP из списка "дочерних" компонентов Frame21 - сам объект компонента не удаляется; равносильно CP->Owner=NULL;

Так что это не помогло smile

Цитата(Zzz @ 17.3.2005, 18:30)
он мне AccessViolation, почему? Хотя если продолжить выполнение панельку он удаляет...
Потому что, грубо говоря, ты пытаешься удалить окно в его же собственной процедуре обработки сообщений.
Если уж очень хочется удалить панель при клике именно на эту панель, то запусти таймер с минимальным интервалом и удали панель при обработке сообщания от этого таймера.
Или посылай своему окну сообщений типа
#define WM_DELETECOMPONENT WM_USER+100
с указателем на удаляемый компонент и при удаляй его при обработке этого сообщения. Только посылать надо PostMessage'м.

Автор: Zzz 21.3.2005, 15:31
Цитата

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

Что-то подобное я и предполагал...

Цитата

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

Помогло smile Спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)