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