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

📄 frmcxtreelist.pas

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

begin
  if TargeNode.Level=0 then
    exit;
  cdsTmp:=TClientDataSet.Create(nil);
  cdsTmp.FieldDefs:=cdsList.FieldDefs;
  cdsTmp.CreateDataSet;
  screen.Cursor:=crSQLWait;
  try
    P_ID:=strtoint(TargeNode.Parent.Texts[10]);
    if PasterTYpe=-1 then   //前项
        aNode:=cxTreeList1.Insert(TargeNode)
    else if PasterTYpe=1 then   //后项
    begin
        if TargeNode.IsLast then
          aNode:=cxTreeList1.Add(TargeNode)
        else
          aNode:=cxTreeList1.Insert(TargeNode.getNextSibling);
    end else                       //子项
    begin
      aNode:=cxTreeList1.AddChild(TargeNode);
      P_ID:=strtoint(TargeNode.Texts[10]);
    end;

    Id:=strtoint(CopyNode.Values[10]);
    cdsList.IndexFieldNames:='ID';
    cdsList.Last;
    curID:=cdsList.FieldByName('ID').AsInteger;
    if cdsList.FindKey([ID]) then
    begin
      cdsTmp.EmptyDataSet;
      //拷贝当前节点上的数据
      cdsTmp.Append;
      for f:=0 to cdsList.FieldCount-1 do
        cdsTmp.FieldByName(cdsList.Fields[f].FieldName).Value:=cdsList.FieldByName(cdsList.Fields[f].FieldName).Value;
      cdsTmp.Post;
      inc(curID);
      FillData(aNode,CopyNode.Values[13],CurID,P_ID,CopyNode.Values[12],
        CopyNode.Values[0],CopyNode.Values[14],CopyNode.Values[15],CopyNode.Values[1],CopyNode.Values[2],
        CopyNode.Values[3],CopyNode.Values[4],CopyNode.Values[5],CopyNode.Values[6],CopyNode.Values[7],
        CopyNode.Values[8],CopyNode.Values[9]);

      //插入数据
      AppendDataToCds(cdsTmp.Data,curID,P_ID,CopyNode.Values[15]);
    end;
    for i:=0 to CopyNode.Count-1 do
      AddSubNode(copyNode.Items[i],aNode);
  finally
    cdsTmp.Free;
    CopyNode:=nil;
    btnP.Enabled:=False;
    btnB.Enabled:=False;
    btnSub.Enabled:=False;
    screen.Cursor:=crDefault;
  end;
end;

function TFrame1.TranFieldName(i: integer): string;
begin
  case i of
    0 : result:='strme';
    1 : result:='name';
    2 : result:='unit';
    3 : result:='slvalue1';
    4 : result:='slvalue2';
    5 : result:='dj_in';
    6 : result:='je_in';
    7 : result:='Jevalue';
    8 : result:='Jadj';
    9 : result:='IsTemp';
    10 : result:='ID';
    11 : result:='ParentID';
    12 : result:='SortID';
    13 : result:='FID';
    14 : result:='Wbs';
    15 : result:='Parent';
  end;
end;

procedure TFrame1.EdtWbs(SourceNode, TargeNode: TcxTreeListNode; SourceWbs,
  TargeWbs: string; SourceSortID, TargeSortID: integer);
  procedure EdtFieldValue(KeyID,KeyField:string;edtValue:variant);
  begin
    cdsList.IndexFieldNames:='ID';
    if cdsList.FindKey([KeyID]) then
    begin
      cdsList.Edit;
      cdsList.FieldByName(KeyField).Value:=edtValue;
      cdsList.Post;
    end;
  end;
  procedure FindTargeNode(Node:TcxTreeListNode);
  var i:integer;
  begin
    for i:=0 to Node.Count-1 do
    begin
      Node.Items[i].Values[14]:='-'+Node.Items[i].Values[14];
      EdtFieldValue(Node.Items[i].Values[10],'WBS',Node.Items[i].Values[14]);
      if Node.Items[i].Count>0 then
        FindTargeNode(Node.Items[i]);
    end;
  end;
  procedure FindSourceNode(Node:TcxTreeListNode);
    function GetRigthLast(s:string):string;
    var i:integer;
    begin
      for i:=Length(s)-1 downto 0 do
        if s[i]='.' then
        begin
          result:=copy(s,i+1,Length(s)-i);
          exit;
        end;
    end;
  var i:integer;
      parentwbs,wbs,tmpWbs:string;
  begin
    for i:=0 to Node.Count-1 do
    begin
      parentwbs:=Node.Values[14]; //取父节点      如:15
      wbs:=Node.Items[i].Values[14];  //取当前取点 如:14.1
      //取当前节点的最后那位数
      tmpWbs:=GetRigthLast(Wbs);
      Node.Items[i].Values[14]:=parentwbs+'.'+tmpwbs;
      Node.Items[i].Values[15]:=Node.Values[14];
      EdtFieldValue(Node.Items[i].Values[10],'WBS',Node.Items[i].Values[14]);
      if Node.Items[i].Count>0 then
        FindSourceNode(Node.Items[i]);
    end;
  end;

begin
  //修改原节点序号
  SourceNode.Selected:=True;
  SourceNode.Values[12]:=SourceSortID;
  EdtFieldValue(SourceNode.Values[10],'SortID',SourceSortId);
  //修改目标点序号
  TargeNode.Selected:=True;
  TargeNode.Values[12]:=TargeSortID;
  EdtFieldValue(TargeNode.Values[10],'SortID',TargeSortID);

  //以下为处理系统编码,因表中的WBS为唯一编码,只能先把TargeNode的系统编码做个是中间处理
  //  1:在原系统编码的前面全部加上'-'+系统编码。
  //处理TargeNode的系统编码
  TargeNode.Values[14]:='-'+TargeNode.Values[14];
  EdtFieldValue(TargeNode.Values[10],'WBS',TargeNode.Values[14]);
  if TargeNode.Count>0 then
    FindTargeNode(TargeNode);
  //以上处理TargeNode节点上的编码,在原系统编码的前面全部加上'-'+系统编码。
  //  2:把SorceNodeh上的节点编号替换成TargeNode的节点编号}
  SourceNode.Values[14]:=SourceWbs;
  EdtFieldValue(SourceNode.Values[10],'WBS',SourceNode.Values[14]);
  if SourceNode.Count>0 then
    FindSourceNode(SourceNode);

  //  3.把TargeNode的节点编码改成原来的编码
  TargeNode.Values[14]:=TargeWbs;
  EdtFieldValue(TargeNode.Values[10],'WBS',TargeNode.Values[14]);
  if TargeNode.Count>0 then
    FindSourceNode(TargeNode);
end;


procedure TFrame1.cxTreeList1Edited(Sender: TObject;
  AColumn: TcxTreeListColumn);
var edtFieldName:string;
  PrekeyID:integer;
begin
  //编辑新值
  edtFieldName:=TranFieldName(AColumn.ItemIndex);
  if aColumn.Value<>oldvalue then
  try
    CurValue:=aColumn.Value;
    PrekeyID:=cxTreeList1.FocusedNode.Values[10];
    EdtData(IntToStr(PrekeyID),edtFieldName,CurValue);
  finally
    Timer1.Enabled:=False;
  end;
end;

procedure TFrame1.cxTreeList1InitEdit(Sender, AItem: TObject;
  AEdit: TcxCustomEdit);
begin
  Timer1.Enabled:=True;
  oldvalue:=AEdit.EditingValue;
  curValue:=OldValue;
end;

procedure TFrame1.Timer1Timer(Sender: TObject);
begin
  cxTreeList1.SetFocus;
end;

procedure TFrame1.sbtnUpClick(Sender: TObject);
begin
  MoveTree(cxTreeList1.FocusedNode,-1);
end;

procedure TFrame1.sbtnDownClick(Sender: TObject);
begin
  MoveTree(cxTreeList1.FocusedNode,1);
end;

procedure TFrame1.sbtnDelClick(Sender: TObject);
var aNode,nNode:TcxTreeListNode ;
  procedure DelSubNode(subNode:TcxTreeListNode);
  var sKey:string;
    i:integer;
  begin
    sKey:=subNode.Texts[10]; //取第10列上的值
    //删除相关的数据库
    cdsList.IndexFieldNames:='ID';   //关键字段,唯一值
    if cdsList.FindKey([strtoint(sKey)]) then
      cdsList.Delete;
    for i:=0 to subNode.Count-1 do
      delSubNode(subNode.Items[i]);
  end;
begin
  if MessageDlg('是否删除本节点?',  mtConfirmation, [mbYes, mbNo], 0) = mrNo then
    exit;
  aNode:=cxTreeList1.FocusedNode;
  if aNode.IsFirst then
    nNode:=aNode.Parent
  else
    nNode:=aNode.GetPrev;
  DelSubNode(aNode);    //删除节点上的相关数据
  aNode.Delete;
  nNode.EndEdit(false);
