⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cls_layercontrol.~pas

📁 用Delhpi和mapx开发的警务管理系统
💻 ~PAS
📖 第 1 页 / 共 3 页
字号:
unit cls_LayerControl;

interface

uses
   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
   ExtCtrls, Menus, ComCtrls, StdCtrls, ImgList, OleCtrls, MapXLib_TLB,
   ADODB, cls_GridListView, frmSystemDM, cls_BaseClass,Base_ListView,Base_ComboBox,Base_bitbtn;

type
  ArrayTwoDegree=array of array of string;
  MyArray=array of string;

  TMapInfo = record
    LayerID: Integer;
    ParentID : Integer;
    TableName : String;
    Note: String;
    SpaceTableName: String;
    LabelField: String;
    sIndexField: string;
    Visible : integer;
    Selectble : integer;

    IsVisible: Boolean;
    LstSon: TList;
  end;
  pMapInfo = ^TMapInfo;

  TPoliceHouse=record
    PoliceId:integer;
    FEATUREID:integer;
    PoliceName:string;
  end;
  pPoliceInfo=^TPoliceHouse;

  TMapControl = class
    private
      m_TableName :String;
      m_ShowTableName:string;//  显示属性的表名
      m_Map : TMap;
      m_GuideMap:TMap;
      m_tvLayerControl: TTreeView;
      m_tvGuidTree:TTreeView;
      m_lstTreeNode: TList;
      m_CurrentLayer : CMapXLayer;
      m_lvResult : TListView;
      m_cbRelateSource:TBase_ComboBox;
      m_btnShow:TBase_BitBtn;
      m_LayerName : string;
      arrEmpty: array of string;           //空数组
      arrTwoDegreeEmpty: ArrayTwoDegree;   //空数组
      cDataOperate:TDataOperate;

      
      function SetLayerSelectable(LayerName: String;Value: Boolean): Boolean;
      procedure TreeMouseUp(Sender: TObject;Button: TMouseButton; Shift: TShiftState;X, Y: Integer);//图层控制树的MouseUp事件
      procedure GuidTreeMouseUp(Sender: TObject;Button: TMouseButton; Shift: TShiftState;X, Y: Integer);//导航树的MouseUp事件
      //function SetLayerVisible(LayerName: String;Value: Boolean) :Boolean;//设置图层可见性
      function sGeneralSQLSelect(arrSelect,arrAs,arrFrom: array of string):string; //生成Select语句
      function sGeneralSQLWhere(arrCol,arrValue,arrLink: array of string;arrOperate: ArrayTwoDegree; sLink: string):string;   //生成where语句
      function arrGetIndexField(sIndex:string):MyArray;
      function LoadOneLayer():boolean;   //点击图层控制树时,加载一个图层

      procedure bitShowClick(Sender: TObject); //显示关联资源Click事件
    public
      constructor Create(Map:TMap;GuideMap:Tmap; LatControlTree:TTreeView;PoliceTree:TTreeView; DestTableName:String;lv_Result:TListView;cb_RelateSource:TBase_ComboBox;btn_RelSource:TBase_BitBtn);     //构造函数
      function FillLayerTree : Boolean;//填充图层控制树
      function FillGuideTree:Boolean;  //填充导航树(只有派出所)
      function LoadLayer: Boolean;     //装载图层
      function LoadOneDataBaseLayer(iIndex:integer;iSelectable:integer): Boolean;  //装载鹰眼图层
      //function bSetAllLayerSelectable(bSelectable:Boolean):Boolean;//设置层的可选性
      function SetKeyBySelect(LayerName: string): Boolean;
      function sGetTvSelectSpace:string; //取得图层控制树当前选中的item的空间表名
      function sGetTvSelectTableName: string;
    end;

implementation

uses DB, cls_DataPub, frm_Basic;

{ TMapControl }

//******************************************
// 构造函数传递各对象的引用
//******************************************
constructor TMapControl.Create(Map: TMap;GuideMap:Tmap; LatControlTree: TTreeView;PoliceTree:TTreeView;
  DestTableName: String; lv_Result: TListView;cb_RelateSource:TBase_ComboBox;btn_RelSource:TBase_BitBtn);
