проблема с удалением динамически созданных контролов
От: 2can  
Дата: 12.05.05 13:37
Оценка:
Динамически создаю контролы на окне. Там есть CButton, CEdit и ещё несколько моих собственных контролов
типа
class CMyControl : CWindowImpl<CMyControl, CEdit>
{
...


Понятно, что для стандартных контролов вообще не обязательно сохранять куда-то даже их HWND (кроме как для DataExchange).
Естесвенно, а вот мои собсвенные — нужно сохранять и в деструкторе окна удалять.

Так вот проблемма следующая.

я записываю указатели на разные CMyControl1, CMyControl2 и т.д. в
CSimpleValArray<CWindow*> m_controls;

Но т.к. CMyControlN является наследнеком не только CWindow, но и CMessageLoop, то при попытке сделать
for(int i = 0; i < m_controls.GetSize(); i++ )
   delete m_controls[i];

получаю Access Violation, что в общем-то логично.

Понятно, что можно создать типизированные массивы CSimpleValArray<CMyControl1*>, CSimpleValArray<CMyControl2*> и т.д.,
но хотелось бы какой-то универсальности, что бы можно было добавлять новые типа контролов без особых переделок окна-родителя.
Есть идеи?
Re: проблема с удалением динамически созданных контролов
От: 2can  
Дата: 12.05.05 13:58
Оценка:
2>Но т.к. CMyControlN является наследнеком не только CWindow, но и CMessageLoop, то при попытке сделать

извиняюсь, описался. не CMessageLoop, а CMessageMap.
Re: проблема с удалением динамически созданных контролов
От: BuHHunyx Беларусь  
Дата: 12.05.05 15:25
Оценка:
Здравствуйте, 2can, Вы писали:

2>Динамически создаю контролы на окне. Там есть CButton, CEdit и ещё несколько моих собственных контролов

2>типа
2>
2>class CMyControl : CWindowImpl<CMyControl, CEdit>
2>{
2>...
2>


2>Понятно, что для стандартных контролов вообще не обязательно сохранять куда-то даже их HWND (кроме как для DataExchange).

2>Естесвенно, а вот мои собсвенные — нужно сохранять и в деструкторе окна удалять.

2>Так вот проблемма следующая.


2>я записываю указатели на разные CMyControl1, CMyControl2 и т.д. в

2>
2>CSimpleValArray<CWindow*> m_controls;
2>

2>Но т.к. CMyControlN является наследнеком не только CWindow, но и CMessageLoop, то при попытке сделать
2>
2>for(int i = 0; i < m_controls.GetSize(); i++ )
2>   delete m_controls[i];
2>

2>получаю Access Violation, что в общем-то логично.

2>Понятно, что можно создать типизированные массивы CSimpleValArray<CMyControl1*>, CSimpleValArray<CMyControl2*> и т.д.,

2>но хотелось бы какой-то универсальности, что бы можно было добавлять новые типа контролов без особых переделок окна-родителя.
2>Есть идеи?

А если так:

for(int i = 0; i < m_controls.GetSize(); i++ )
   m_controls[i].DestroyWindow();


А в контролках:

    virtual void OnFinalMessage(HWND /*hWnd*/)
    {
        delete this;
    }


или что мешает на худой конец в деструкторе контролки написать
if(IsWindow())
    DestroyWindow();
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.