end;

procedure TFrame1.sbtnCopyClick(Sender: TObject);
begin
  CopyNode:=cxTreeList1.FocusedNode;
  btnP.Enabled:=True;
  btnB.Enabled:=True;
  btnSub.Enabled:=True;
end;

procedure TFrame1.btnPClick(Sender: TObject);
begin
  PasterNode(cxTreeList1.FocusedNode,-1);
end;

procedure TFrame1.btnBClick(Sender: TObject);
begin
  PasterNode(cxTreeList1.FocusedNode,1);
end;

procedure TFrame1.btnSubClick(Sender: TObject);
begin
  PasterNode(cxTreeList1.FocusedNode,0);
end;

procedure TFrame1.Button1Click(Sender: TObject);
begin
  ExPandNode(0);
end;

procedure TFrame1.Button2Click(Sender: TObject);
begin
  ExPandNode(1);
end;

procedure TFrame1.Button3Click(Sender: TObject);
begin
  ExPandNode(2);
end;

procedure TFrame1.Button4Click(Sender: TObject);
begin
  ExPandNode(3);
end;

procedure TFrame1.Button5Click(Sender: TObject);
begin
  ExPandNode(6);
end;

procedure TFrame1.Button6Click(Sender: TObject);
begin
  InsertNode;
end;

procedure TFrame1.cxTreeList1CustomDrawCell(Sender: TObject;
  ACanvas: TcxCanvas; AViewInfo: TcxTreeListEditCellViewInfo;
  var ADone: Boolean);
begin
  case AViewInfo.Node.Level of
   0 : ACanvas.Brush.Color:=$00B9B9B9;//$00E0E1E7;
   1 : ACanvas.Brush.Color:=$00A0D3D8;
   2 : ACanvas.Brush.Color:=$00F3BAB6;
   3 : ACanvas.Brush.Color:=$00B3D9D6;
   else
     ACanvas.Brush.Color:=$00F5BFAB;
   end;
   ACanvas.Font.Color:=clWindowText;
end;

procedure TFrame1.cxTreeList1Click(Sender: TObject);
begin
  sbtnUp.Enabled:=True;
  sbtnDown.Enabled:=True;
end;

procedure TFrame1.InsertNode;
  procedure ChuiliNextNodeSortID(cNode:TcxTreeListNode);
  var eNode: TcxTreeListNode;
    curSortID:integer;
  begin
    eNode:=cNode;
    curSortID:=eNode.Values[12]+1;;
    eNode.Values[12]:=curSortID;
    EdtData(eNode.Values[10],'SortId',curSortID);
    while not eNode.IsLast do
    begin
      eNode:=eNode.getNextSibling;
      curSortID:=eNode.Values[12]+1;;
      eNode.Values[12]:=curSortID;
      EdtData(eNode.Values[10],'SortId',curSortID);
    end;
  end;
var nWbs,nName,nUnit,sItem,sParentWbs:string;
  LevelType:integer;  //增加节点类型,0:前项;1:后项;2:子项   
  curNode,nNode:TcxTreeListNode;
  SortId:integer;
  curID,P_ID:integer;

