📄 uaddstandnode.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 + -