一个新手问题。我要在对话框aDlg中使用主对话框mainDlg中的listview控件,来给listview中添加item一个记录.是这样做的
         CReportDlg mainDlg = new CReportDlg() ;
LV_ITEM lvitem;
lvitem.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_STATE;
lvitem.state = 0;      
lvitem.stateMask = 0; 
        lvitem.iItem =0;
lvitem.iSubItem = 0;
char temp[50];
CString TempSql;
lvitem.pszText =itoa(0, temp, 10); 
        mainDlg.m_ListCtrl.InsertItem(&lvitem);
        mainDlg.m_ListCtrl.SetItemText(0, 1, (LPCTSTR)m_id);
mainDlg.m_ListCtrl.SetItemText(0, 2, (LPCTSTR)m_type);
mainDlg.m_ListCtrl.SetItemText(0, 3, (LPCTSTR)m_address);
其中CReportDlg 是主对话框。请高手们帮我看一下,我的代码哪有问题。还是我的调用对话框的控件的方式压根就不对。

解决方案 »

  1.   

    CReportDlg* mainDlg = new CReportDlg() ; 
    mainDlg->Create你还要创建对话框,然后才能操作
      

  2.   

    你应该在主对话框类中某个成员函数中实例化一个aDlg,通过aDlg得到相应的值后传给listview,
      

  3.   

    "mainDlg.m_ListCtrl.InsertItem(&lvitem)"不是吧...添加一个全局数据结构.你可以在含有listctrl的窗口中(MainDlg)写个添加记录的自定义消息函数.然后通过aDlg发送消息到MainDlg,参数wparam为操作标识,lparam为数据结构
      

  4.   

    如果已经有了空间,那直接获取这个空间的handle就行,不要再new了。
      

  5.   

    这为兄弟很雷人哦。
    既然主对话框已经存在了,为什么还要new一个?还有,你至少说清楚aDlg和主对话框的关系吧。如果主对话框显示的时候,弹出aDlg,
    这个时候,你可以在aDlg调用的地方把listview的指针传递到aDlg中,
    或者把主对话框的指针传递到aDlg中。
    考虑到封装,建议用第二种方法,在aDlg中声明一个主对话框的指针,
    例如:
    Class aDlg : public CDialog....
    {
    ....
    private:
        MainDlg* m_pMainDlg;
    public:
        BOOL SetMainDlg(MainDlg *pDlg);
    ....
    }
    BOOL aDlg::SetMainDlg(MainDlg *pDlg)
    {
        if (pDlg != NULL)
        {
            m_pMainDlg = pDlg;
            return TRUE;
        }
        ....
    }在主对话框中,可以添加一个函数,用来给listview添加一个子项
    在aDlg对象创建之后,把this指针传递进去,就是这个SetMainDlg方法。
    然后,在aDlg中,如果你需要添加子项,调用m_pMainDlg->AddItem(...)就可以了。方法有很多,就看你能不能明白为什么要这么做。
      

  6.   

    说老实话,我没看懂,aDlg和主对话框没关系的,就是在同一工程里。。SetMainDlg  传this指针,不就相当于把本对话框对象给了实例了主对话框对象吗,这样就能调用主对话框中的方法了,为什么啊?帮我理解一下好吗,多谢上次就是你给我解答的
      

  7.   

    两个对话框之间调用,比如在A对话框中调用B对话框的一个函数,完成一定的功能。如果在A中访问不到B的对象,也就是实例,你怎么调用B的方法,毕竟很多方法不是静态的呀。所以,我们需要得到B的对象,如果这个对象已经存在了,那如何能访问到呢?如果A和B的关系是:B是主对话框,A是在B中弹出的对话框,无论A是模态的还是非模态的,A的构造都会在B中完成,这时候,this指针就表示的是B的地址了,然后在A中使用这个指针来调用其公有方法,就可以达到目的。
    这个方法最容易理解。
    一般不提倡传递listview对象或者指针,毕竟listview是主对话框中的一个成员变量,为了保持一定的封装性,对类的成员访问应该用方法,而不是设成public如果不明白,看下面的伪代码:
    // MainDlg.h
    BOOL AddItem(LV_ITEM item); // 声明,向listview中新增一个子项,当然,也可以是其他操作
    // MainDlg.cpp
    BOOL MainDlg::AddItem(LV_ITEM item)
    {
        m_listView.Insert(...) // 插入数据
    }
    BOOL MainDlg::OnOK()// 假设在主对话框中,在OnOK函数中弹出aDlg对话框,当然可以是其他函数,我随便写的
    {
    ...
    aDlg *dlg = new dlg;
    dlg->SetMainDlg(this);
    dlg->DoModal();
    ...
    }
    //aDlg.h
    MainDlg *m_pMainDlg;
    BOOL SetMainDlg(MainDlg *pMain);
    //aDlg.cpp
    BOOL SetMainDlg(...)
    {
    ...
    }BOOL Add(...)
    {
    ...
    m_pMainDlg.AddItem(...)
    ...
    }基本就是这样了。
    明白了的话,再告诉你,CWinApp类有一个公有变量m_pMainDlg,可以直接访问。
    这个留给你自己琢磨去
      

  8.   


    void CLoginDlg::OnButton1() 
    {
        CRegistDlg* pDlg = new CRegistDlg;
        pDlg->Create(IDD_Regist);
        pDlg->ShowWindow(SW_SHOW);//显示Register
        ::SendMessage(this->GetSafeHwnd(), WM_CLOSE, NULL, NULL);//关闭Login
      
    }在CLoginDlg对话框点击按钮OnButton1()进入CRegistDlg(它是非模态的,需要创建),并关闭前一个对话框
    ,具体代码看你怎么写的了......