| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 | ||
Я делаю следующим образом:
И все равно при выходе из BtnClick вылетает ошибка. Самое интересное в том, что программа дальше продолжает работать. Добавлено @ 13:57 chaos, таймер конечно хорошо, но все равно не поможет, да и сним как-то криво получается |
| Автор: _hunter 11.10.2005, 14:02 |
| а это: Sender = btn2; зачем? + понятное дело что ошибка вылетает -- видно, не внимательно ты читал... там ведь русским языком написано -- нужен предок, который и занимается удалением всех детей. делать это можно по сообщению |
| Автор: Vyacheslav 11.10.2005, 14:14 | ||
| Сама по себе идея хромает. С таймером вариант пройдет. Но опять некрасиво. Нужно установить таймер на некоторое формальное значение. Нужно поменять условие задачи: удалять ненужные объекты должен внешний по отношению к ним объект, используя определенный признак. Самое простое использовать Tag, более сложное - использовать спиосок. Теперь когда и кто должен удалять. Естественный ответ - удалять нуджно тогда, когда программа свободна. Ну и соответвенно сразу становится понтяно, кто удалzет - Application. Выкладываем на форму компонент ApplicationEvents и задаем ему обработчик OnIdle
|
| Автор: 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 Зачем ты пытался заменить на новый?
|
| Автор: Artemon 15.10.2005, 08:25 |
| Neitron, код который ты привел - заведомо не рабочий, если ты удалишь кнопку из ее же обработчика - то получится следующая ситуация - кнопки нет, а ее обработчик еще действует. |