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

📄 unitlayercontrol.pas

📁 在delphi下基于MapX5.0的GIS程序
💻 PAS
字号:
unit UnitLayerControl;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, MapXLib_TLB, ExtCtrls, OleCtrls;

type
  TFrmLayerControl = class(TForm)
    BitBtnOK: TBitBtn;
    BitBtnCancel: TBitBtn;
    GroupBox1: TGroupBox;
    CheckBoxVisible: TCheckBox;
    CheckBoxSelectable: TCheckBox;
    CheckBoxEditable: TCheckBox;
    GroupBox2: TGroupBox;
    ListBoxLayers: TListBox;
    BitBtnUp: TBitBtn;
    BitBtnDown: TBitBtn;
    BitBtnAdd: TBitBtn;
    BitBtnRemove: TBitBtn;
    OpenDialog1: TOpenDialog;
    BitBtnNew: TBitBtn;
    TimerInfo: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure BitBtnAddClick(Sender: TObject);
    procedure BitBtnRemoveClick(Sender: TObject);
    procedure ListBoxLayersKeyUp(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure BitBtnUpClick(Sender: TObject);
    procedure BitBtnDownClick(Sender: TObject);
    procedure Fill_Layers();
    procedure SelectLayerNum_zero();
    procedure Control_UpDownBtn();
    procedure Enabled_PropertyPan();
    procedure View_PropertyPan();
    procedure Edit_PropertyPan();
    procedure ListBoxLayersMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure CheckBoxVisibleMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure CheckBoxSelectableMouseUp(Sender: TObject;
      Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure CheckBoxAutoLablesMouseUp(Sender: TObject;
      Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure CheckBoxEditableMouseUp(Sender: TObject;
      Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure BitBtnNewClick(Sender: TObject);
    procedure BitBtnOKClick(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure TimerInfoTimer(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure FormDestroy(Sender: TObject);
  private
    procedure WMNCPaint(var Msg: TWMNCPaint); message WM_NCPAINT;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  FrmLayerControl: TFrmLayerControl;
  SelectLayerNum, BeforeLayerNum: Integer;
  GMap: TMap;
  OnShowing: Boolean;

implementation

uses UnitMain, UnitNewLayer, UnitCommonModule, UnitModify, UnitEagleEye;

{$R *.dfm}

procedure TFrmLayerControl.WMNCPaint(var Msg: TWMNCPaint);
var
  dc : hDc;
  Pen : hPen;
  OldPen : hPen;
  OldBrush : hBrush;
begin
  inherited;
  dc := GetWindowDC(Handle);
  msg.Result := 1;
  Pen := CreatePen(PS_SOLID, 2, RGB(255, 0, 0));
  OldPen := SelectObject(dc, Pen);
  OldBrush := SelectObject(dc, GetStockObject(NULL_BRUSH));
  if OnShowing and TimerInfo.Enabled then Windows.Rectangle(dc, 0, 0, Width, Height+5);
  if Not TimerInfo.Enabled then Windows.Rectangle(dc, 0, 0, Width, Height);
  if Not OnShowing and TimerInfo.Enabled then Windows.Rectangle(dc, 0, 0, Width, Height-5);
  SelectObject(dc, OldBrush);
  SelectObject(dc, OldPen);
  DeleteObject(Pen);
  ReleaseDC(Handle, Canvas.Handle);
end;

procedure TFrmLayerControl.Fill_Layers;
var
  i, j: Integer;
begin
  With FrmMain do
  begin
    GMap.Layers.RemoveAll;
    for i := BeforeLayerNum downto 1 do
    begin
      GMap.Layers.Add(Map1.Layers[i].FileSpec, 0);
      if GMap.Layers[1].Name <> Map1.Layers[i].Name then
      begin
        for j := 1 to GMap.Layers.Count do
          if GMap.Layers[j].Name = Map1.Layers[i].Name then break;
        GMap.Layers.Move(j, 1);
      end;  
      GMap.Layers[1].Visible := Map1.Layers[i].Visible;
      GMap.Layers[1].Selectable := Map1.Layers[i].Selectable;
//      ld(i).InitPos = i
//      ld(i).LabelChanged = False
//      ld(i).StyleChanged = False
      GMap.Layers[1].Editable := Map1.Layers[i].Editable;
      GMap.Layers[1].ZoomLayer := Map1.Layers[i].ZoomLayer;
      GMap.Layers[1].ZoomMin := Map1.Layers[i].ZoomMin;
      GMap.Layers[1].ZoomMax := Map1.Layers[i].ZoomMax;
//      GMap.Layers[1].Name := Map1.Layers[1].Name;
      GMap.Layers[1].OverrideStyle := Map1.Layers[i].OverrideStyle;
      GMap.Layers[1].Style := Map1.Layers[i].Style;
//      GMap.Layers[Map1.Layers[i].Name].LabelProperties.Style := Map1.Layers[i].LabelProperties.Style;
    end;
  end;
end;

procedure TFrmLayerControl.SelectLayerNum_zero;
begin
  BitBtnRemove.Enabled:=False;
  CheckBoxVisible.Enabled:=False;
  CheckBoxSelectable.Enabled:=False;
  CheckBoxEditable.Enabled:=False;
  CheckBoxVisible.Checked:=False;
  CheckBoxSelectable.Checked:=False;
  CheckBoxEditable.Checked:=False;
end;

procedure TFrmLayerControl.Control_UpDownBtn;
begin
//  0 1
  if ListBoxLayers.Count<2 then
  begin
    BitBtnUp.Enabled:=False;
    BitBtnDown.Enabled:=False;
  end;
// >= 2
  if ListBoxLayers.Count>=2 then
  if SelectLayerNum=1 then
    begin
      BitBtnUp.Enabled:=False;
      BitBtnDown.Enabled:=True;
    end
  else if SelectLayerNum=ListBoxLayers.Count then
         begin
           BitBtnUp.Enabled:=True;
           BitBtnDown.Enabled:=False;
         end
       else begin
              BitBtnUp.Enabled:=True;
              BitBtnDown.Enabled:=True;
            end;
  if ListBoxLayers.Count>0 then ListBoxLayers.Selected[SelectLayerNum-1]:=True;
end;

procedure TFrmLayerControl.Enabled_PropertyPan;
begin
  CheckBoxVisible.Enabled:=True;
  CheckBoxSelectable.Enabled:=True;
  CheckBoxEditable.Enabled:=True;
end;

procedure TFrmLayerControl.View_PropertyPan;
begin
  if SelectLayerNum<>0 then
  begin
    Enabled_PropertyPan;
    CheckBoxVisible.Checked:=GMap.Layers[SelectLayerNum].Visible;
    CheckBoxSelectable.Checked:=GMap.Layers[SelectLayerNum].Selectable;
    CheckBoxEditable.Checked:=GMap.Layers[SelectLayerNum].Editable;
    if Not CheckBoxEditable.Checked then
      CheckBoxSelectable.Checked := False;
  end;
end;

procedure TFrmLayerControl.Edit_PropertyPan;
begin
  if SelectLayerNum<>0 then
  begin
    GMap.Layers[SelectLayerNum].Visible := CheckBoxVisible.Checked;
    GMap.Layers[SelectLayerNum].Selectable := CheckBoxSelectable.Checked;
    GMap.Layers[SelectLayerNum].Editable := CheckBoxEditable.Checked;
    if Not CheckBoxEditable.Checked then
      CheckBoxSelectable.Checked := False;
  end;
end;

procedure TFrmLayerControl.FormCreate(Sender: TObject);
begin
  GMap:= TMap.Create(GMap);
  OpenDialog1.Filter := 'MapInfo Tables(*.TAB)|*.TAB';
  OpenDialog1.Title := '请选择图层';
  OpenDialog1.InitialDir:=ExeFilePath+'Maps';
end;

procedure TFrmLayerControl.BitBtnAddClick(Sender: TObject);
var
  i: Integer;
  FName: String;
begin
  if OpenDialog1.Execute then
  begin
    GMap.Layers.Add(OpenDialog1.FileName, 0);
    FName := ExtractFileName(OpenDialog1.FileName);
    Delete(FName, StrLen(Pchar(FName))-3, 4);
    if GMap.Layers[1].Name <> FName then
    begin
      for i := 1 to GMap.Layers.Count do
        if GMap.Layers[i].Name = FName then break;
      GMap.Layers.Move(i, 1);
    end;
    ListBoxLayers.Items.Insert(0, GMap.Layers[1].Name);
    ListBoxLayers.Selected[0]:=True;
    SelectLayerNum:=1;
    BitBtnRemove.Enabled:=True;
  end;
  Control_UpDownBtn;
  View_PropertyPan;
end;

procedure TFrmLayerControl.BitBtnRemoveClick(Sender: TObject);
begin
  GMap.Layers.Remove(SelectLayerNum);
  ListBoxLayers.Items.Delete(SelectLayerNum-1);
// 处理下一个选择的图层
  if ListBoxLayers.Count>0 then
  begin
    if SelectLayerNum=ListBoxLayers.Count+1
      then SelectLayerNum:=SelectLayerNum-1;
  end else SelectLayerNum:=0;
  if SelectLayerNum=0 then SelectLayerNum_zero
    else ListBoxLayers.Selected[SelectLayerNum-1]:=True;

  Control_UpDownBtn;
  View_PropertyPan;
end;

procedure TFrmLayerControl.ListBoxLayersKeyUp(Sender: TObject;
  var Key: Word; Shift: TShiftState);
var
  i: Integer;
begin
  for i:=1 to ListBoxLayers.Count do
    if ListBoxLayers.Selected[i-1] then SelectLayerNum:=i;
  Control_UpDownBtn;
  View_PropertyPan;
end;

procedure TFrmLayerControl.BitBtnUpClick(Sender: TObject);
begin
  GMap.Layers.Move(SelectLayerNum, SelectLayerNum-1);
  ListBoxLayers.Items.Move(SelectLayerNum-1, SelectLayerNum-2);
  SelectLayerNum:=SelectLayerNum-1;
  Control_UpDownBtn;
  View_PropertyPan;
end;

procedure TFrmLayerControl.BitBtnDownClick(Sender: TObject);
begin
  GMap.Layers.Move(SelectLayerNum+1, SelectLayerNum);
  ListBoxLayers.Items.Move(SelectLayerNum, SelectLayerNum-1);
  SelectLayerNum:=SelectLayerNum+1;
  Control_UpDownBtn;
  View_PropertyPan;
end;

procedure TFrmLayerControl.ListBoxLayersMouseUp(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
  i: Integer;
begin
  for i:=1 to ListBoxLayers.Count do
    if ListBoxLayers.Selected[i-1] then SelectLayerNum:=i;
  Control_UpDownBtn;
  View_PropertyPan;
end;

procedure TFrmLayerControl.CheckBoxVisibleMouseUp(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  Edit_PropertyPan;
end;

procedure TFrmLayerControl.CheckBoxSelectableMouseUp(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  Edit_PropertyPan;
end;

procedure TFrmLayerControl.CheckBoxAutoLablesMouseUp(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  Edit_PropertyPan;
end;

procedure TFrmLayerControl.CheckBoxEditableMouseUp(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  Edit_PropertyPan;
end;

procedure TFrmLayerControl.BitBtnNewClick(Sender: TObject);
begin
  if FrmNewLayer = Nil then
    Application.CreateForm(TFrmNewLayer, FrmNewLayer);
  FrmNewLayer.ShowModal;
  upDate_LayerToFtTypes();
end;

procedure TFrmLayerControl.BitBtnOKClick(Sender: TObject);
var
  i, j: Integer;
begin
  With FrmMain do
  begin
    Map1.AutoRedraw:=False;
    Map1.Layers.RemoveAll;
    for i := GMap.Layers.Count downto 1 do
    begin
      Map1.Layers.Add(GMap.Layers[i].FileSpec, 0);

      if Map1.Layers[1].Name <> GMap.Layers[i].Name then
      begin
        for j := 1 to Map1.Layers.Count do
          if Map1.Layers[j].Name = GMap.Layers[i].Name then break;
        Map1.Layers.Move(j, 1);
      end;

      Map1.Layers[1].Visible := GMap.Layers[i].Visible;
      Map1.Layers[1].Selectable := GMap.Layers[i].Selectable;
//      ld(i).InitPos = i
//      ld(i).LabelChanged = False
//      ld(i).StyleChanged = False
      Map1.Layers[1].Editable := GMap.Layers[i].Editable;
      Map1.Layers[1].ZoomLayer := GMap.Layers[i].ZoomLayer;
      Map1.Layers[1].ZoomMin := GMap.Layers[i].ZoomMin;
      Map1.Layers[1].ZoomMax := GMap.Layers[i].ZoomMax;
//      Map1.Layers[1].Name := GMap.Layers[i].Name;
      Map1.Layers[1].OverrideStyle := GMap.Layers[i].OverrideStyle;
      Map1.Layers[1].Style := GMap.Layers[i].Style;
//      Map1.Layers[1].LabelProperties := GMap.Layers[i].LabelProperties;
    end;
    if Map1.Layers.Count>0 then
      Map1.SaveMapAsGeoset('JLU-MAP', ExeFilePath+'Maps\JLU-MAP.GST');
    Map1.AutoRedraw:=True;
    Map1.Refresh;
    FrmEagleEye.MapEagleEye.Refresh;
  // upDate LayerToFtTypes
    upDate_LayerToFtTypes();
  // 绑定图层
    BindLayerToDataset();
  end;
// 修改窗体的初始化设置
  FrmModify.SetIniFrmModify();
end;

procedure TFrmLayerControl.FormShow(Sender: TObject);
var
  i: Integer;
begin
  TimerInfo.Enabled := True;
  OnShowing := True;
  
  BeforeLayerNum := FrmMain.Map1.Layers.Count;
  Fill_Layers;
  ListBoxLayers.Clear;
  for i:=1 to GMap.Layers.Count do
    ListBoxLayers.Items.Add(GMap.Layers[i].Name);
  if ListBoxLayers.Count=0 then   //  没有图层
  begin
    BitBtnRemove.Enabled:=False;
    SelectLayerNum:=0;
  end
  else begin
         BitBtnRemove.Enabled:=True;
         SelectLayerNum:=1;
       end;
  Control_UpDownBtn;
  View_PropertyPan;
end;

procedure TFrmLayerControl.TimerInfoTimer(Sender: TObject);
begin
  if OnShowing then
  begin
    Height := Height + 5;
    if Height > 275 then TimerInfo.Enabled := False;
  end
  else
  begin
    Height := Height - 5;
    if Height < 30 then
    begin
      TimerInfo.Enabled := False;
      Close;
    end;
  end;
end;

procedure TFrmLayerControl.FormCloseQuery(Sender: TObject;
  var CanClose: Boolean);
begin
  if Height > 30 then
  begin
    CanClose := False;
    OnShowing := False;
    TimerInfo.Enabled := True;
  end; 
end;

procedure TFrmLayerControl.FormDestroy(Sender: TObject);
begin
  GMap.Destroy;
end;

end.

⌨️ 快捷键说明

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