Динамически создаю контролы на окне. Там есть 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*> и т.д.,
но хотелось бы какой-то универсальности, что бы можно было добавлять новые типа контролов без особых переделок окна-родителя.
Есть идеи?
Здравствуйте, 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>>