begin
  m_Map:=Map;
  m_GuideMap:=GuideMap;
  m_tvLayerControl:=LatControlTree;
  m_tvGuidTree:=PoliceTree;
  m_TableName:=DestTableName;
  m_lstTreeNode:=TList.Create;
  m_lvResult:=lv_Result;
  m_cbRelateSource:=cb_RelateSource;
  m_btnShow:=btn_RelSource;
  m_tvLayerControl.OnMouseUp:= TreeMouseUp;
  m_tvGuidTree.OnMouseUp:= GuidTreeMouseUp ;
  m_btnShow.OnClick:=bitShowClick;
  SetLength(arrEmpty,0);
  SetLength(arrTwoDegreeEmpty,0,0);
end;

//******************************************
//   填充图层控制树
//   成功:True 失败:False
//******************************************
function TMapControl.FillLayerTree: Boolean;
var
  adoSon: TADOQuery;
  adoParent: TADOQuery;
  I,J,K,ArrLbl: Integer;
  TempMapInfo,TempSonInfo: pMapInfo;
  ParentNode,SonNode: TTreeNode;
  sSqlStr: string;
  adoTemp:TADOQuery;
begin
  try
    sSqlStr:=Format('Select * from %s where ParentId=0',[m_TableName]);//得到父节点
    adoParent:=systemDM.Glb_BasicDataOperate.adoGetAdoQuery(sSqlStr);
    with adoParent do
    begin
      for i:=0 to RecordCount-1 do
      begin
        New(TempMapInfo);
        TempMapInfo^.LayerID := FieldByName('LayerID').AsInteger;
        TempMapInfo^.ParentID := FieldByName('ParentID').AsInteger;
        TempMapInfo^.TableName := FieldByName('TableName').AsString;
        TempMapInfo^.Note := FieldByName('Note').AsString;
        TempMapInfo^.Visible := FieldByName('Visible').AsInteger;
        TempMapInfo^.SpaceTableName := FieldByName('SpaceTableName').AsString;
        TempMapInfo^.sIndexField:=FieldByName('IndexField').AsString;
        TempMapInfo^.LabelField := FieldByName('LabelField').AsString;
        TempMapInfo^.Selectble := FieldByName('Selectable').AsInteger;
        TempMapInfo^.IsVisible := True;
        TempMapInfo^.LstSon := TList.Create;
        //建立子树节点
        sSqlStr:=Format('Select * from %s where ParentID = %d',[m_TableName,
        FieldByName('LayerID').AsInteger]);
        adoSon:=systemDM.Glb_BasicDataOperate.adoGetAdoQuery(sSqlStr);
        for J := 0 to adoSon.RecordCount - 1 do
        begin
          New(TempSonInfo);
          TempSonInfo^.LayerID := adoSon.FieldByName('LayerID').AsInteger;
          TempSonInfo^.ParentID := adoSon.FieldByName('ParentID').AsInteger;
          TempSonInfo^.TableName := adoSon.FieldByName('TableName').AsString;
          TempSonInfo^.Note := adoSon.FieldByName('Note').AsString;
          TempSonInfo^.Visible := adoSon.FieldByName('Visible').AsInteger;
          TempSonInfo^.SpaceTableName := adoSon.FieldByName('SpaceTableName').AsString;
          TempSonInfo^.LabelField := adoSon.FieldByName('LabelField').AsString;
          TempSonInfo^.sIndexField := adoSon.FieldByName('IndexField').AsString;
          TempSonInfo^.Selectble := adoSon.FieldByName('selectable').AsInteger;
          TempMapInfo^.IsVisible := True;
          TempSonInfo^.LstSon := nil;
          TempMapInfo^.LstSon.Add(TempSonInfo);
          adoSon.Next;
        end;
        adoSon.Free;
        m_lstTreeNode.Add(TempMapInfo);//将父节点存入指针
        Next;
      end;
      Free;
    end;
    for I := 0 to m_lstTreeNode.Count - 1 do
    begin
      TempMapInfo := m_lstTreeNode.Items[I];
      ParentNode := m_tvLayerControl.Items.AddObject(nil,TempMapInfo^.Note,TempMapInfo);
      ParentNode.StateIndex := 3;
      //ParentNode.EditText:=False;
      for J := 0 to TempMapInfo^.LstSon.Count - 1 do
      begin
        TempSonInfo := TempMapInfo^.LstSon.Items[J];
        SonNode := m_tvLayerControl.Items.AddChildObject(ParentNode,TempSonInfo^.Note,TempSonInfo);
        SonNode.StateIndex := 15;
        //SonNode.EditText:=False;
      end;
    end;
    Result:=True;
  except
       on E: Exception do
            begin
            ShowMessage(E.Message);
            Result:= False;
            end;
  end;
end;
//******************************************
//    填充导航树
//   成功:True 失败:False
//******************************************
function TMapControl.FillGuideTree:Boolean;  //填充导航树(只有派出所)
var
  strSql:string;
  iLoop:integer;
  adoQue:TADOQuery;
  ParentNode,SonNode: TTreeNode;
  tempInfo:pPoliceInfo;
begin
  strSql:='select * from POLICEHOUSE';
  adoQue:=systemDM.Glb_BasicDataOperate.adoGetAdoQuery(strSql);
  new(tempInfo);
  tempInfo^.FEATUREID:=0;
  ParentNode := m_tvGuidTree.Items.AddObject(nil,'派出所',tempInfo);
  tempInfo:=nil;
  ParentNode.StateIndex := 3;
  for iLoop:=0 to adoQue.RecordCount -1 do
  begin
    new(tempInfo);
    tempInfo^.PoliceId:=adoQue.FieldValues['ID'];
    tempInfo^.FEATUREID:=adoQue.FieldValues['FEATUREID'];
    tempInfo^.PoliceName:=adoQue.FieldValues['NAME'];
    SonNode := m_tvGuidTree.Items.AddChildObject(ParentNode,tempInfo^.PoliceName,tempInfo);
    SonNode.StateIndex := 3;
    tempInfo:=nil;
    adoQue.next;
  end;
  adoQue.Free;
end;

