selectdepartfrm.pas

来自「医药连锁经营管理系统源码」· PAS 代码 · 共 358 行

PAS
358
字号
unit SelectDepartFrm;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, TFlatSpeedButtonUnit, ExtCtrls, RzStatus, TFlatPanelUnit,
  ActnList, ModuleAction, DB, DBClient, ckDBClient, MConnect, Grids,
  DBGridEh, DbUtilsEh, EhLibCDS, xEhLibCtl, StdCtrls, RzCmboBx, Mask, RzEdit, RzButton, ImgList,
  iMainFrm, DBCtrls, RzDBNav, RzPanel, VirtualTrees, RzRadChk;

type
  PDepartData = ^TDepartData;
  TDepartData = record
    DepartID  : Integer;
    DepartNo  : WideString;
    DepartName: WideString;
    IsCompany:  Boolean;
    Tel       : WideString;
    Fax       : WideString;
    Principal : WideString;
  end;
  TFrmSelectDepart = class(TForm)
    Panel1: TPanel;
    Panel2: TPanel;
    DComm: TDCOMConnection;
    CdsSelectDepart: TckClientDataSet;
    DsSelectDepart: TDataSource;
    Label1: TLabel;
    edValue: TRzEdit;
    RzBitBtn2: TRzBitBtn;
    ImageList1: TImageList;
    RzBitBtn1: TRzBitBtn;
    CdsSelectDepartDepartID: TAutoIncField;
    CdsSelectDepartDepartNo: TStringField;
    CdsSelectDepartDepartName: TStringField;
    CdsSelectDepartTel: TStringField;
    CdsSelectDepartFax: TStringField;
    CdsSelectDepartPrincipal: TStringField;
    vtDeparts: TVirtualStringTree;
    CdsTemp: TckClientDataSet;
    ckViewHLine: TRzCheckBox;
    CdsSelectDepartIsCompany: TBooleanField;
    procedure FormCreate(Sender: TObject);
    procedure RzBitBtn1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormShow(Sender: TObject);
    procedure vtDepartsGetNodeDataSize(Sender: TBaseVirtualTree;
      var NodeDataSize: Integer);
    procedure vtDepartsGetText(Sender: TBaseVirtualTree;
      Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
      var CellText: WideString);
    procedure RzBitBtn2Click(Sender: TObject);
    procedure ckViewHLineClick(Sender: TObject);
    procedure vtDepartsBeforeItemErase(Sender: TBaseVirtualTree;
      TargetCanvas: TCanvas; Node: PVirtualNode; ItemRect: TRect;
      var ItemColor: TColor; var EraseAction: TItemEraseAction);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure edValueChange(Sender: TObject);
    procedure edValueKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure vtDepartsDblClick(Sender: TObject);
    procedure vtDepartsKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
  private
    IFmMain:iMainForm;
    sDepartNoFmt: String;
    SvrDepart:TDispatchConnection;
    Procedure ShowDepart;
    function GetLevel(sFormat,sCode:String):Integer;
    procedure AssignNodeData(NodeData: PDepartData; DataSet: TDataSet);
  public
    AllowSelect: ShortInt;//0:允许选择公司或部门;-1:仅允许选公司;1:仅允许选部门
    SltNodeData: PDepartData;
  end;

var
  FrmSelectDepart: TFrmSelectDepart;

Function SelectDepart(var iDepartID:Integer; iSelectType: ShortInt=0): Boolean; overload;
Function SelectDepart(var iDepartID:Integer; var DepartNo, DepartName: String;
                      iSelectType: ShortInt=0):Boolean; overload;


implementation

{$R *.dfm}
Function SelectDepart(var iDepartID:Integer; iSelectType: ShortInt): Boolean;
var str1, str2: String;
begin
  result := SelectDepart(iDepartID,Str1,Str2, iSelectType);
end;


Function SelectDepart(var iDepartID:Integer; var DepartNo, DepartName: String;
  iSelectType: ShortInt):Boolean;
Begin
  Result := false;
  with TFrmSelectDepart.Create(nil) do begin
    if not(CdsSelectDepart.Active) then
      CdsSelectDepart.Open;
    AllowSelect:= iSelectType;
    if ShowModal=mrOk then begin
      iDepartID  := SltNodeData^.DepartID;
      DepartNo   := SltNodeData^.DepartNo;
      DepartName := SltNodeData^.DepartName;
      Result := true;
    End;
  End;
