7.5.4 车站查询的实现(2)
第4~15行代码为定义辅助的变量和记录集的初始化工作。
第16~41行代码实现了从数据表中查找站点的相关信息,插入到列表控件中。
第42~44行代码实现了查询后的控件更新显示。
上述代码中,函数SetBkColor()设置列表控件的背景颜色,函数SetTextColor ()设置列表控件中文字的颜色,然后根据用户输入的车站的名称遍历记录集,查找出所有经过该车站的车次的信息,插入到列表控件中。
上述消息函数最终实现了获取查询的站点名,通过函数FindArea()显示查询结果,并在该地方创建闪烁指示灯,方便查询者快速找到。该函数的具体代码如下:
代码位置:见光盘中本章源代码的CMapPublicView类。
- 1 void CMapPublicView::FindArea(CString searchText)
- 2 {
- 3 int i=0;
- 4 CString str;
- 5 CString expression; //查找条件表达式
- 6 CMoRecordset recs; //定义记录集对象
- 7 bool flag=false;
- 8 float X,Y;
- 9 while(i<MAXLAYERS)
- 10 {
- 11 if(i==15||i==21||i==23||i==25) //不同的层对象不同
- 12 expression.Format("(Resname Like '%s')",searchText); //构造查询语句
- 13 else
- 14 expression.Format("(Name Like '%s')",searchText);
- 15 if(flag)
- 16 break;
- 17 recs=m_mapLayer[i].SearchExpression(expression); //返回满足条件记录
- 18 if(recs)
- 19 {
- 20 recs.MoveFirst(); //移动到第一条记录
- 21 while(!recs.GetEof()) //如果没到最后一条
- 22 {
- 23 CMoFields fields(recs.GetFields());
- 24 CMoField shapeField(fields.Item(COleVariant("Shape"))); //获取数据
- 25 if(m_mapLayer[i].GetShapeType()==21) //图层几何类型为点
- 26 {
- 27 CMoPoint *pPoint=new CMoPoint();
- 28 pPoint->AttachDispatch(shapeField.Get_Value().pdispVal);
- 29 m_Map.CenterAt(pPoint->GetX(),pPoint->GetY()); //获取当前位置坐标
- 30 m_Map.FromMapPoint(pPoint->m_lpDispatch,&X,&Y);
- 31 createled(X,Y); //创建闪烁指示灯
- 32 require_attribute(searchText);
- 33 flag=true; //查询结果不为空
- 34 break;
- 35 }
- 36 else if(m_mapLayer[i].GetShapeType()==22) //图层几何类型为线
- 37 {
- 38 CMoLine *pLine=new CMoLine();
- 39 pLine->AttachDispatch(shapeField.Get_Value().pdispVal);
- 40 m_Map.FlashShape(pLine->m_lpDispatch,8);
- 41 flag=true;
- 42 require_attribute(searchText); //显示该地点相关属性
- 43 break;
- 44 pLine->ReleaseDispatch();
- 45 }
- 46 else
- 47 recs.MoveNext(); //记录后移
- 48 }
- 49 }
- 50 i++;
- 51 }
- 52 if(!flag) //没有查询到记录
- 53 {
- 54 CMainFrame *pFrame=(CMainFrame *)AfxGetMainWnd();
- 55 CAttribute *pView=(CAttribute *)(pFrame->m_wndSplitter2.GetPane(1,0)); //获取左边视图指针
- 56 pView->m_strAttribute=""; //属性框清空
- 57 pView->UpdateData(false); //输出显示
- 58 MessageBox("输入地名不存在!");
- 59 }
- 60 }
第11~17行代码实现了构造查询语句、执行查询并保存查询记录集。
第25~35行代码实现了查询图层几何类型为点的处理方法。
第36~45行代码实现了查询图层几何类型为线的处理方法。
上面的代码介绍了取记录集中记录并输出其对象属性。其中,介绍了如何通过图层(Layer)执行一个SQL查询语句,获得记录集后如何对其进行检索,并提取出具体字段内容。对于图形图层,"Shape"字段也是固定存在的,其中存放了该要素的几何图形部分,通过使用字段的GetShapeType()方法可以获得该图层是点层或线层,并进行相应的定位处理。字段的Get_value()方法返回的是一个VARIANT类型值,其中封装了各种数据类型,在Shape字段中,它封装的是一个图形要素,可以通过pdispVal取得它的真正内容,并根据图层类型将其转换为相应的图形要素,作为计算地图显示范围的依据。