98 / 81 / 14
Регистрация: 26.07.2013
Сообщений: 599

Самоуничтожение панели

10.10.2013, 16:20. Показов 2675. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
- Здравствуйте Форумчане! У меня возник такой вопрос:
В моей программе сделан VCL-компонент на базе TPanel (TMy_Panel). На ней, в свою очередь, динамически
создается TComboBox.
- Создавать и удалять эту МоюПанель ИЗВНЕ конечно просто:
C++
1
2
3
4
5
6
7
8
9
10
  // указатель на МоюПанель.
  TMy_Panel*  My_Panel;
 
  // создание и вывод на экран МоейПанели.
  My_Panel = new  TMy_Panel( this );
  My_Panel->Parent = this;
 
  // удаление МоейПанели с экрана и вообще.
  delete  My_Panel;
  My_Panel = NULL;
- Но часто бывает очень удобно при вводе "Enter" в КомбоБоксе МоейПанели сразу:
a) - передавать выбранное значение (строку) КомбоБокса в основную программу;
b) - уничтожать саму МоюПанель (за дальнейшей ненадобностью).
- Т.е. как уничтожить МоюПанель из кода самой МоейПанели ? ...
Заранее благодарен всем!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.10.2013, 16:20
Ответы с готовыми решениями:

Самоуничтожение программы
Всем доброго вечера. Помню, год назад примерно в журнале "Хакер" была задача, заключающаяся в том, чтобы сделать программу,...

Самоуничтожение файла
Как сделать штоб файл самоуничтожалса

Самоуничтожение объекта класса
Всем доброго дня!!! Подскажите пожалуйста как лучше поступить: есть игровое поле (условно просто матрица указателей на клетки, которые в...

25
 Аватар для kzru_hunter
1124 / 795 / 101
Регистрация: 01.02.2011
Сообщений: 1,887
Записей в блоге: 1
11.10.2013, 18:09
Студворк — интернет-сервис помощи студентам
По-моему причина этой ошибки в том, что после сообщения WM_KEYPRESS система также посылается сообщение WM_KEYUP, но в этот момент контрол уже удалён. По крайней мере, если сменить обработчик с OnKeyPress на OnKeyDown, то ошибка исчезает.
1
 Аватар для gumi250
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
11.10.2013, 18:13
kzru_hunter, абсолютно с ваи согласен. Если на форму бросить еще кнопку в которую написать код
C++
1
2
3
4
5
6
7
8
9
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    if ( mp != NULL )
    {
        wchar_t c=VK_RETURN;
        mp->CB_OnKeyPress(mp->cb, c);
        mp = NULL;
    }
}
то тоже никакой проблемы с самоудалением.
0
 Аватар для kzru_hunter
1124 / 795 / 101
Регистрация: 01.02.2011
Сообщений: 1,887
Записей в блоге: 1
11.10.2013, 18:32
Сорри, в прошлом посту имелось ввиду не OnKeyDown, а OnKeyUp

Цитата Сообщение от BRcr Посмотреть сообщение
Ответ кроется в том же факе: You must be absolutely 100% positively sure that your member function will be the last member function invoked on this object. После завершения выполнения строчки Код C++1
OnComboKeyPress(combo, 13);управление передается обратно в метод destroy_self(), однако экземпляр класса, которому принадлежит данный метод, уже разрушен.
You must be absolutely 100% positively sure that your member function will be the last member function invoked on this object
Видимо имелся в виду не сам объект, а его данные, потому как этот код не вызывает ошибки:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
class TMyPanel : public TPanel
{
    public:
        TComboBox *combo;
        
        __fastcall TMyPanel( TObject *own ) : TPanel( own )
        {
            this->Parent = (TWinControl*)own;
            this->Width = 100;
            this->Height = 100;
            combo = new TComboBox( this );
            combo->Parent = this;
            combo->OnKeyUp = OnComboKeyUp;
        }
 
        void __fastcall OnComboKeyUp(TObject* Sender, Word &Key, TShiftState Shift)
        {
                TComboBox *combo = dynamic_cast<TComboBox*>(Sender);
                if (combo)
                {
                        delete combo->Parent;
                        test(); // тут мы можем предположить, что вылезет исключение, но увы - нет
                }
        }
 
        void test()
        {
                ShowMessage("I already removed!");
        }
};
 
 
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
        TMyPanel *panel = new TMyPanel(this);
}
0
98 / 81 / 14
Регистрация: 26.07.2013
Сообщений: 599
14.10.2013, 10:16  [ТС]
- Прошу прощения, у меня сейчас нет интернета дома, пришел на работу и обнаружил столько информации!
BRcr, я правильно понял Вас, мой пример (вариация Вашего) тоже демонстрирует, что так не надо делать.
Спасибо kzru_hunter и gumi250 - сейчас буду тоже копаться ...
- Но у меня с самого начала было ощущение, что все это - "прогулки по самому краю пропасти" ...
Все, различные в разных вариантах цепочки действий, приводящие к уничтожению Панели запускаются изнутри
какого-либо метода самой Панели. А, следовательно, завершение этого метода происходит, когда самого
экземпляра Панели уже НЕТ!

- Спасибо gumi250 за мысль, что сообщение скорее всего связано с уничтожением КомбоБокса на Панели,
а не самой Панели. Я как-то до этого не допер! Пригляжусь пристальнее ...
- Видимо, действительно, лучше не делать всего этого, либо, если уж очень хочется, то делать через очередь
главного потока, т.е. заведомо СНАРУЖИ самой Панели.
- Спасибо Всем за кучу интересной информации ! ...
0
98 / 81 / 14
Регистрация: 26.07.2013
Сообщений: 599
14.10.2013, 13:23  [ТС]
- BRcr, скажите пожалуйста, почему у меня на строку из Вашего примера (post #9):
C++
1
  combo->Parent = this;
, мой BCB6 дает исключение - "Недопустимый дескриптор окна" ? Не могу создать КомбоБокс на своей Панели.
0
98 / 81 / 14
Регистрация: 26.07.2013
Сообщений: 599
15.10.2013, 11:54  [ТС]
- Все, появилось время, во всем разобрался. Спасибо огромное ВСЕМ за деятельную помощь !
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.10.2013, 11:54

Самоуничтожение экземпляра
Как самоуничтожить мувик когда все кадры его доходят до конца? В примере по AS2 в последнем кадре писали: this.removeMovieClip(); А...

Самоуничтожение базы... :)
Можно ли в Акцессе создать код который уничтожил бы все таблицы в указанную дату? кто нибудь пробывал? ну или хотя бы думал об этом?

Самоуничтожение программы
Какой код писать чтобы при запуске программы она запустилась и после всего что ей надо сделать она себя удалила Пусть код который надо ей...

Самоуничтожение объекта
Здравствуйте. Может ли объект (Экземпляр класса) самостоятельно удаляться? Потому что чтобы удалить объект, нужно в его параметр послать...

Самоуничтожение данных на диске
На удалённой машине (Windows 7) с доступом по TeamViewer нужно создать &quot;кнопку самоподрыва&quot; для возможности уничтожения данных и самой...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
26
Ответ Создать тему
Опции темы

Новые блоги и статьи
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302 Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru