📄 cls_layercontrol.~pas
字号:
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 + -