//******************************************
//   导入图层
//   成功:True 失败:False
//******************************************
{function TMapControl.LoadLayer: Boolean;
var
  TempLayerInfo: CMapXLayerInfo;
  BindLayerObject: CMapXBindLayer;
  pTempMapInfo: pMapInfo;
  iLoop,jLoop: Integer;
  tempPath:string;
  adoQue:TADOQuery;
  strSqlString:string;
begin
  tempPath:=ExtractFilePath(Application.ExeName) + 'Map\';
  try
    for iLoop:=0 to m_tvLayerControl.Items.Count -1 do
    begin
      pTempMapInfo:=m_tvLayerControl.Items[iLoop].Data;
      cDataOperate:=systemDM.Glb_BasicDataOperate;
      for jLoop:=0 to m_tvLayerControl.Items[iLoop].Count -1 do
      begin
        pTempMapInfo:=m_tvLayerControl.Items[iLoop].Item[jLoop].Data;
        if (pTempMapInfo.TableName<>'') and (pTempMapInfo.Visible=1) then
        begin 
          TempLayerInfo:=CoLayerInfo.Create;
          TempLayerInfo.Type_ := miLayerInfoTypeTab;
          TempLayerInfo.AddParameter('FileSpec',tempPath + pTempMapInfo^.SpaceTableName + '.Tab');
          TempLayerInfo.AddParameter('NAME',Format('%s',[pTempMapInfo^.SpaceTableName]));
          //TempLayerInfo.AddParameter('AutoCreateDataset', 1);
          m_Map.Layers.Add(TempLayerInfo,EmptyParam);
          TempLayerInfo:=nil;
          BindLayerObject := CoBindLayer.Create;
          bindLayerObject.LayerName := pTempMapInfo^.SpaceTableName;
          BindLayerObject.LayerType := miBindLayerTypeNormal;

          strSqlString:='select * from ' + pTempMapInfo^.TableName;
          adoQue:=systemDM.Glb_BasicDataOperate.adoGetAdoQuery(strSqlString);
          m_Map.DataSets.Add(miDataSetADO,adoQue.Recordset,
          pTempMapInfo^.SpaceTableName,'FEATUREID',EmptyParam,BindLayerObject,EmptyParam,EmptyParam);
          if pTempMapInfo^.SpaceTableName='DOORPLATE_S' then
          begin
            //常驻人口数据集
            strSqlString:='select * from PermPopuAddCount';
            adoQue:=systemDM.Glb_BasicDataOperate.adoGetAdoQuery(strSqlString);
            m_Map.DataSets.Add(miDataSetADO,adoQue.Recordset,
            'PEOPLEDOORPLATEDATASET','FEATUREID',EmptyParam,BindLayerObject,EmptyParam,EmptyParam);
            //暂住人口数据集
            strSqlString:='select * from StayPopuAddCount';
            adoQue:=systemDM.Glb_BasicDataOperate.adoGetAdoQuery(strSqlString);
            m_Map.DataSets.Add(miDataSetADO,adoQue.Recordset,
            'STAYPEOPLEDOORPLATEDATASET','FEATUREID',EmptyParam,BindLayerObject,EmptyParam,EmptyParam);
          end;
          if pTempMapInfo^.SpaceTableName='POLICEHOUSE_S' then
          begin
            //单位数据集
            strSqlString:='select * from Companycount';
            adoQue:=systemDM.Glb_BasicDataOperate.adoGetAdoQuery(strSqlString);
            m_Map.DataSets.Add(miDataSetADO,adoQue.Recordset,
            'CompanyDataSet','FEATUREID',EmptyParam,BindLayerObject,EmptyParam,EmptyParam);
            //发案纪录数据集
            strSqlString:='select * from CaseRecordcount';
            adoQue:=systemDM.Glb_BasicDataOperate.adoGetAdoQuery(strSqlString);
            m_Map.DataSets.Add(miDataSetADO,adoQue.Recordset,
            'CaseRecordDataSet','FEATUREID',EmptyParam,BindLayerObject,EmptyParam,EmptyParam);
            //工作对象数据集
            strSqlString:='select * from WorkObjectcount';
            adoQue:=systemDM.Glb_BasicDataOperate.adoGetAdoQuery(strSqlString);
            m_Map.DataSets.Add(miDataSetADO,adoQue.Recordset,
            'WorkObjectDataSet','FEATUREID',EmptyParam,BindLayerObject,EmptyParam,EmptyParam);
          end;
          //标注
          BindLayerObject:=NIL;
          if pTempMapInfo^.LabelField <> '' then
          begin
            m_Map.Layers[pTempMapInfo^.SpaceTableName].LabelProperties.Dataset:=
            m_Map.DataSets.Item[pTempMapInfo^.SpaceTableName];
            m_Map.Layers[pTempMapInfo^.SpaceTableName].LabelProperties.DataField:=
            m_Map.DataSets.Item[pTempMapInfo^.SpaceTableName].Fields.Item[pTempMapInfo^.LabelField];
          end;
        end;
      end;
    end;
    m_Map.Bounds := m_Map.Layers.Item['DOORPLATE_S'] .Bounds;

    m_Map.NumericCoordSys := m_Map.DisplayCoordSys;
    for iLoop:= 1 to m_Map.Layers.Count do
    begin
      m_Map.Layers.Item[iLoop].Selectable:=false;
    end;
  except on E: Exception do
  begin
    Result := False;
    ShowMessage(E.Message);
  end;
  end;
end;}




//******************************************
//   导入图层
//   成功:True 失败:False
//******************************************
function TMapControl.LoadLayer: Boolean;
var
  TempLayerInfo: CMapXLayerInfo;
  BindLayerObject: CMapXBindLayer;
  pTempMapInfo: pMapInfo;
  iLoop: Integer;
  tempPath:string;
  adoQue:TADOQuery;
  strSqlString:string;
begin
  tempPath:=ExtractFilePath(Application.ExeName) + 'Map\';
  try
    for iLoop:=0 to m_tvLayerControl.Items.Count -1 do
    begin
      pTempMapInfo:=m_tvLayerControl.Items[iLoop].Data;
      cDataOperate:=systemDM.Glb_BasicDataOperate;
      pTempMapInfo:=m_tvLayerControl.Items[iLoop].Data;
      if (pTempMapInfo.TableName<>'') and (pTempMapInfo.Visible=1) then
      begin
        TempLayerInfo:=CoLayerInfo.Create;
        TempLayerInfo.Type_ := miLayerInfoTypeTab;
        TempLayerInfo.AddParameter('FileSpec',tempPath + pTempMapInfo^.SpaceTableName + '.Tab');

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -