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


Автор: Artemon 10.10.2005, 08:44
Возникла следующая проблема:

Из обработчика компонента нужно удалить компонент.

Имеется динамически, созданный лыйбл (TLabel), на него повешан OnClick, в этом событии лэйбл удаляется, но естественно возникает ошибка, при выходе из события.

Может кто-нибудь знает как это грамотно реализовать.

Спасибо.

Автор: _hunter 10.10.2005, 11:08
поиск по форуму знает...
это называется самоудаление и тема такая уже поднималась:
http://forum.vingrad.ru/index.php?showtopic=66353
http://forum.vingrad.ru/index.php?showtopic=53760

Автор: Artemon 11.10.2005, 12:01
Хорошо, попробую...............

Автор: Artemon 11.10.2005, 13:41
__Hunter, из тех ссылок, что вы предложили ни одна не помогла.

Может еще что посоветуете.......

P.S.
Может с Sender, что-нибудь попробовать сделать.

Автор: chaos 11.10.2005, 13:53
а может сделать просто: запустить таймер в этом обработчике и в таймере удалить твой лэйбл

Автор: Artemon 11.10.2005, 13:56
Я делаю следующим образом:

Код


  btn = new TButton(this);
  btn->Parent = this;
  btn->Caption = "1";
  btn->OnClick = BtnClick;

  btn2 = new TButton(this);
  btn2->Parent = this;
  btn2->Hide();
  btn2->OnClick = BtnClick;
...........................................
........................................


  void __fastcall TForm1::BtnClick(TObject *Sender)
{
  Sender = btn2;
  delete btn;
}


И все равно при выходе из BtnClick вылетает ошибка.
Самое интересное в том, что программа дальше продолжает работать.
Добавлено @ 13:57
chaos, таймер конечно хорошо, но все равно не поможет, да и сним как-то криво получается

Автор: _hunter 11.10.2005, 14:02
а это:
Sender = btn2;
зачем?
+ понятное дело что ошибка вылетает -- видно, не внимательно ты читал...
там ведь русским языком написано -- нужен предок, который и занимается удалением всех детей. делать это можно по сообщению

Автор: Vyacheslav 11.10.2005, 14:14
Сама по себе идея хромает. С таймером вариант пройдет. Но опять некрасиво. Нужно установить таймер на некоторое формальное значение.
Нужно поменять условие задачи: удалять ненужные объекты должен внешний по отношению к ним объект, используя определенный признак. Самое простое использовать Tag, более сложное - использовать спиосок. Теперь когда и кто должен удалять. Естественный ответ - удалять нуджно тогда, когда программа свободна. Ну и соответвенно сразу становится понтяно, кто удалzет - Application. Выкладываем на форму компонент ApplicationEvents и задаем ему обработчик OnIdle
Код

void __fastcall TForm1::ApplicationEvents1Idle(TObject *Sender, bool &Done)
{
    for( int i = ComponentCount; i--;)
    {
        TComponent* component = Components[i];
        if (component->Tag == 1) {
            delete component;
        }
    }
}

//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
     ((TComponent*)Sender)->Tag = 1;

}
//---------------------------------------------------------------------------



Автор: Artemon 11.10.2005, 14:15
__Hunter, я так думал, что Sender содержит адрес объекта, вот и пытался сменить его на новый.

А что касается предка, так у объекта предок форма, но ведь это ничего не меняет.
Добавлено @ 14:18
Vyacheslav, а когда происходит ApplicationEvents1Idle?

Автор: Vyacheslav 11.10.2005, 14:26
Когда программа не занята ничем другим.А поскольку практически любая интеррактивная программа постоянно ничем не занята, то имеем моментальное удаление твоих компонентов

Автор: Artemon 11.10.2005, 14:30
Думаю дельное решение.


Спасибо всем.

Автор: Neitron 13.10.2005, 16:20
Artemon
Зачем ты пытался заменить на новый?
Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
delete (TButton *)Sender;
}

Автор: Artemon 15.10.2005, 08:25
Neitron, код который ты привел - заведомо не рабочий, если ты удалишь кнопку из ее же обработчика - то получится следующая ситуация - кнопки нет, а ее обработчик еще действует.

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