?? unitqcgisproject.~pas
字號:
App_UserInfo:=TQCUserInfo.Create;
TQCUserInfo(App_UserInfo).DBFactory:=FDBFactory;
FDLCtrl:=TDLControl.Create;
FPowerTimer:=TTimer.Create(nil);
FPowerTimer.Enabled:=False;
FPowerTimer.OnTimer:=PowerTimerOnTimer;
FDataFrom:=2;
FirstFeature:=True;
FSubStationFrame:=nil;
end;
destructor TqcGISProject.Destroy;
begin
FPowerTimer.Free;
FDBManager.Free;
GDBPoster.Free;
FDBFactory.Free;
FDLCtrl.Free;
inherited Destroy;
end;
procedure TqcGISProject.DoOnCtrlPropDialog(Sender: TObject;
ActionId:Integer; Ft: Feature);
var
ALyr:Layer;
LayerIndex:Integer;
ANode:TTreeNode;
begin
//如果為系統圖層,則使用自定義屬性對話框,否則使用系統屬性對話框//
ALyr:=TLayerManager(Sender).Layer;
LayerIndex:=GMapTools.m_Layers.IndexByLayer(ALyr);
ANode:=FindLayerNode(LayerIndex);
case TLayerTreeNodeRecord(ANode.Data).FtClassType of
LAYER_SYS_SUBSTATION:begin
if Ft.type_<>miFeatureTypeSymbol then Exit;
if (Ft.KeyValue<>'')and(StrToInt(Ft.KeyValue)>0) then
ConfigSubStationInfo(GMapTools.MapX, FDBFactory, CurUnitID, Ft)
else
NewSubStationInfo(GMapTools.MapX, FDBFactory, CurUnitID, Ft);
end;
LAYER_SYS_POWER:begin
if (Ft.type_<>miFeatureTypeLine)and(Ft.type_<>miFeatureTypeRegion) then
Exit;
if (Ft.KeyValue<>'')and(StrToInt(Ft.KeyValue)>0) then
ConfigPowerInfo(GMapTools.MapX, CurUnitID, Ft)
else
NewPowerInfo(GMapTools.MapX, CurUnitID, Ft);
end;
LAYER_SYS_LINE:begin
if (Ft.type_<>miFeatureTypeLine)and(Ft.type_<>miFeatureTypeRegion) then
Exit;
if (Ft.KeyValue<>'')and(StrToInt(Ft.KeyValue)>0) then
ConfigSDLineInfo(GMapTools.MapX, CurUnitID, Ft)
else
NewSDLineInfo(GMapTools.MapX, CurUnitID, Ft);
end;
LAYER_SYS_USER:begin
end;
LAYER_SYS_ROAD:begin
end;
end;
end;
procedure TqcGISProject.DownLoadClick(Sender: TObject);
begin
if YHB_Confirmation('是否從服務器上下載圖層?', False) then
begin
DownLoadSystemLayers;
if Form_Main.cb_Maps.ItemIndex<>-1 then
Form_Main.cb_Maps.OnChange(Form_Main.cb_Maps);
end;
end;
procedure TqcGISProject.DownloadProjectLayer(ALyr: CMapXLayer;
aLayerInfo:TLayerTreeNodeRecord; const LayerName, Path:string);
var
MapFields:TMapFieldList;
FileName:string;
begin
MapFields:=TMapFieldList.Create;
try
if aLayerInfo.DataFrom=1 then
begin
LoadMapFields(aLyr.DataSets.Item[1].Fields, MapFields);
aLyr:=GMapTools.m_Layers.CreateCustomTableLayer(
LayerName, Path, MapFields, 1, True);
AddLayerNode(SysTree, SysTreeRoot, naAddChildFirst,
-1, aLyr.Name, Path+'\'+LayerName+'.TAB', False, 2, -1, 3);
GMapTools.m_Layer.Layer:=aLyr;
GMapTools.m_Layer.LoadFeaturesFromTable(
dm_MainLinkObjects.PublicQuery,
aLayerInfo.FileName, MapFields);
end
else
begin
FileName:=CheckPath(Path)+LayerName+'.TAB';
DownloadBinaryLayer(CurUnitID, aLayerInfo.FileName, Path, LayerName);
if not FileExists(FileName) then
WarningAbort('錯誤', '下載失敗,可能服務器圖層被刪除!');
aLyr:=GMapTools.m_Layers.CreateLayerFromFile(
LayerName, FileName, 1, True);
AddLayerNode(SysTree, SysTreeRoot, naAddChildFirst,
-1, aLyr.Name, FileName, False, 2, -1, 3);
end;
finally
MapFields.Free;
end;
end;
procedure TqcGISProject.LoadAndInitMap;
var
i:Integer;
Index:Integer;
pLayerInfo:TLayerTreeNodeRecord;
MapFields:TMapFieldList;
begin
AppPath:=CheckPath(AppPath);
MapFields:=TMapFieldList.Create;
try
Index:=0;
for i:=0 to SysTree.Items.Count-1 do
begin
pLayerInfo:=TLayerTreeNodeRecord(SysTree.Items[i].Data);
if (pLayerInfo<>nil)and(pLayerInfo.NodeType=LTN_LAYER) then
begin
Inc(Index);
if pLayerInfo.IsSystem then //如果系統圖層,并且從服務器加載//
CreateLayerFromTable(pLayerInfo, Index)
else //如果是本地圖層,則從文件加載//
with GMapTools.m_Layers do
begin
if FileExists(pLayerInfo.FileName) then
CreateLayerFromFile(pLayerInfo.Name, pLayerInfo.FileName, -1, True)
else begin
MapFields.Clear;
MapFields.AddAndInit('ID', mftInteger, 0, 0, 0);
MapFields.AddAndInit('Caption', mftString, 50, 0, 0);
CreateCustomTableLayer(pLayerInfo.Name, AppPath+'Maps'+CurUnitName, MapFields, -1, True);
end;
end;
end;
end;
finally
MapFields.Free;
end;
{編輯圖層初始化為nil}
EditLayer:=nil;
end;
procedure TqcGISProject.LoadBusinessMenuItems(AMenuItem: TMenuItem);
var
aSubItem:TMenuItem;
begin
if AMenuItem=nil then Exit;
FRootMenuItem:=AMenuItem;
FRootMenuItem.Clear;
aSubItem:=LoadMenuItem(FRootMenuItem, '系統管理', -1, nil);
NReDirectServer:=aSubItem;
LoadMenuItem(aSubItem, '客戶端配置...', MENU_ID_CONNECT, ConnectClick);
LoadMenuItem(FRootMenuItem, '-', -1, nil);
aSubItem:=LoadMenuItem(FRootMenuItem, '業務操作', -1, nil);
NConfigBDS:=LoadMenuItem(aSubItem, '變電所管理', -1, nil);
LoadMenuItem(aSubItem, '-', -1, nil);
NAddStation:=LoadMenuItem(aSubItem, '增加子站', MENU_ID_ADDSUBSTATION, AddStationClick);
NAddLine:=LoadMenuItem(aSubItem, '增加線路', MENU_ID_ADDLINE, AddLineClick);
NAddKG:=LoadMenuItem(aSubItem, '增加開關', MENU_ID_ADDKG, AddKGClick);
NAddBT:=LoadMenuItem(aSubItem, '增加變臺', MENU_ID_ADDBT, AddBTClick);
LoadMenuItem(aSubItem, '-', -1, nil);
LoadMenuItem(aSubItem, '分析無記錄子站', -1, AnalyzeSubStationClick);
LoadMenuItem(aSubItem, '分析無記錄開關', -1, AnalyzePowerClick);
LoadMenuItem(aSubItem, '分析無記錄線路', -1, AnalyzeSDLineClick);
LoadMenuItem(aSubItem, '分析無開關線路', -1, AnalyzeLinkPowerClick);
LoadMenuItem(aSubItem, '-', -1, nil);
NLinkToPower:=LoadMenuItem(aSubItem, '關聯開關', MENU_ID_LINKTOPOWER, LinkToPowerClick);
LoadMenuItem(aSubItem, '-', -1, nil);
LoadMenuItem(aSubItem, '從新裝載模擬數據', -1, LoadDLControlDataClick);
LoadMenuItem(aSubItem, '啟動開關狀態隨機模擬', -1, RandomPowerStateClick);
LoadMenuItem(aSubItem, '-', -1, nil);
NUpLoad:=LoadMenuItem(aSubItem, '上載圖層', -1, UpLoadClick);
NDownLoad:=LoadMenuItem(aSubItem, '下載圖層', -1, DownLoadClick);
LoadMenuItem(aSubItem, '-', -1, nil);
NShapeProperties:=LoadMenuItem(aSubItem, '圖形屬性', MENU_ID_PROPERTIES, ShapePropertiesClick);
LoadMenuItem(FRootMenuItem, '-', -1, nil);
aSubItem:=LoadMenuItem(FRootMenuItem, '權限管理', -1, nil);
NUserRight:=aSubItem;
LoadMenuItem(aSubItem, '重新登陸', -1, ReConnectClick);
LoadMenuItem(aSubItem, '密碼修改', -1, CheckPasswordClick);
LoadMenuItem(aSubItem, '-', -1, nil);
NConfigPopedom:=LoadMenuItem(aSubItem, '權限分配', -1, ConfigPopedomClick);
end;
procedure TqcGISProject.CreateFeatureClassNode(const FCId: Integer;
ATreeView: TTreeView; ATreeNode: TTreeNode);
procedure LoadFields(ALayerInfo:TLayerTreeNodeRecord);
var
i:Integer;
ADBShell:TSQLServerDBShell;
AStruct:TQueryStruct;
AMapField:TMapField;
begin
AStruct:=TQueryStruct.Create;
try
ADBShell:=TSQLServerDBShell.Create;
try
with ADBShell do
begin
DBFactory:=FDBFactory;
GetQueryStruct(ALayerInfo.FileName, AStruct);
end;
for i:=0 to AStruct.Fields.Count-1 do
begin
AMapField:=ALayerInfo.Fields.Add;
AMapField.FieldName:=AStruct.Fields.Items[i].ColName;
AMapField.DisplayLabel:=AStruct.Fields.Items[i].Caption;
end;
finally
ADBShell.Free;
end;
finally
AStruct.Free;
end;
end;
var
ALayerNode:TTreeNode;
ALayerInfo:TLayerTreeNodeRecord;
begin
with dm_Links.DBMachine1.CreateSingleDataSet do
begin
try
SQL.Add('select LayerId, LayerName, FCId, TableName, DataFrom');
SQL.Add('from t_Layers where FCId=:FCId order by LayerIndex');
SetParamValue(0, FCId);
Open;
while not Eof do
begin
ALayerNode:=AddLayerNode(ATreeView, ATreeNode, naAddChild,
Fields[0].AsInteger, Fields[1].AsString,
Fields[3].AsString,
True, Fields[4].AsInteger,
Fields[2].AsInteger,2);
ALayerInfo:=TLayerTreeNodeRecord(ALayerNode.Data);
LoadFields(ALayerInfo);
Next;
end;
finally
Free;
end;
end;
end;
procedure TqcGISProject.LoadLayerTreeInfo;
var
aRoot:TTreeNode;
aFCItem:TTreeNode;
aLayerInfo:TLayerTreeNodeRecord;
begin
SysTree.Items.BeginUpdate;
try
{清空樹型列表}
RemoveAllNodes;
{創建系統圖層的根節點}
aRoot:=SysTree.Items[0];
{加載系統圖層,必須加載}
with dm_Links.DBMachine1.CreateSingleDataSet do
begin
try
SQL.Add('select FCId, FCName, FCIndex, LayerCount, Visible from t_FeatureClasses');
SQL.Add('where LayerCount>0 order by FCIndex');
Open;
while not Eof do
begin
if Fields[3].AsInteger=1 then //如果只有一個圖層,則加載在系統跟節點下//
CreateFeatureClassNode(Fields[0].AsInteger, SysTree, aRoot)
else begin //如果有多個圖層,則先創建圖層組節點,然后將該圖層組的圖層加載進來//
aFCItem:=SysTree.Items.AddChild(aRoot, Fields[1].AsString);
aFCItem.ImageIndex:=1;
aFCItem.SelectedIndex:=1;
aFCItem.StateIndex:=TREENODESTATE_SUBCHECKEDALL;
aLayerInfo:=TLayerTreeNodeRecord.Create;
aFCItem.Data:=aLayerInfo;
aLayerInfo.NodeType:=LTN_FEATURECLASS;
aLayerInfo.Id:=Fields[0].AsInteger;
aLayerInfo.Name:=Fields[1].AsString;
aLayerInfo.IsSystem:=True;
CreateFeatureClassNode(aLayerInfo.Id, SysTree, aFCItem) //如果有多個圖層,則加載在圖層組下//
end;
Next;
end;
finally
Free;
end;
end;
{展開第一層節點}
if SysTree.Items.Count>0 then
SysTree.Items[0].Expand(False);
finally
SysTree.Items.EndUpdate;
end;
end;
function TqcGISProject.LoadMenuItem(aPItem:TMenuItem; const Caption: string;
const Tag: Integer; ClickProc: TNotifyEvent):TMenuItem;
begin
Result:=TMenuItem.Create(aPItem.Owner);
Result.Caption:=Caption;
Result.Tag:=Tag;
Result.OnClick:=ClickProc;
aPItem.Add(Result);
end;
procedure TqcGISProject.LoadProject;
begin
inherited LoadProject;
//設置主窗口標題//
Form_Main.Caption:=ProjectName;
//因為嵌入VC或Delphi后點擊按鈕存在問題,所以隱藏//
SetGISPageVisible(ID_PAGE_SEARCH, False);
SetGISPageVisible(ID_PAGE_DRAW, False);
//創建數據庫連接//
Application.CreateForm(Tdm_Links, dm_Links);
Application.CreateForm(Tdm_MainLinkObjects, dm_MainLinkObjects);
//設置數據提交者的引擎//
GDBPoster.Engine:=dm_Links.DBMachine1;
//設置用戶信息的引擎//
FDBFactory.Engine:=dm_Links.DBMachine1;
//加載TrackLayer,目前該圖層沒有被使用,屬于保留圖層//
with GMapTools.m_Layers do
UserLayer:=CreateDefaultTempLayer('_YHB_SYS_TRACKLAYER', 1);
//EXE程序,使用上次配置連接數據庫,其它方式登陸,使用函數連接數據庫//
if AppType=atExe then
begin
//連接到數據庫//
DefConnectToServer;
//需要使用對話框獲取用戶信息//
if dm_Links.DBMachine1.Connected then ConnectUseDialog;
//如果連接到服務器,則調用DoAfterConnect進一步設置//
if Connected then DoAfterUserConnect;
end;
end;
procedure TqcGISProject.RefreshDotState(aDot:TDot);
var
aFts:Features;
aFt:Feature;
NewColor:TColor;
begin
if FDotLayer=nil then Exit;
aFts:=FDotLayer.Search('DotID='+IntToStr(aDot.DotId), EmptyParam);
if aFts.Count=1 then
begin
aFt:=aFts.Item[1];
if aDot.DotState=dsLink then
NewColor:=clRed
else
NewColor:=clBlack;
if NewColor<>aFt.Style.LineColor then
begin
aFt.Style.LineColor:=NewColor;
aFt.Update(EmptyParam, EmptyParam);
end;
end;
end;
procedure TqcGISProject.RefreshLineLayerState(const bChanged:Boolean);
var
i:Integer;
aFts:Features;
aFt:Feature;
aLine:TLine;
NewColor:TColor;
begin
if FLineLayer=nil then Exit;
for i:=0 to FDLCtrl.Lines.ItemCount-1 do
begin
aLine:=FDLCtrl.Lines.Items[i];
if (bChanged) and (not aLine.StateChanged) then
Continue;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -