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

📄 uaddstandnode.pas

📁 cxTreeList使用Demo
💻 PAS
字号:
unit uAddStandNode;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,
  cxTL, DB, DBClient, Grids, DBGrids, cxGraphics, cxCustomData, cxStyles,
  cxMaskEdit, cxInplaceContainer, cxDBTL, cxControls, cxTLData, cxCheckBox,
  dxdbtrel, ComCtrls, dxtree, dxdbtree, cxTextEdit,
  cxEdit, MemTableDataEh, GridsEh, DBGridEh, MemTableEh, DataDriverEh,
  ExtCtrls, Buttons;

type
  StandOrgVo=record
    ID,
    ParentID:integer;
    strme,
    wbs,
    PWbs,
    sName,
    XmName,
    sUnit:string;
    IsTemp:Boolean;
  end;

type
  TfrmAddStandNode = class(TForm)
    cdsStandXm: TClientDataSet;
    DataSource1: TDataSource;
    cxTreeSandItem: TcxTreeList;
    cxTreeList1cxTreeListColumn0: TcxTreeListColumn;
    cxTreeList1cxTreeListColumn2: TcxTreeListColumn;
    cxTreeList1cxTreeListColumn1: TcxTreeListColumn;
    cxTreeList1cxTreeListColumn3: TcxTreeListColumn;
    cxTreeList1cxTreeListColumn4: TcxTreeListColumn;
    cxTreeList1cxTreeListColumn5: TcxTreeListColumn;
    cxTreeList1cxTreeListColumn6: TcxTreeListColumn;
    cxTreeList1cxTreeListColumn7: TcxTreeListColumn;
    cxTreeList1cxTreeListColumn8: TcxTreeListColumn;
    Timer1: TTimer;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    cdsStandXmPType: TIntegerField;
    cdsStandXmFType: TIntegerField;
    cdsStandXmWBS: TWideStringField;
    cdsStandXmClass: TIntegerField;
    cdsStandXmlngSort: TIntegerField;
    cdsStandXmParent: TWideStringField;
    cdsStandXmstrMe: TWideStringField;
    cdsStandXmintMe: TIntegerField;
    cdsStandXmName: TWideStringField;
    cdsStandXmUnit: TWideStringField;
    cdsStandXmComputFml: TWideStringField;
    cdsStandXmIsInitialization: TBooleanField;
    cdsStandXmID: TIntegerField;
    cdsStandXmParentID: TIntegerField;
    Label1: TLabel;
    procedure cxTreeSandItemEdited(Sender: TObject;
      AColumn: TcxTreeListColumn);
    procedure cxTreeSandItemInitEdit(Sender, AItem: TObject;
      AEdit: TcxCustomEdit);
    procedure Timer1Timer(Sender: TObject);
    procedure cxTreeSandItemEditing(Sender: TObject;
      AColumn: TcxTreeListColumn; var Allow: Boolean);
    procedure FormCreate(Sender: TObject);
    procedure cxTreeList1cxTreeListColumn2PropertiesChange(
      Sender: TObject);
  private
    { Private declarations }
   // curColumn:integer;
   // oldvalue:variant;
   // CurNode:TcxTreeListNode;
    procedure CretateTree;
    procedure Cxdg(vos: array of StandOrgVo;AParentNode:TcxTreeListNode;str:string;sum:integer);
 //   procedure UpdChildNode(curNode:TcxTreeListNode;BoolSelected:Boolean);
//    procedure UpdParentNode(curNode:TcxTreeListNode;BoolSelected:Boolean);

  public
    { Public declarations }
  end;

var
  frmAddStandNode: TfrmAddStandNode;
 // procedure AddStandNode( curNode:TcxTreeListNode;ss:string);
  function  AddStandNode(out oTreeList: TcxTreeList):Boolean;

implementation


{$R *.dfm}

function  AddStandNode(out oTreeList: TcxTreeList):Boolean;
begin
  result:=False;
  with  TfrmAddStandNode.Create(nil) do
  try
    Timer1.Enabled:=False;
    cdsStandXm.LoadFromFile('StandXm.cds');
    CretateTree;
    if showmodal=MrOk then
    begin
      oTreeList:=cxTreeSandItem;
      result:=True;
    end;
  finally
    free;
  end;