begin
  //插入非标准节点
  if cxTreeList1.FocusedNode=nil then
    exit;
  curNode:=cxTreeList1.FocusedNode;
  if AddUnStandItem(cdsList.Data,curNode.Values[14],curNode.Values[1],nWbs,nName,nUnit,sItem,LevelType) then
  begin
    P_ID:=strtoint(curNode.Texts[11]);
    sParentWbs:=curNode.Texts[15];
    if LevelType=0 then            // 0:前项
    begin
      SortId:=curNode.Values[12];
      ChuiliNextNodeSortID(curNode);
      nNode:=cxTreeList1.Insert(curNode);
    end else if LevelType=1 then       // 1:后项
    begin
      if curNode.IsLast then           //当前节点是否最后节点
      begin
        nNode:=cxTreeList1.Add(curNode);
        SortId:=curNode.Values[12]+1;
      end else
      begin
        curNode:=curNode.getNextSibling;
        SortId:=curNode.Values[12];
        ChuiliNextNodeSortID(curNode);
        nNode:=cxTreeList1.Insert(curNode);
      end;
    end else                   //2:子项
    begin
      nNode:=cxTreeList1.AddChild(curNode);
      P_ID:=strtoint(curNode.Texts[10]);
      sParentWbs:=curNode.Values[14];
      SortId:=curNode.GetLastChild.Values[11];
    end;
        nNode.ImageIndex:=1;
        nNode.SelectedIndex:=0;
    cdsList.IndexFieldNames:='ID';
    cdsList.Last;
    curID:=cdsList.FieldByName('ID').AsInteger;
    FillData(nNode,CurNode.Values[13],CurID,P_ID,sortId,sItem,nWbs,sParentWbs,nName,nUnit,0,0,0,0,0,0,False);
      //插入数据
    cdsList.Append;
    cdsList.FieldByName('ID').AsInteger:=curID;
    cdsList.FieldByName('ParentID').AsInteger:=P_ID;
    cdsList.FieldByName('SortID').AsInteger:=sortid;
    cdsList.FieldByName('wbs').AsString:=nWbs;
    cdsList.FieldByName('Parent').AsString:=sParentWbs;
    cdsList.FieldByName('name').AsString:=nName;
    cdsList.FieldByName('Unit').AsString:=nUnit;
    cdsList.FieldByName('strMe').AsString:=sItem;
    cdsList.FieldByName('SLValue1').AsInteger:=0;
    cdsList.FieldByName('SLValue2').AsInteger:=0;
    cdsList.FieldByName('DJ_In').AsInteger:=0;
    cdsList.FieldByName('JE_In').AsInteger:=0;
    cdsList.FieldByName('JEValue').AsInteger:=0;
    cdsList.FieldByName('JADJ').AsInteger:=0;
    cdsList.FieldByName('IsTemp').AsBoolean:=False;
    cdsList.Post;
  end;
end;


procedure TFrame1.Button9Click(Sender: TObject);
var aRootNode,tRootNode:TcxTreeListNode;
  iCount:integer;
begin
  cdsList.IndexFieldNames:='ID';
  cdsList.Last;
  MaxID:=cdsList.FieldByName('ID').AsInteger;
  with  TfrmAddStandNode.Create(nil) do
  try
    if showmodal=MrOk then
    begin
      for iCount:=0 to cxTreeSandItem.Count-1 do
      begin
        aRootNode:=cxTreeSandItem.Items[iCount];
        if aRootNode.Values[2] then //判断根结点是否有选择上
        begin
          tRootNode:=cxTreeList1.Items[iCount];
          GetStandChildNode(aRootNode,tRootNode);
        end;
      end;
    end;
  finally
    free;
  end;
end;

procedure TFrame1.GetStandChildNode(aNode, tNode: TcxTreeListNode);
  function IsTargeExistsNode(wbs:string;Node:TcxTreeListNode):boolean;
  var j:integer;
    tmpWbs:string;
  begin
    result:=False;
    for j:=0 to Node.Count-1 do
    begin
      tmpWbs:=Node.Items[j].Values[14];
      if tmpWbs=Wbs then
      begin
        result:=True;
        exit;
      end;
    end;
  end;
var i:integer;
  aWbs:string;
  TmpNode:TcxTreeListNode;
begin
  for i:=0 to aNode.Count-1 do
  begin
    if aNode.Items[i].Values[2] then
    begin
      aWbs:=aNode.Items[i].Values[5];
      if not IsTargeExistsNode(aWbs,tNode) then
      begin
        Inc(MaxId);
        //新增
        TmpNode:=tNode.AddChild;
        TmpNode.ImageIndex:=1;
        TmpNode.SelectedIndex:=0;
        TmpNode.Values[0]:=aNode.Items[i].Values[7];
        TmpNode.Values[1]:=aNode.Items[i].Values[8];
        TmpNode.Values[2]:=aNode.Items[i].Values[4];
        TmpNode.Values[3]:=0;
        TmpNode.Values[4]:=0;
        TmpNode.Values[5]:=0;
        TmpNode.Values[6]:=0;
        TmpNode.Values[7]:=0;
        TmpNode.Values[8]:=0;
        TmpNode.Values[9]:=False;
        TmpNode.Values[10]:=MaxID;
        TmpNode.Values[11]:=tNode.Values[10];
        //TmpNode.Values[12]:=aNode.Items[i].Values;vos[j].SortID;
        TmpNode.Values[13]:=tNode.Values[13];
        TmpNode.Values[14]:=aWbs;
        TmpNode.Values[15]:=tNode.Values[14];
        GetStandChildNode(aNode.Items[i],tmpNode);
      end else
        GetStandChildNode(aNode.Items[i],tNode.Items[i]);
    end;
  end;
end;


end.

⌨️ 快捷键说明

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