End;

procedure TFrmSelectDepart.FormCreate(Sender: TObject);
begin
  IFmMain := (Application.MainForm as IMainForm);
  SvrDepart := IFmMain.GetConnection(Handle,'','CommonSvr.CommonRDM');
  CdsSelectDepart.RemoteServer := SvrDepart;
  cdsTemp.RemoteServer := SvrDepart;
end;

procedure TFrmSelectDepart.RzBitBtn1Click(Sender: TObject);
begin
  Close;
end;

procedure TFrmSelectDepart.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
  Action := caFree;
end;

procedure TFrmSelectDepart.ShowDepart;
var sDepartNo: String;
    h, Level:Integer;    //h为部门编号级数,Level为级数的位数;
    NodeData: PDepartData;
    vNodes:Array of PVirtualNode; //保存各级节点
    Node: PVirtualNode;
begin
  if sDepartNoFmt='' then Begin   //获取部门编号格式
    with cdsTemp do Begin
      Close;
      CommandText := 'SELECT DepartNoFormat FROM SysSetting ';
      Open;
      sDepartNoFmt := Fields[0].AsString;
    end;
    h := Length(sDepartNoFmt);
    SetLength(vNodes, h+1);
    Screen.Cursor:=crHourGlass;
  End;
  vtDeparts.Clear;
  //以下是增加第一项
  Level:=0;
  vtDeparts.RootNodeCount := 1;
  Node := vtDeparts.GetFirst;
  NodeData := vtDeparts.GetNodeData(Node);
  NodeData^.DepartNo := '所有部门(公司)资料';
  vNodes[Level] := Node;
  //以上是增加第一项
  With CdsSelectDepart do begin
    try
      IndexFieldNames := 'DepartNo';
      if Active then
        Refresh
      else
        Open;
      First;
      While Not Eof do begin
        sDepartNo := Trim(FieldByName('DepartNo').AsString);
        Level:=GetLevel(sDepartNoFmt, sDepartNo); //返回当前部门编号的级数;
        //以下是增加子项;用上一级节点为父节点添加子节点
        if Level>0 then begin
          Node := vtDeparts.AddChild(vNodes[Level-1]);
          NodeData := vtDeparts.GetNodeData(Node);
          AssignNodeData(NodeData, cdsSelectDepart);
          vNodes[Level] := Node;
        end;
        //以上是增加子项
        Next;
      end;
    finally
      Screen.Cursor:=crDefault;
    end;
  end;
  vtDeparts.FullExpand;
//  vtDeparts.Expanded[vNodes[0]] := true;//将首节点展开
end;

function TFrmSelectDepart.GetLevel(sFormat, sCode: String): Integer;
var i,Level,iLen:Integer;
begin
  Level:=-1;//如果代码不符合标准,则返回-1
  iLen:=0;
  if (sFormat<>'')and(sCode<>'')then
    for i:=1 to Length(sFormat) do begin
      iLen := iLen+StrToInt(sFormat[i]);
      if Length(sCode)=iLen then begin
        Level:=i;
        Break;
      end;
    end;
  Result:=Level;
end;

procedure TFrmSelectDepart.AssignNodeData(NodeData: PDepartData;
  DataSet: TDataSet);
begin
  with DataSet do begin
    NodeData^.DepartID    := FieldByName('DepartID').AsInteger;
    NodeData^.DepartNo    := FieldByName('DepartNo').AsString;
    NodeData^.DepartName  := FieldByName('DepartName').AsString;
    NodeData^.IsCompany   := FieldByName('IsCompany').AsBoolean;
    NodeData^.Fax         := FieldByName('Fax').AsString;
    NodeData^.Tel         := FieldByName('Tel').AsString;
    NodeData^.Principal   := FieldByName('Principal').AsString;
  end;
end;

procedure TFrmSelectDepart.FormShow(Sender: TObject);
begin
  ShowDepart;
end;

procedure TFrmSelectDepart.vtDepartsGetNodeDataSize(
  Sender: TBaseVirtualTree; var NodeDataSize: Integer);
