Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Динамические объекты, Динамические объекты 
:(
    Опции темы
Artemon
Дата 10.10.2005, 08:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

Репутация: 7
Всего: 20



Возникла следующая проблема:

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

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

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

Спасибо.


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
_hunter
Дата 10.10.2005, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



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


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Artemon
Дата 11.10.2005, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

Репутация: 7
Всего: 20



Хорошо, попробую...............


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
Artemon
Дата 11.10.2005, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

Репутация: 7
Всего: 20



__Hunter, из тех ссылок, что вы предложили ни одна не помогла.

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

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


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
chaos
Дата 11.10.2005, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 1
Всего: 44



а может сделать просто: запустить таймер в этом обработчике и в таймере удалить твой лэйбл
PM WWW   Вверх
Artemon
Дата 11.10.2005, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

Репутация: 7
Всего: 20



Я делаю следующим образом:

Код


  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, таймер конечно хорошо, но все равно не поможет, да и сним как-то криво получается


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
_hunter
Дата 11.10.2005, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



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


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Vyacheslav
Дата 11.10.2005, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Сама по себе идея хромает. С таймером вариант пройдет. Но опять некрасиво. Нужно установить таймер на некоторое формальное значение.
Нужно поменять условие задачи: удалять ненужные объекты должен внешний по отношению к ним объект, используя определенный признак. Самое простое использовать 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;

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





--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Artemon
Дата 11.10.2005, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

Репутация: 7
Всего: 20



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

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


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
Vyacheslav
Дата 11.10.2005, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



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


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Artemon
Дата 11.10.2005, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

Репутация: 7
Всего: 20



Думаю дельное решение.


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


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
Neitron
Дата 13.10.2005, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 580
Регистрация: 3.10.2005
Где: Москва

Репутация: нет
Всего: 5



Artemon
Зачем ты пытался заменить на новый?
Код

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


Это сообщение отредактировал(а) Neitron - 13.10.2005, 16:28


--------------------
Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей.
Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ
PM MAIL   Вверх
Artemon
Дата 15.10.2005, 08:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

Репутация: 7
Всего: 20



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


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0960 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.