end;


procedure TfrmAddStandNode.CretateTree;
var
  j,iHigh:integer;
  vos:array of StandOrgVo;
  vo:StandOrgVo;
  RootNode:TcxTreeListNode;
begin
  screen.Cursor:=crSQLWait;
  cxTreeSandItem.Clear;
  cxTreeSandItem.BeginUpdate;
  cxTreeSandItem.OnInitEdit:=nil;
  cxTreeSandItem.OnEdited:=nil;
  try
    j:=1;
    setlength(vos,cdsStandXm.RecordCount);
    cdsStandXm.First;
    while not cdsStandXm.Eof do
    begin
      Vo.ID:=cdsStandXm.FieldByName('ID').AsInteger;
      Vo.ParentID:=cdsStandXm.FieldByName('ParentID').AsInteger;
      Vo.sName:=cdsStandXm.FieldByName('Name').AsString;
      Vo.wbs:=cdsStandXm.FieldByName('WBS').AsString;
      Vo.PWbs:=cdsStandXm.FieldByName('Parent').AsString;
      Vo.strme:=cdsStandXm.FieldByName('strme').AsString;
      Vo.sUnit:=cdsStandXm.FieldByName('unit').AsString;
      Vo.XmName:=Vo.strme+' '+Vo.sName;
      vos[j-1]:=vo;
      inc(j);
      cdsStandXm.Next;
    end;
    //写入数组
   iHigh:=high(vos);
    for j:=0 to iHigh do
    begin
      if vos[j].ParentID=0 then
      begin
        RootNode:=cxTreeSandItem.Nodes.Root.AddChild;
        RootNode.Values[0]:=vos[j].ID;
        RootNode.Values[1]:=vos[j].ParentID;
        RootNode.Values[2]:=False;
        RootNode.Values[3]:=vos[j].XmName;
        RootNode.Values[4]:=vos[j].sUnit;

        RootNode.Values[5]:=vos[j].wbs;
        RootNode.Values[6]:=vos[j].PWbs;
        RootNode.Values[7]:=vos[j].strme;
        RootNode.Values[8]:=vos[j].sName;
        Cxdg(vos,RootNode,trim(IntToStr(vos[j].ID)),cdsStandXm.RecordCount);
      end;
    end;
  finally
    cxTreeSandItem.EndUpdate;
    cxTreeSandItem.OnInitEdit:=cxTreeSandItemInitEdit;
    cxTreeSandItem.OnEdited:=cxTreeSandItemEdited;
    screen.Cursor:=crDefault;
  end;
end;

