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

📄 frmcxtreelist.pas

📁 cxTreeList使用Demo
💻 PAS
📖 第 1 页 / 共 2 页
字号:
unit frmcxTreeList;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
  Dialogs, cxGraphics, cxCustomData, cxStyles, cxTL, cxTextEdit,
  cxButtonEdit, cxCheckBox, DB, DBClient, cxInplaceContainer, cxControls,
  StdCtrls, Buttons, ExtCtrls,
  cxEdit, ComCtrls, ImgList, cxCheckComboBox;  // // dxExEdtr,dxTL, dxCntner,

////定义装载数类型
type
  orgVO=record
    FID,
    ID,
    ParentID,
    SortID:integer;
    strme,
    sCode,
    sParent,
    sName,
    sUnit:string;
    slvalue1,
    slvalue2,
    dj_in,
    je_in,
    Jevalue,
    Jadj:real;
    IsTemp:Boolean;
  end;

type
  TFrame1 = class(TFrame)
    Panel16: TPanel;
    sbtnUp: TSpeedButton;
    sbtnDown: TSpeedButton;
    sbtnDel: TSpeedButton;
    sbtnCopy: TSpeedButton;
    btnP: TButton;
    btnB: TButton;
    btnSub: TButton;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    cxTreeList1: TcxTreeList;
    cxTreeList1cxTreeListColumn1: TcxTreeListColumn;
    cxTreeList1cxTreeListColumn2: TcxTreeListColumn;
    cxTreeList1cxTreeListColumn3: TcxTreeListColumn;
    cxTreeList1cxTreeListColumn4: TcxTreeListColumn;
    cxTreeList1cxTreeListColumn5: TcxTreeListColumn;
    cxTreeList1cxTreeListColumn6: TcxTreeListColumn;
    cxTreeList1cxTreeListColumn7: TcxTreeListColumn;
    cxTreeList1cxTreeListColumn8: TcxTreeListColumn;
    cxTreeList1cxTreeListColumn9: TcxTreeListColumn;
    cxTreeList1cxTreeListColumn10: TcxTreeListColumn;
    cxTreeList1cxTreeListColumn11: TcxTreeListColumn;
    cxTreeList1cxTreeListColumn12: TcxTreeListColumn;
    cxTreeList1cxTreeListColumn13: TcxTreeListColumn;
    cxTreeList1cxTreeListColumn14: TcxTreeListColumn;
    cxTreeList1cxTreeListColumn15: TcxTreeListColumn;
    cxTreeList1cxTreeListColumn16: TcxTreeListColumn;
    cdsList: TClientDataSet;
    cdsListFID: TIntegerField;
    cdsListID: TIntegerField;
    cdsListParentID: TIntegerField;
    cdsListisLM_DE: TBooleanField;
    cdsListisLM_SLDJ: TBooleanField;
    cdsListisLM_Fml: TBooleanField;
    cdsListClass: TSmallintField;
    cdsListSortID: TIntegerField;
    cdsListlngSort: TIntegerField;
    cdsListParent: TWideStringField;
    cdsListstrMe: TWideStringField;
    cdsListintMe: TSmallintField;
    cdsListName: TWideStringField;
    cdsListWBS: TWideStringField;
    cdsListUnit: TWideStringField;
    cdsListSLValue1: TFloatField;
    cdsListSLValue2: TFloatField;
    cdsListDJ_In: TBCDField;
    cdsListJE_In: TBCDField;
    cdsListIsAnalyse: TBooleanField;
    cdsListIsTemp: TBooleanField;
    cdsListDJ_Save: TBCDField;
    cdsListJADJ: TBCDField;
    cdsListJEValue: TBCDField;
    Timer1: TTimer;
    Button9: TButton;
    ImageList: TImageList;
    procedure cxTreeList1Edited(Sender: TObject;
      AColumn: TcxTreeListColumn);
    procedure cxTreeList1InitEdit(Sender, AItem: TObject;
      AEdit: TcxCustomEdit);
    procedure Timer1Timer(Sender: TObject);
    procedure sbtnUpClick(Sender: TObject);
    procedure sbtnDownClick(Sender: TObject);
    procedure sbtnDelClick(Sender: TObject);
    procedure sbtnCopyClick(Sender: TObject);
    procedure btnPClick(Sender: TObject);
    procedure btnBClick(Sender: TObject);
    procedure btnSubClick(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure cxTreeList1CustomDrawCell(Sender: TObject;
      ACanvas: TcxCanvas; AViewInfo: TcxTreeListEditCellViewInfo;
      var ADone: Boolean);
    procedure cxTreeList1Click(Sender: TObject);
    procedure Button9Click(Sender: TObject);
  private
    { Private declarations }
    MaxId:integer;
    curValue,                 //当前鼠标所在的列值
    oldvalue:variant;         //中间变量
    CopyNode:TcxTreeListNode; //复制节点
    //检查数组数据
    procedure Cxdg(vos: array of orgVO;AParentNode:TcxTreeListNode;str:string;sum:integer);
    //填充数据
    procedure FillData(cNode:TcxTreeListNode;FID,ID,ParentID,SortID:integer;
      strme,sCode,sParent,sName,sUnit:string;slvalue1,slvalue2,dj_in,je_in,Jevalue,Jadj:real;IsTemp:Boolean);
    //修改数据
    procedure EdtData(KeyValue,edtField:string;NewKey:Variant);
    //根据列号到得字段名
    function TranFieldName(i:integer):string;
    //移动树节点
    procedure MoveTree(curNode:TcxTreeListNode;MoveType:integer);
    //粘贴树节点
    procedure PasterNode(TargeNode:TcxTreeListNode;PasterTYpe:integer);
    //增加数据到表中
    procedure AppendDataToCds(nData:OleVariant;nID,nParentID:integer;ParentWbs:string);
    //展开树节点
    procedure ExPandNode(iLevel:integer);
    //修改当前及子目录的WBS
    procedure EdtWbs(SourceNode,TargeNode:TcxTreeListNode;SourceWbs,TargeWbs:string;SourceSortID,TargeSortID:integer);
    procedure InsertNode;

    procedure GetStandChildNode(aNode,tNode:TcxTreeListNode);
  public
    { Public declarations }
    //创建树结点
    procedure CreateCxTree;
  end;

  var frame1:TFrame1;

implementation

uses uAddUStandNode, uAddStandNode;

{$R *.dfm}

{ TFrame1 }
procedure TFrame1.CreateCxTree;
var
  j,iHigh:integer;
  vos:array of orgVO;
  vo:orgVO;
  RootNode:TcxTreeListNode;
begin
  screen.Cursor:=crSQLWait;
  cxTreeList1.Clear;
  cxTreeList1.BeginUpdate;
  cxTreeList1.OnInitEdit:=nil;
  cxTreeList1.OnEdited:=nil;
  try
    j:=1;
    setlength(vos,cdsList.RecordCount);
    cdsList.First;
    while not cdsList.Eof do
    begin
      Vo.FID:=cdsList.FieldByName('FID').AsInteger;
      Vo.ID:=cdsList.FieldByName('ID').AsInteger;
      Vo.ParentID:=cdsList.FieldByName('ParentID').AsInteger;
      Vo.SortID:=cdsList.FieldByName('SortID').AsInteger;
      Vo.strme:=cdsList.FieldByName('strme').AsString;
      Vo.sCode:=cdsList.FieldByName('WBS').AsString;
      Vo.sParent:=cdsList.FieldByName('Parent').AsString;
      Vo.sName:=cdsList.FieldByName('name').AsString;
      Vo.sUnit:=cdsList.FieldByName('unit').AsString;
      Vo.slvalue1:=cdsList.FieldByName('slvalue1').AsFloat;
      Vo.slvalue2:=cdsList.FieldByName('slvalue2').AsFloat;
      Vo.dj_in:=cdsList.FieldByName('dj_in').AsFloat;
      Vo.je_in:=cdsList.FieldByName('je_in').AsFloat;
      Vo.Jevalue:=cdsList.FieldByName('jevalue').AsFloat;
      Vo.Jadj:=cdsList.FieldByName('jadj').AsFloat;
      Vo.IsTemp:=cdsList.FieldByName('IsTemp').AsBoolean;
      vos[j-1]:=vo;
      inc(j);
      cdsList.Next;
    end;
    //写入数组
   iHigh:=high(vos);
    for j:=0 to iHigh do
    begin
      if vos[j].ParentID=0 then
      begin
        RootNode:=cxTreeList1.Nodes.Root.AddChild;
        RootNode.Values[0]:=vos[j].strme;
        RootNode.Values[1]:=vos[j].sName;
        RootNode.Values[2]:=vos[j].sUnit;
        RootNode.Values[3]:=vos[j].slvalue1;
        RootNode.Values[4]:=vos[j].slvalue2;
        RootNode.Values[5]:=vos[j].dj_in;
        RootNode.Values[6]:=vos[j].je_in;
        RootNode.Values[7]:=vos[j].Jevalue;
        RootNode.Values[8]:=vos[j].Jadj;
        RootNode.Values[9]:=vos[j].IsTemp;
        RootNode.Values[10]:=vos[j].ID;
        RootNode.Values[11]:=vos[j].ParentID;
        RootNode.Values[12]:=vos[j].SortID;
        RootNode.Values[13]:=vos[j].FID;
        RootNode.Values[14]:=vos[j].sCode;
        RootNode.Values[15]:=vos[j].sParent;
        RootNode.ImageIndex:=1;
        RootNode.SelectedIndex:=0;
        Cxdg(vos,RootNode,trim(IntToStr(vos[j].ID)),cdsList.RecordCount);
      end;
    end;
  finally
    sbtnUp.Enabled:=True;
    sbtnDown.Enabled:=True;
    sbtnDel.Enabled:=True;
    sbtnCopy.Enabled:=True;
    cxTreeList1.EndUpdate;
    screen.Cursor:=crDefault;
    cxTreeList1.OnInitEdit:=cxTreeList1InitEdit;
    cxTreeList1.OnEdited:=cxTreeList1Edited;
    cxTreeList1.Items[0].Focused:=True;
  end;
end;


procedure TFrame1.AppendDataToCds(nData: OleVariant; nID,
  nParentID: integer; ParentWbs: string);
var i:integer;
  sFieldName:string;
begin
  with TClientDataSet.Create(nil) do
  try
    Data:=nData;
    //s:=FieldByName('Id').AsString;
    cdsList.Append;
    for i:=0 to cdsList.FieldCount-1 do
    begin
      sFieldName:=cdsList.Fields[i].FieldName;
      if sFieldName='ID' then
        cdsList.FieldByName('ID').AsInteger:=nID
      else if sFieldName='ParentID' then
        cdsList.FieldByName('ParentID').AsInteger:=nParentID
      else if sFieldName='WBS' then
        cdsList.FieldByName('WBS').AsString:=ParentWbs+'.'+IntToStr(nID)
      else if sFieldName='Parent' then
        cdsList.FieldByName('Parent').AsString:=ParentWbs
      else
        cdsList.FieldByName(sFieldName).Value:=FieldByName(sFieldName).Value;
    end;
    cdsList.Post;
    //cdsList.SaveToFile('TreeList.cds');
  finally
    free;
  end;
end;

procedure TFrame1.Cxdg(vos: array of orgVO; AParentNode: TcxTreeListNode;
  str: string; sum: integer);
var
  i:integer;
  aNode:TcxTreeListNode;
begin
  for i:= 0 to sum-1 do
  begin
    if CompareStr(trim(IntToStr(vos[i].ParentID)),trim(IntToStr(vos[i].ID)))=0 then begin
      showmessage('请检查上下级编码是否一致,否则会造成死循环');
      exit;
//      self.Close;
    end;
    //if (vos[i].ParentID<>'') and (CompareStr(trim(IntToStr(vos[i].ParentID)),trim(str))=0) then
    if (vos[i].ParentID<>0) and (CompareStr(trim(IntToStr(vos[i].ParentID)),trim(str))=0) then
    begin
      aNode:=AParentNode.AddChild;
      aNode.ImageIndex:=1;
      aNode.SelectedIndex:=0;
      FillData(aNode,vos[i].FID,vos[i].ID,vos[i].ParentID,vos[i].SortID,vos[i].strme,vos[i].sCode,vos[i].sParent, vos[i].sName,vos[i].sUnit,
        vos[i].slvalue1,vos[i].slvalue2,vos[i].dj_in,vos[i].je_in,vos[i].Jevalue,vos[i].Jadj,vos[i].IsTemp);
      Cxdg(vos,anode,trim(IntToStr(vos[i].ID)),sum);
    end;
  end;
end;

procedure TFrame1.FillData(cNode: TcxTreeListNode; FID, ID, ParentID,
  SortID: integer; strme, sCode, sParent, sName, sUnit: string; slvalue1,
  slvalue2, dj_in, je_in, Jevalue, Jadj: real; IsTemp: Boolean);
begin
  cNode.Values[0]:=strme;
  cNode.Values[1]:=sName;
  cNode.Values[2]:=sUnit;
  cNode.Values[3]:=slvalue1;
  cNode.Values[4]:=slvalue2;
  cNode.Values[5]:=dj_in;
  cNode.Values[6]:=je_in;
  cNode.Values[7]:=Jevalue;
  cNode.Values[8]:=Jadj;
  cNode.Values[9]:=IsTemp;
  cNode.Values[10]:=ID;
  cNode.Values[11]:=ParentID;
  cNode.Values[12]:=SortID;
  cNode.Values[13]:=FID;
  cNode.Values[14]:=sCode;
  cNode.Values[15]:=sParent;
  //上面参数可根据自己需要自行处理

end;

procedure TFrame1.EdtData(KeyValue, edtField: string; NewKey: Variant);
begin
  cdsList.IndexFieldNames:='ID';
  if cdsList.FindKey([KeyValue]) then
  begin
    cdsList.Edit;
    cdsList.FieldByName(edtField).AsVariant:=NewKey;
  end;
end;

procedure TFrame1.ExPandNode(iLevel: integer);
  procedure GetNode(aNode:TcxTreeListNode);
  var j:integer;
    bNode:TcxTreeListNode;
  begin
    for j:=0 to aNode.Count-1 do
    begin
      bNode:=aNode.Items[j];
      if bNode.Level<iLevel then
        bNode.Expand(True)
      else
        bNode.Collapse(True);
      getNode(bNode);
    end;
  end;
var i:integer;
  cNode:TcxTreeListNode;
begin
  //iLevel:0(项)、1(目)、2(节)、3(细目);
  for i:=0 to cxTreeList1.Count-1 do
  begin
    cNode:=cxTreeList1.Items[i];
    if cNode.Level<iLevel then
      cNode.Expand(true)
    else
      cNode.Collapse(True);
    GetNode(cNode);
  end;
end;

procedure TFrame1.MoveTree(curNode: TcxTreeListNode; MoveType: integer);
var sNode,aNode,newNode:TcxTreeListNode;
 // i,j:integer;
 // aSortId,nSortId:integer;
 // aWbs,nWbs:string;
  //树移动;MoveType:-1前移;1后移
  procedure EdtSortID(KeyID,edtValue:integer);
  begin
    cdsList.IndexFieldNames:='ID';
    if cdsList.FindKey([KeyID]) then
    begin
      cdsList.Edit;
      cdsList.FieldByName('SortID').AsInteger:=edtValue;
      cdsList.Post;
    end;
  end;
begin
  if MoveType=-1 then
  begin
    if curNode.IsFirst then
    begin
      sbtnUp.Enabled:=False;
      exit;
    end;
    sbtnUp.Enabled:=True;
    sbtnDown.Enabled:=True;

    aNode:=curNode.getPrevSibling;
    newNode:=cxTreeList1.InsertEx(curNode,aNode);

//    aSortId:=aNode.Values[12];
//    aWbs:=aNode.Values[14];

//    nSortId:=newNode.Values[12];
//    nWbs:=newNode.Values[14];

{    aNode.Values[12]:=nSortId;
    aNode.Values[14]:=nWbs;
    //修改原节点序号
//    EdtSortID(aNode.Values[10],nSortID);
    newNode.Values[12]:=aSortId;
    newNode.Values[14]:=aWbs;
    //修改移动后的节点序号
//    EdtSortID(newNode.Values[10],aSortID); }
    EdtWbs(aNode,newNode,NewNode.Values[14],aNode.Values[14],NewNode.Values[12],aNode.Values[12]);
  //  EdtWbs(aNode,newNode,nWbs,aWbs,nSortId,aSortID);

  end else
  if MoveType=1 then
  begin
    if curNode.IsLast then
    begin
      sbtnDown.Enabled:=False;
      exit;
    end;
    sbtnUp.Enabled:=True;
    sbtnDown.Enabled:=True;
//    aSortId:=curNode.Values[12];
//    aWbs:=curNode.Values[14];   //取WBS;

    aNode:=curNode.getNextSibling;
//    nSortId:=aNode.Values[12];
//    nWbs:=aNode.Values[14];

    newNode:=cxTreeList1.InsertEx(aNode,CurNode);
    sNode:=curNode;
//    aNode:=curNode;
{    //修改原节点序号
    sNode.Values[12]:=nSortId;
    sNode.Values[14]:=nWbs;
    EdtSortID(sNode.Values[10],nSortID);
    //修改移动后的节点序号
    newNode.Values[12]:=aSortId;
    newNode.Values[14]:=aWbs;
    EdtSortID(newNode.Values[10],aSortID);
    }
//    EdtWbs(aNode,newNode,nWbs,aWbs,nSortId,aSortID);
    EdtWbs(sNode,newNode,NewNode.Values[14],sNode.Values[14],NewNode.Values[12],sNode.Values[12]);
  end;
end;

procedure TFrame1.PasterNode(TargeNode: TcxTreeListNode;
  PasterTYpe: integer);
var aNode:TcxTreeListNode;
  i,f,ID,curID,P_ID:integer;
  cdsTmp:TClientDataSet;
  procedure AddSubNode(CurNode,ParentNode:TcxTreeListNode);
  var j,n:integer;
    NewNode:TcxTreeListNode;
  begin
    ID:=curNode.Values[10];
    cdsList.IndexFieldNames:='ID';
    if cdsList.FindKey([ID]) then
    begin
      cdsTmp.EmptyDataSet;
      //拷贝当前节点上的数据
      cdsTmp.Append;
      for j:=0 to cdsList.FieldCount-1 do
        cdsTmp.FieldByName(cdsList.Fields[j].FieldName).Value:=cdsList.FieldByName(cdsList.Fields[j].FieldName).Value;
      cdsTmp.Post;

      inc(curID);
      P_ID:=strtoint(ParentNode.Texts[10]);
      NewNode:=ParentNode.AddChild;
        NewNode.ImageIndex:=1;
        NewNode.SelectedIndex:=0;
//
      FillData(NewNode,CurNode.Values[13],CurID,P_ID,CurNode.Values[12],
        CurNode.Values[0],CurNode.Values[14],CurNode.Values[15],CurNode.Values[1],CurNode.Values[2],
        CurNode.Values[3],CurNode.Values[4],CurNode.Values[5],CurNode.Values[6],CurNode.Values[7],
        CurNode.Values[8],CurNode.Values[9]);
      //插入数据
      AppendDataToCds(cdsTmp.Data,CurID,P_ID,ParentNode.Texts[15]);
      for n:=0 to CurNode.Count-1 do
        AddSubNode(CurNode.Items[n],NewNode);

⌨️ 快捷键说明

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