我建了一个MDI,里面建有一个属性表类,属性表类里面有两个属性页类,它控件类型,比如CComboBox,我给它定义了一个成员变量。然后在视图中调用该属性页类的CComboBox控件,使用它的函数比如AddString添加字符串,每次编译时能通过,但是程序运行调用显示对话框的按钮时就报错,怎么回事啊?属性表类:CPropertyNP,成员变量:ps
属性表中属性页类的成员变量:PropertyPara
属性页类中CComboBox控件的成员变量:BlockPara
ps.m_PropertyPara.m_BlockPara.AddString("ADC");编译时没有问题,但是运行程序,调用显示对话框的按钮就出错。我把这句话去掉以后,就没有问题。我把属性表类改成对话框类同样出错。

解决方案 »

  1.   

    估计是控件的初始化没有完成,调用的地方不对,试试OnInit...
      

  2.   

    试了一下,我在属性页类的的初始化函数中调用成员函数没有问题。在视图其他地方仍然有问题。但是我把CComboBox类型改成CString类型,在视图其他地方调用就没有问题了
      

  3.   

    上面改一句,
    但是我把CComboBox类型改成CString类型,在视图其他地方赋值就没有问题了
      

  4.   

    说明那个时候你的ComboBox还没有构造,嘿嘿~
    这种情况下就用CString变量就可以拉。
      

  5.   

    不会啊,我定义了一个属性表的类CPropertyNP ,ps是其成员变量
    类CPropertyNP 由两个属性页类组成,其中一个属性页的类里面定义了ComboBox类的控件。语句如下: CPropertyNP ps (_T ("Properties"));
    ps.m_PropertyPara.m_Para.AddString("大家好");我在类CPropertyNP 由的属性页类中调用这个ComboBox类控件的函数就没有问题
      

  6.   

    我在类CPropertyNP 由的属性页类的初始化函数中调用这个ComboBox类控件的函数就没有问题
      

  7.   

    你讲的好像有点道理。
    我有点搞不清楚为什么我的ComboBox没有构造好啊?我怎么才能构造它呢?我还是想用ComboBox。
      

  8.   

    CPropertyNP ps (_T ("Properties"));
    ps.m_PropertyPara.m_Para.AddString("大家好");终于明白了。这样是不行的。这里只是声名了一个局部变量ps,这个窗口根本没有初始化,所以,m_PropertyPara的窗口句柄是不存在的,非法的。所以再往下调用就挂了。
    所以,你首先要确保ps已经DoModal或者Create(此时ps要全局)出来了,这样才可以接着往下调用。当这个窗口还没有初始化时,如果你想操作控件,就只能使用CString变量了。当初始化完成后Add进去,效果是一样的:)
      

  9.   

    CPropertyNP ps 把它设计为你的成员
      

  10.   

    CPropertyNP ps (_T ("Properties"));
    ps.DoModal ();
    ps.m_PropertyPara.m_Para.AddString("大家好");我把语句改成这样还是没有用啊。把后面那句去掉可以显示对话框,但是加上后我点击OK或Cancel就报错。
    另外,CPropertyNP ps  这样直接申明成员居然要报错:error C2512: 'CPropertyNP' : no appropriate default constructor available,搞不懂了啊。
    怎样才可以直接申明属性表的成员变量啊,我直接申明属性单的成员变量也没有问题啊。
      

  11.   

    修改成功了,我原来开始是在视图中调用CPropertyNP类的成员变量,结果出错了。
    现在我改在对应类的OnInitDialog()函数中调用就没问题了。自己概念搞错了。谢谢楼上各位!
      

  12.   

    修改成功了,我原来开始是在视图中调用CPropertyNP类的成员变量的函数,结果出错了。
    现在我改在对应类的OnInitDialog()函数中调用就没问题了。自己概念搞错了。谢谢楼上各位!