begin
  NodeDataSize := Sizeof(TDepartData);
end;

procedure TFrmSelectDepart.vtDepartsGetText(Sender: TBaseVirtualTree;
  Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
  var CellText: WideString);
var Data: PDepartData;
begin
  CellText := '';
  Data := Sender.GetNodeData(Node);
  case Column of
    0://DepartNo
      CellText := Data^.DepartNo;
    1://DepartName
      CellText := Data^.DepartName;
    2://Tel
      CellText := Data^.Tel;
    3://Fax
      CellText := Data^.Fax;
    4://Principal
      CellText := Data^.Principal;
  end;
end;

procedure TFrmSelectDepart.RzBitBtn2Click(Sender: TObject);
var Node: PVirtualNode;
begin
  Node := vtDeparts.GetFirstSelected;
  if (Node=nil)or(Node=vtDeparts.GetFirst) then
    Exit;
  SltNodeData := vtDeparts.GetNodeData(Node);
  if AllowSelect<>0 then begin
    if AllowSelect<0 then begin
      if not SltNodeData^.IsCompany then begin
        Application.MessageBox('你选择的是部门记录,请选择一公司记录后再执行此操作!', '消息', MB_ICONINFORMATION);
        Exit;
      end;
    end else begin
      if SltNodeData^.IsCompany then begin
        Application.MessageBox('你选择的是公司记录,请选择一部门记录后再执行此操作!', '消息', MB_ICONINFORMATION);
        Exit;
      end;
    end;
  end;
  ModalResult:=MrOK;
end;

procedure TFrmSelectDepart.ckViewHLineClick(Sender: TObject);
begin
  if ckViewHLine.Checked then
    vtDeparts.TreeOptions.PaintOptions := vtDeparts.TreeOptions.PaintOptions+[toShowHorzGridLines]
  else
    vtDeparts.TreeOptions.PaintOptions := vtDeparts.TreeOptions.PaintOptions-[toShowHorzGridLines];
end;

procedure TFrmSelectDepart.vtDepartsBeforeItemErase(
  Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode;
  ItemRect: TRect; var ItemColor: TColor;
  var EraseAction: TItemEraseAction);
begin
//同一级的各节点间用颜色背景分隔
  if Odd(Node.Index) then begin
    ItemColor := $FFEEEE;
    EraseAction := eaColor;
  end;  
end;

procedure TFrmSelectDepart.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if key=27 then close;
end;

procedure TFrmSelectDepart.edValueChange(Sender: TObject);
Var Str : String;
    Node, pNode: PVirtualNode ;
    Data: PDepartData;
begin
  Str := Trim(edValue.Text);
  If Str<>'' Then Begin
    Node := vtDeparts.GetFirst;
    while Node<>nil do begin
      Data := vtDeparts.GetNodeData(Node);
      if (Data^.DepartNo=str)or(AnsiPos(str, Data^.DepartName)=1) then begin
        pNode := Node.Parent;
        while vtDeparts.GetNodeLevel(pNode)>0 do begin
          vtDeparts.Expanded[pNode] := true;
          pNode := pNode.Parent;
        end;
        vtDeparts.Selected[Node] := true;
        Break;
      end;
      Node:=vtDeparts.GetNext(Node);
    End;
  End;
end;

procedure TFrmSelectDepart.edValueKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var vNode: PVirtualNode;
begin
  vNode :=vtDeparts.GetFirstSelected;
  if vNode = nil then vNode := vtDeparts.GetFirst;
  if vNode = nil then exit;
  
  if Key=VK_UP then begin
    vNode :=vtDeparts.GetPrevious(vNode);
    if vNode <> nil then vtDeparts.Selected[vNode] := true;
    Key :=0;
  end;
  if Key=VK_DOWN then begin
    vNode := vtDeparts.GetNext(vNode);
    if vNode <> nil then vtDeparts.Selected[vNode] := true;
    Key :=0;
  end;
end;

procedure TFrmSelectDepart.vtDepartsDblClick(Sender: TObject);
begin
  RzBitBtn2Click(RzBitBtn2);
end;

procedure TFrmSelectDepart.vtDepartsKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if key=13 then begin
    edValue.SetFocus ;
    key :=0;
  end;
end;

End.

⌨️ 快捷键说明

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