📄 frmcxtreelist.pas
字号:
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 + -