вопрос.
От: zeus_2003 Россия  
Дата: 07.03.05 11:40
Оценка:
здравствуйте. неуверен что мне сюда, но я тут недавно? так что сильно не пеняйте))
у меня есть код типа такого:
//header  CMyDlg
class CMyDlg:public CDialog
{
    бла-бла-бла;
};

//header CDirectWnd
typedef list<CMyDlg*> TMyDlgList;
typedef TMyDlgList::iterator TMyDlgIt;

#include "mydlg.h"

class CDirectWnd
{
    TMyDlgList m_Obj;
    void OnBtn()
};
//implementation of CDirectWnd
CDirectWnd::OnBtn()
{
    CMyDlg *p=new CMyDlg;
    
    p->Create(IDD_MY_DLG);
    
    m_Obj.push_back(p);

    for(TMyDlgIt it=m_Obj.begin();it!=m_Obj.end();it++)
    {
        (*it)->ShowWindow(SW_SHOW);
    }
}

вопрос:
диалоговое окно имеет кнопку закрыть. при нажатии на нее окно должно удалятся из памяти и из списка объектов.
можн это как-то сделать?
предположительно CMyDlg ничего не знает о CDirectWnd
может можно как-то проверить сущствует ли объект в списке list?



09.03.05 06:01: Перенесено модератором из 'C/C++. Прикладные вопросы' — Павел Кузнецов
Re: вопрос.
От: Кодт Россия  
Дата: 07.03.05 12:21
Оценка:
Здравствуйте, zeus_2003, Вы писали:

_>диалоговое окно имеет кнопку закрыть. при нажатии на нее окно должно удалятся из памяти и из списка объектов.

_>можн это как-то сделать?
_>предположительно CMyDlg ничего не знает о CDirectWnd
_>может можно как-то проверить сущствует ли объект в списке list?

1. Точка срабатывания — это или деструктор диалога, или его обработчик OnDestroy (в зависимости от того, хранятся ли в списке просто объекты или же существующие окна).

2. Нужно познакомить объект со своим хранилищем. Можно предельно абстрагировать — например, передавать в диалог указатель на список, или функцию-обработчик, или даже хэндл окна
class CMyDlg : public CDialog
{
  // 1
  std::list<CMyDlg*> *m_pList;

  // 2
  void* m_callbackparam;
  void (*m_callback)(void* param, CMyDlg* dlg);

  // 3
  HWND m_owner;

public:
  void OnDestroy()
  {
    // 1
    m_pList->erase(m_pList->find(this));

    // 2
    m_callback(m_callbackparam, this);

    // 3
    ::SendMessage(m_owner, WM_RemoveMeFromList, (WPARAM)0, (LPARAM)this);
  }

  ...
};

class CMyWnd : public CWnd
{
  std::list<CMyDlg*> m_list;
  void remove_from_list(CMyDlg* dlg) { m_list.erase(m_list.find(dlg)); }

  // 1

  // 2
  static void remove_from_list_thunk(void* pvthis, CMyDlg* dlg)
  {
    ((CMyWnd*)pvthis)->remove_from_list(dlg);
  }

  // 3
  LRESULT OnWmRemoveMeFromList(WPARAM w, LPARAM l)
  {
    remove_from_list((CMyDlg*)l);
  }
};


3. Если нужно просто гарантировать, что объект существует (но окно может быть закрыто) — вместо голых указателей используй shared_ptr<CMyDlg>
Перекуём баги на фичи!
Re[2]: вопрос.
От: zeus_2003 Россия  
Дата: 08.03.05 15:21
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, zeus_2003, Вы писали:


_>>диалоговое окно имеет кнопку закрыть. при нажатии на нее окно должно удалятся из памяти и из списка объектов.

К>1. Точка срабатывания — это или деструктор диалога, или его обработчик OnDestroy (в зависимости от того, хранятся ли в списке просто объекты или же существующие окна).

К>2. Нужно познакомить объект со своим хранилищем. Можно предельно абстрагировать — например, передавать в диалог указатель на список, или функцию-обработчик, или даже хэндл окна



К>3. Если нужно просто гарантировать, что объект существует (но окно может быть закрыто) — вместо голых указателей используй shared_ptr<CMyDlg>


Спасибо, мысль понял)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.