procedure TfrmAddStandNode.Cxdg(vos: array of StandOrgVo;
  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('请检查上下级编码是否一致,否则会造成死循环');
    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.Values[0]:=vos[i].ID;
      aNode.Values[1]:=vos[i].ParentID;
      aNode.Values[2]:=False;
      aNode.Values[3]:=vos[i].XmName;
      aNode.Values[4]:=vos[i].sUnit;
      aNode.Values[5]:=vos[i].wbs;
      aNode.Values[6]:=vos[i].PWbs;
      aNode.Values[7]:=vos[i].strme;
      aNode.Values[8]:=vos[i].sName;
      Cxdg(vos,anode,trim(IntToStr(vos[i].ID)),sum);
    end;
  end;
end;

procedure TfrmAddStandNode.cxTreeSandItemEdited(Sender: TObject;
  AColumn: TcxTreeListColumn);
var i:integer;
begin
  try
    cxTreeSandItem.BeginUpdate;
    i:=AColumn.ItemIndex;
    label1.Caption:=AColumn.Value;
  finally
    cxTreeSandItem.EndUpdate;
  end;
{  //编辑新值
  if AColumn.ItemIndex<>2 then
    exit;
  if aColumn.Value<>oldvalue then
  begin
    Timer1.Enabled:=False;
    CurNode:=cxTreeSandItem.FocusedNode;
    UpdChildNode(cxTreeSandItem.FocusedNode,AColumn.Value);
    UpdParentNode(cxTreeSandItem.FocusedNode,AColumn.Value);
  end;
  }
end;

procedure TfrmAddStandNode.cxTreeSandItemInitEdit(Sender, AItem: TObject;
  AEdit: TcxCustomEdit);
begin
{  if curColumn=2 then
  begin
    Timer1.Enabled:=True;
    oldvalue:=AEdit.EditingValue;
  end;  }
end;

procedure TfrmAddStandNode.Timer1Timer(Sender: TObject);
begin
//  cxTreeSandItem.SetFocus;
end;

procedure TfrmAddStandNode.cxTreeSandItemEditing(Sender: TObject;
  AColumn: TcxTreeListColumn; var Allow: Boolean);
begin
//  curColumn:=AColumn.ItemIndex;
end;

{procedure TfrmAddStandNode.UpdChildNode(curNode: TcxTreeListNode;BoolSelected: Boolean);
var i:integer;
  aNode:TcxTreeListNode;
begin
  for i:=0 to curNode.Count-1 do
  begin
    aNode:=CurNode.Items[i];
    aNode.Values[2]:=BoolSelected;
    UpdChildNode(aNode,BoolSelected);
  end;
end;  }


{procedure TfrmAddStandNode.UpdParentNode(curNode: TcxTreeListNode;BoolSelected:Boolean);
  function GetSameNodeIsSelected(aNode:TcxTreeListNode):Boolean;
  var i:integer;
    pNode:TcxTreeListNode;
  begin
    result:=False;
    pNode:=aNode.Parent;
    for i:=0 to pNode.Count-1 do
      if pNode.Items[i].Values[2] then
      begin
        result:=True;
        exit;
      end;
  end;
var parentNode:TcxTreeListNode;
begin
  parentNode:=curNode.Parent;
  if parentNode=nil then
    exit;
  if boolSelected then
  begin
    parentNode.Values[2]:=boolSelected;
    UpdParentNode(parentNode,boolSelected);
  end else
  begin
    if not GetSameNodeIsSelected(curNode) then
    begin
      parentNode.Values[2]:=False;
      UpdParentNode(parentNode,False);
    end;
  end;
end;  }

procedure TfrmAddStandNode.FormCreate(Sender: TObject);
begin
    Timer1.Enabled:=False;
    cdsStandXm.LoadFromFile('StandXm.cds');
    cdsStandXm.IndexFieldNames:='Parent;lngSort';
    CretateTree;
end;


procedure TfrmAddStandNode.cxTreeList1cxTreeListColumn2PropertiesChange(
  Sender: TObject);
var i,iTemp: integer;
  procedure updateChilds(acxTreeListNode: TcxTreeListNode;iValue: integer);
  var
    i: integer;
  begin
    if acxTreeListNode.Count=0 then exit;
    for i:= 0 to acxTreeListNode.Count-1 do
    begin
      acxTreeListNode.Items[i].Values[2]:= iValue;
      updateChilds(acxTreeListNode.Items[i],iValue);
    end;
  end;

  procedure updateParents(acxTreeListNode: TcxTreeListNode;iValue: integer);
  begin
    if acxTreeListNode.Level=-1 then exit;//root
    acxTreeListNode.Parent.Values[2]:= iValue;
    updateParents(acxTreeListNode.Parent,iValue);
  end;

begin
  cxTreeSandItem.BeginUpdate;
  cxTreeSandItem.FocusedNode.Values[2]:= (cxTreeSandItem.FocusedNode.Values[2]+1)mod 2;
  iTemp:= cxTreeSandItem.FocusedNode.Values[2];
  updateChilds(cxTreeSandItem.FocusedNode,iTemp);
  for i:= 0 to cxTreeSandItem.FocusedNode.Parent.Count-1 do
    if cxTreeSandItem.FocusedNode.Parent.Items[i].Values[2]<> iTemp then
    begin
      iTemp:= 2;
      Break;
    end;
  updateParents(cxTreeSandItem.FocusedNode,iTemp);
  cxTreeSandItem.EndUpdate;

end;

end.

⌨️ 快捷键说明

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