一个比较普及的范例了,代码视乎没有什么问题,可是没事!运行后都处于后台运行,没有窗体弹出,这是为什么?
希望高手指点。(苦恼着毕设的苦逼孩子,就快要叫作品了还没什么紧张,求大虾帮助!)
代码:
void CLeftTreeView::OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult) 
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
// TODO: Add your control notification handler code here

*pResult = 0; //获得被选择选项
CTreeCtrl* pCtrl = &GetTreeCtrl();
HTREEITEM hSelItem = pCtrl->GetSelectedItem();
m_hHitItem = hSelItem; //如果没有项被选择,则将右边的列表视图清空
CMainFrame* pFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd;
if(hSelItem==NULL)
{
pFrame->SwitchToView(CARVIEW);
pFrame->m_pCarView->ShowCars("");//ShowCars()函数编写有,后面贴出
return;
} //判断选择项在树中的位置
HTREEITEM hParentItem = pCtrl->GetParentItem(hSelItem);
CString strSql,strPkType,strId;
if(hParentItem==NULL)
{//停车位类型
CString strPkType = pCtrl->GetItemText(hSelItem);
strSql.Format("select * from parkim where pktype = '%s'",strPkType);
//问题好像主要出现在上面这句,如果%s去掉引号,后面调用ShowCars后就会出错
pFrame->SwitchToView(CARVIEW);
pFrame->m_pCarView->ShowCars(strSql);
return;
}
//选择的是停车位编号,则右边视图显示该车位信息
strPkType = pCtrl->GetItemText(pCtrl->GetParentItem(hSelItem));
CString str = pCtrl->GetItemText(hSelItem);
strId = pCtrl->GetItemText(hSelItem);
pFrame->SwitchToView(CARINFOVIEW);
pFrame->m_pCarinfoView->UpdateCarInfo(strPkType,strId);//和ShowCars类是,就不贴出来了
}void CCarListView::ShowCars(CString strSql)
{
CListCtrl* p = &GetListCtrl(); //清空列表
p->DeleteAllItems();
if(strSql=="")
return;
CParkingDoc* pDoc = (CParkingDoc*)GetDocument();
CCommand<CAccessor<CParkimAccessor> > dbParkim;
long* pCount = new long; //按照strSql查询符合条件的住户
if(dbParkim.Open(pDoc->m_dbParkim.m_session,strSql,NULL,pCount)!=S_OK)
{
AfxMessageBox("ShowCars error");
delete pCount;
return;
}
int iItem = 0;
LV_ITEM lvitem;
int iActualItem = 0; //将查询得到的住户都逐个加入列表中
if(dbParkim.MoveFirst()==S_OK)
{
do
{
for(int iSubItem=0;iSubItem<8;iSubItem++)
{
lvitem.mask = LVIF_TEXT|(iSubItem==0?LVIF_IMAGE:0);
lvitem.iItem = (iSubItem = 0)?iItem:iActualItem;
lvitem.iSubItem = iSubItem;
lvitem.iImage = (iItem%2)?0:2;
CString str = "";
switch(iSubItem)
{
case 0://车位类型
{
str = dbParkim.m_Pktype;
lvitem.pszText = (LPTSTR)(LPCTSTR)str;
break;
}
case 1://编号
{
str = dbParkim.m_Id;
lvitem.pszText = (LPTSTR)(LPCTSTR)str;
break;
}
case 2://停放时间
{
str = dbParkim.m_Pktime;
lvitem.pszText = (LPTSTR)(LPCTSTR)str;
break;
}
case 3://车主
{
str = dbParkim.m_Owner;
lvitem.pszText = (LPTSTR)(LPCTSTR)str;
break;
}
case 4://联系方式
{
str = dbParkim.m_Phone;
lvitem.pszText = (LPTSTR)(LPCTSTR)str;
break;
}
case 5://车牌
{
str = dbParkim.m_Platenum;
lvitem.pszText = (LPTSTR)(LPCTSTR)str;
break;
}
case 6://车型
{
str = dbParkim.m_Cartype;
lvitem.pszText = (LPTSTR)(LPCTSTR)str;
break;
}
case 7://备注
{
str = dbParkim.m_Res;
lvitem.pszText = (LPTSTR)(LPCTSTR)str;
}
}
if(iSubItem==0)
iActualItem = GetListCtrl().InsertItem(&lvitem);
else
GetListCtrl().SetItem(&lvitem);
}
iItem++;
}
while(dbParkim.MoveNext()==S_OK);
}
dbParkim.Close();
}

解决方案 »

  1.   

    估计是什么地方卡住了,界面显示出来,你只有先注释一部分功能函数,即取消你自己添加的功能,不要执行.只执行MFC自动生成的东西,再一步步还原你加的东西,这样就知道问题出在哪里了.如果全部你自己添加的功能都去掉了,还是出不来,说明你的VS环境有问题了.
      

  2.   

    先感谢xiaohuh421先鸟我了
    我这样做了,错误不知道是错在
    strSql.Format("select * from parkim where pktype = '%s'",strPkType);
    这句话,还是错在后面调用的函数
    pFrame->SwitchToView(CARVIEW);
    pFrame->m_pCarView->ShowCars(strSql);
    如果去掉%s的单引号,在后面引用ShowCars(strSql)时,弹出
    if(dbParkim.Open(pDoc->m_dbParkim.m_session,strSql,NULL,pCount)!=S_OK)
    {
    AfxMessageBox("ShowCars error");
    delete pCount;
    return;
    }
    这个错误。
    这样怎么办?
      

  3.   

    改成这样:
    strSql.Format("select * from parkim where pktype = \'%s\'",strPkType);
      

  4.   

    问题在于你的SwitchToView函数,
    strSql.Format("select * from parkim where pktype = '%s'",strPkType);
    是SQL语句,如果pktype 是字符串类型,这种写法是OK的!你的代码很零乱,给你几点建议
    1  dbParkim.Open 打开了,它的游标指向的就是第一条记录,没必要在移了.
    2 重用已经定义过的变量
      在你的代码中,函数ShowCars;
      CListCtrl* p = &GetListCtrl();
     后面所有的GetListCtrl(). 直接用p->替代就可以
    3. 你的那个循环
      do-while里没必要在嵌套一个子循环(子循环是固定的)
      使用p->InsertItem,p->SetItemText
      

  5.   

    谢谢qimiao77。
    给出的建议很好,有学习进步了,我其实不太懂,大部分代码都是参考别人的。
    下面是SwitchToView的函数;大部分也都是书上的代码,也没看出什么地方的问题,大神再帮我看看呗。
    void CMainFrame::SwitchToView(int nViewType)
    {
    CView* pView = (CView*)m_wndSplitter.GetPane(0,1);//获得右边的视图指针

    CRect rcRight,rcFrame; //一个CRect包含用于定义矩形的左上角和右下角点的成员变量。
    pView->GetClientRect(&rcRight); //该函数获取窗口客户区的坐标。
    GetClientRect(&rcFrame); switch(nViewType)
    {
    case CARVIEW: //是CCarListView
    {
    if(!pView->IsKindOf(RUNTIME_CLASS(CCarListView)))
    {
    //先删除就的视图,再创建新的
    m_wndSplitter.DeleteView(0,1);
    m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CCarListView),
    CSize(rcRight.Width(),rcRight.Height()),NULL);
    m_wndSplitter.RecalcLayout();
    m_pCarView=(CCarListView*)m_wndSplitter.GetPane(0,1);
    }
    break;
    }
    case CARINFOVIEW: //是CCarinfoView
    {
    if(!pView->IsKindOf(RUNTIME_CLASS(CCarinfoView)))
    {
    //先删除就的视图,再创建新的
    m_wndSplitter.DeleteView(0,1);
    m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CCarinfoView),
    CSize(rcRight.Width(),rcRight.Height()),NULL);
    m_wndSplitter.RecalcLayout();
    m_pCarinfoView=(CCarinfoView*)m_wndSplitter.GetPane(0,1);
    }
    break;
    }
    default:
    break;
    }
    }