CDialog inheritance
David Simpson -- dsimpson@cwb.com Thursday, October 24, 1996 Environment: Windows NT 3.51, VC 4.2a We are developing a client application as a front end for a database. In this app we have a number of similar dialogs. Being of O-O mind, I decided to create a base dialog class derived from CDialog withan associted dialog resource. In this class I carry out various common operations like manipulating list controls. I then derived from this class a number of dialogs that are used in the app. All dialogs use the same dialog resource defined in CSearchDlg. +-------------+ | CDialog | +-------------+ | ^ this is my / \ sad attempt --- at an OMT model | in ASCII +-------------+ | CSearchDlg | +-------------+ | ^ / \ --- +---------|----------+ | | | | +-------------+ +----------------+ | CSearch1 | | CSearch2 | +-------------+ +----------------+ The problem: Having instantiated for example CSearch1: when OnInitDialog gets called for CSearchDlg the member variables set up for say a list control in CSearchDlg do not have an attached m_hWnd. ie. any calls to manipulate the list via the member variable fail on an assertion checking for m_hWnd != NULL. If I instantiate CSearchDlg directly - no problem. I can work round this using the old method of GetDlgItem, and yes I know that maybe inheriting dialog classes and expecting DDX to work through the inheritance is pushing my luck. However, I was wondering if anyone can explain this behavior. ----------------------------------- David Simpson E-Mail - dsimpson@cwb.com -----------------------------------
Mike Blaszczak -- mikeblas@nwlink.com Sunday, October 27, 1996 [Mini-digest: 2 responses] At 18:06 10/24/96 GMT, David Simpson wrote: > Environment: Windows NT 3.51, VC 4.2a There is no such product as VC 4.2a. Do you mean that you're using MFC 4.2a? If so, please upgrade to MFC 4.2b; MFC 4.2a is beta software, and since the final MFC 4.2b release has hit the streets, 4.2a is unsupported and inappropriate for use. > The problem: > Having instantiated for example CSearch1: when > OnInitDialog gets called for CSearchDlg the member > variables set up for say a list control in CSearchDlg > do not have an attached m_hWnd. ie. any calls to > manipulate the list via the member variable fail on an > assertion checking for m_hWnd != NULL. The simplest > and yes I know that maybe inheriting > dialog classes and expecting DDX to work through > the inheritance is pushing my luck. Why do you think that is pushing your luck? > However, I was wondering if anyone can explain > this behavior. Have you tried doing any debugging? That is, have you tried putting a breakpoint on CSearch1::DoDataExchange() to see what it does? If it, itself, doesn't do any DDX_ for the controls you're worried about _and_ it doesn't call the base class implementation of DoDataExchange(), this is exactly your problem. The m_hWnd members of "has-a" control objects in a CDialog-derived object are initialized DDX_Control() calls in DoDataExchange(). .B ekiM http://www.nwlink.com/~mikeblas/ I'm afraid I've become some sort of speed freak. These words are my own. I do not speak on behalf of Microsoft. -----From: "Doug Brubacher"David, Until the base case function CDialog::OnInitDialog() is called the dialog and its child windows have not really been created thus as you have noticed all the Window handles are NULL. The Class wizard generated code automatically adds this call as the first call in your class's override of OnInitDialog(). As we see from this sample. BOOL CTestdlg::OnInitDialog() { CDialog::OnInitDialog(); // TODO: Add extra initialization here return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } Thus in your derived classes CSearch1 and CSearch2 you should either explicitly call CSearchDlg:OnInitDialog() (which presumably will be calling CDialog::OnInitDialog()) or if you wish to by-pass the code in your base class completely, your override CSearch1::OnInitDialog() needs to call CDialog::OnInitDialog() itself. Regards Doug Brubacher DouglasB@msn.com
Jim Barry -- Jim.Barry@ilp.com Monday, October 28, 1996 [Mini-digest: 2 responses] On 24 October 1996 18:06, David Simpson[SMTP:dsimpson@cwb.com] wrote: > Environment: Windows NT 3.51, VC 4.2a > > We are developing a client application as a front > end for a database. > > In this app we have a number of similar dialogs. > Being of O-O mind, I decided to create a base dialog > class derived from CDialog withan associted dialog > resource. In this class I carry out various common > operations like manipulating list controls. > > I then derived from this class a number of dialogs > that are used in the app. All dialogs use the same > dialog resource defined in CSearchDlg. > > > +-------------+ > | CDialog | > +-------------+ > | > ^ this is my > / \ sad attempt > --- at an OMT model > | in ASCII > +-------------+ > | CSearchDlg | > +-------------+ > | > ^ > / \ > --- > +---------|----------+ > | | > | | > +-------------+ +----------------+ > | CSearch1 | | CSearch2 | > +-------------+ +----------------+ > > The problem: > Having instantiated for example CSearch1: when > OnInitDialog gets called for CSearchDlg the member > variables set up for say a list control in CSearchDlg > do not have an attached m_hWnd. ie. any calls to > manipulate the list via the member variable fail on an > assertion checking for m_hWnd != NULL. > > If I instantiate CSearchDlg directly - no problem. > > I can work round this using the old method of > GetDlgItem, and yes I know that maybe inheriting > dialog classes and expecting DDX to work through > the inheritance is pushing my luck. > > However, I was wondering if anyone can explain > this behavior. > > ----------------------------------- > David Simpson > E-Mail - dsimpson@cwb.com > ----------------------------------- > Make sure you are calling CSearchDlg::DoDataExchange rather than CDialog::DoDataExchange during your CSearch1::DoDataExchange. Cheers, - Jim -----From: Roger Onslow/Newcastle/Computer Systems Australia/AU You need to call the base class OnInitDialog before trying to access and members. Also you could try defining an OnInitDialog for CSearch1 that simply calls the base CSearchDlg::OnInitDialog. And make sure that CSearchDlg::OnInitDialog calls its base class as well. Roger
rick cameron -- rick_cameron@msn.com Thursday, October 31, 1996 Hi, David I've done this sort of thing successfully. You need to ensure that CSearch1::OnInitDialog calls CSearchDlg::OnInitDialog, and that CSearch1::DoDataExchange calls CSearchDlg::DoDataExchange. - rick owner-mfc-l@majordomo.netcom.com on behalf of David Simpson wrote: > Environment: Windows NT 3.51, VC 4.2a > > We are developing a client application as a front > end for a database. > > In this app we have a number of similar dialogs. > Being of O-O mind, I decided to create a base dialog > class derived from CDialog withan associted dialog > resource. In this class I carry out various common > operations like manipulating list controls. > > I then derived from this class a number of dialogs > that are used in the app. All dialogs use the same > dialog resource defined in CSearchDlg. > > > +-------------+ > | CDialog | > +-------------+ > | > ^ this is my > / \ sad attempt > --- at an OMT model > | in ASCII > +-------------+ > | CSearchDlg | > +-------------+ > | > ^ > / \ > --- > +---------|----------+ > | | > | | > +-------------+ +----------------+ > | CSearch1 | | CSearch2 | > +-------------+ +----------------+ > > The problem: > Having instantiated for example CSearch1: when > OnInitDialog gets called for CSearchDlg the member > variables set up for say a list control in CSearchDlg > do not have an attached m_hWnd. ie. any calls to > manipulate the list via the member variable fail on an > assertion checking for m_hWnd != NULL. > > If I instantiate CSearchDlg directly - no problem. > > I can work round this using the old method of > GetDlgItem, and yes I know that maybe inheriting > dialog classes and expecting DDX to work through > the inheritance is pushing my luck. > > However, I was wondering if anyone can explain > this behavior. > > ----------------------------------- > David Simpson > E-Mail - dsimpson@cwb.com > ----------------------------------- > >
| Вернуться в корень Архива |