WWW.ИСХОДНИКИ.РУ cpp.sources.ru
java.sources.ru web.sources.ru soft.sources.ru
jdbc.sources.ru asp.sources.ru api.sources.ru

  Форум на исходниках
  C / C++ / Visual C++
  Вопрос по MFC.

СПРОСИТЬ  ОТВЕТИТЬ
профайл | регистрация | faq

Автор Тема:   Вопрос по MFC.
Tutankhamen2 опубликован 19-05-2001 16:38 MSK   Click Here to See the Profile for Tutankhamen2   Click Here to Email Tutankhamen2  
Попробую объяснить суть проблемы:

Есть главное окно типа CWnd, у него есть член, порожденный тоже от Cwnd;

class CMainWindow : public CWnd
{
public:
CMainWindow();
CMyWnd *nwindow;
void CreateNWindow(void);
void DeleteNWindow();
};

void CMainWindow::CMainWindow()
{
nwindow=NULL;
}

void CMainWindow::CreateNWindow(void)
{
if (nwindow==NULL)
{
nwindow = new CMyWnd();
nwindow->Create(.....
}

}

void CMainWindow::DeleteNWindow()
{
if (nwindow!=NULL)
{
delete nwindow;
nwindow=NULL;
}
}

В конструкторе главного окна мы присваиваем указателю nwindow значени NULL. При необходимости создать это окно мы вызываем функцию-член CreateNWindow(), для того, чтобы удалить DeleteWindow(). Все как бы просто. Но как сделать так, чтобы nwindow мог сам себя удалить и значение указателя на себя сделать NULL. Можно вызвать функцию-член предка, но откуда ее вызывать? Из деструктора? Не получится? Я знаю, что этот вопрос банален и может показаться очень глупым, но все-таки я прошу всезнающий All объяснить мне про то, как обойти эти грабли.


Огромное спасибо !

Kosha опубликован 19-05-2001 19:34 MSK     Click Here to See the Profile for Kosha  Click Here to Email Kosha     
Насколько я это себе представляю, он поинтер сам на себя нулем сделать не может...

Если не сделать мембер-функцию типа

void CMyWnd::DeletePoiner(CMyWnd *Pointer)
{
delete Pointer;
Pointer=NULL;
}

А может, это и не запашет...
Надо проверить, а ломает...

Demo_S опубликован 20-05-2001 01:13 MSK     Click Here to See the Profile for Demo_S  Click Here to Email Demo_S     
если и это не поможет, попробуй использовать static функцию член.
Rush опубликован 20-05-2001 01:28 MSK     Click Here to See the Profile for Rush  Click Here to Email Rush     
Во-первых определись, просто ли это классы, или конкретно окна.
Если первое, то решение универсальное - в деструкторе члена класса необходимо уведомлять родителя о разрушении обьекта. Этот метод сработает и для окон тоже.
Если всё же это окна, то я думаю в твоём случае надо использовать сообщение WM_NOTIFY. Оно посылается родительскому окну при создании или разрушении дочернего окна системой. В качестве параметра не помню точно рего там, но что то типа WM_CREATE и WM_DESTROY. Соответственно по первому параметру ты указатель устанавливаешь, а по второму возвращаешь в 0.
Tutankhamen2 опубликован 20-05-2001 10:27 MSK     Click Here to See the Profile for Tutankhamen2  Click Here to Email Tutankhamen2     
Спасибо всем, я раобрался. Все это великолепно делается:
-------------
void CMyWnd::PostNcDestroy()
{
((CMainWindow*)AfxGetMainWnd())->dbw=NULL;
delete this;
CWnd::PostNcDestroy();
}
Tutankhamen2 опубликован 20-05-2001 10:27 MSK     Click Here to See the Profile for Tutankhamen2  Click Here to Email Tutankhamen2     
Спасибо всем, я раобрался. Все это великолепно делается:
-------------
void CMyWnd::PostNcDestroy()
{
((CMainWindow*)AfxGetMainWnd())->nwindow=NULL;
delete this;
CWnd::PostNcDestroy();
}
----

Так что все ok.

СПРОСИТЬ  ОТВЕТИТЬ
Перейти:


E-mail | WWW.ИСХОДНИКИ.RU

Powered by: Ultimate Bulletin Board, Freeware Version 5.10a
Purchase our Licensed Version- which adds many more features!
© Infopop Corporation (formerly Madrona Park, Inc.), 1998 - 2000.