📄 entitytreeview.pas
字号:
unit ENTITYTreeView;
interface
uses
SysUtils, Classes, Controls, ComCtrls, DB, ADODB, Windows;
type
TENTITYTreeView = class(TTreeView)
private
{ Private declarations }
FADOconn: TADOConnection;
FENSort: string;
function TreeFindItem(NodeItem: TTreeNode; ID: string): TTreeNode;
procedure TreeAddFirstItem();
procedure TreeAddChildItem(ParentNode: TTreeNode);
protected
{ Protected declarations }
public
{ Public declarations }
procedure TreeAddItem(ItemList: TStrings);
procedure TreeModifyItem(ItemList: TStrings);
procedure TreeRemoveItem(); overload;
procedure TreeRemoveItem(ID: string); overload;
procedure TreeCreate();
procedure TreeLocation(ID: string);
procedure TreeMoveItem(ParentID: string; ID: string);
function GetTreeNodeID(): string; overload;
function GetTreeNodeENCode(): string; overload;
function GetTreeNodeENName(): string; overload;
function GetTreeNodeParentID(): string; overload;
function GetTreeNodeKeepTime(): string; overload;
function GetTreeNodeID(ID: string): string; overload;
function GetTreeNodeENCode(ID: string): string; overload;
function GetTreeNodeENName(ID: string): string; overload;
function GetTreeNodeParentID(ID: string): string; overload;
function GetTreeNodeKeepTime(ID: string): string; overload;
published
{ Published declarations }
property ADOconn: TADOConnection read FADOconn write FADOconn;
property ENSort: string read FENSort write FENSort;
end;
procedure Register;
implementation
type
PTNKEY = ^TTREENODEKEY;
TTREENODEKEY = record
ID: string;
ENCode: string;
ENName: string;
ParentID: string;
KeepTime: string;
end;
procedure Register;
begin
RegisterComponents('PDE', [TENTITYTreeView]);
end;
procedure TENTITYTreeView.TreeAddFirstItem();
var
NewNode: TTreeNode;
FKey: PTNKEY;
begin
New(FKey);
FKey^.ID := '0';
Self.Items.BeginUpdate;
try
NewNode := Self.items.AddObject(nil, FENSort, FKey);
NewNode.ImageIndex := 0;
NewNode.SelectedIndex := 0;
NewNode.Selected := true;
finally
Self.Items.EndUpdate;
end;
end;
procedure TENTITYTreeView.TreeAddItem(ItemList: TStrings);
var
NewNode, ThisNode: TTreeNode;
FKey: PTNKEY;
sText: string;
begin
New(FKey);
FKey^.ID := ItemList[0];
FKey^.ENCode := ItemList[1];
FKey^.ENName := ItemList[2];
FKey^.ParentID := ItemList[3];
FKey^.KeepTime := ItemList[4];
Self.Items.BeginUpdate;
try
ThisNode := TreeFindItem(nil, ItemList[3]);
if ItemList[4] = '' then
sText := ItemList[1] + ' ' + ItemList[2]
else
sText := ItemList[1] + ' ' + ItemList[2] + ' ' + ItemList[4];
if ThisNode <> nil then
begin
NewNode := Self.items.AddChildObject(ThisNode, sText, FKey);
end
else
begin
NewNode := Self.items.AddObject(nil, sText, FKey);
end;
NewNode.ImageIndex := 1;
NewNode.SelectedIndex := 1;
NewNode.Selected := true;
finally
Self.Items.EndUpdate;
end;
end;
//修改树节点
procedure TENTITYTreeView.TreeModifyItem(ItemList: TStrings);
var
FKey: PTNKEY;
sText: string;
begin
New(FKey);
FKey^.ID := ItemList[0];
FKey^.ENCode := ItemList[1];
FKey^.ENName := ItemList[2];
FKey^.ParentID := ItemList[3];
FKey^.KeepTime := ItemList[4];
Self.Items.BeginUpdate;
try
if ItemList[4] = '' then
sText := ItemList[1] + ' ' + ItemList[2]
else
sText := ItemList[1] + ' ' + ItemList[2] + ' ' + ItemList[4];
Self.Selected.Data := FKey;
Self.Selected.Text := sText;
//Self.Selected.ImageIndex:=1;
//Self.Selected.SelectedIndex:=1;
finally
Self.Items.EndUpdate;
end;
end;
//移除节点
procedure TENTITYTreeView.TreeRemoveItem();
begin
Self.Items.BeginUpdate;
try
Self.Selected.Delete;
finally
Self.Items.EndUpdate;
end;
end;
procedure TENTITYTreeView.TreeRemoveItem(ID: string);
var
STreeNode: TTreeNode;
begin
Self.Items.BeginUpdate;
try
STreeNode := TreeFindItem(nil, ID);
if not (STreeNode = nil) then
STreeNode.Delete;
finally
Self.Items.EndUpdate;
end;
end;
//创建树
procedure TENTITYTreeView.TreeCreate();
var
adoquery: TADOQuery;
itemList: TStrings;
iLoop: Integer;
strSql: string;
begin
if FENSort = '' then
Exit;
try
Self.Items.Clear;
TreeAddFirstItem;
TreeAddChildItem(Self.Items[0]);
{ itemList := TStringList.Create;
adoquery := TADOQuery.Create(self);
adoquery.Connection := FADOconn;
strSql := 'SELECT ID,C_ENTITYCODE,C_ENTITYNAME,I_PARENTID,C_KEEPTIME FROM SYS_ENTITY WHERE C_ENTITYSORTNAME = '''
+ FENSort + ''' ORDER BY I_PARENTID,C_ENTITYCODE';
adoquery.SQL.add(strSql);
adoquery.Open;
Self.Items.Clear;
TreeAddFirstItem;
while not adoquery.Eof do
begin
for iLoop := 0 to adoquery.FieldCount - 1 do
begin
itemList.Add(adoquery.Fields[iLoop].AsString);
end;
TreeAddItem(itemList);
itemList.Clear;
adoquery.Next;
end;
adoquery.Close;
adoquery.Destroy; }
if Self.Items.Count > 0 then
begin
Self.Items.Item[0].Selected := true;
Self.FullCollapse;
Self.Items.Item[0].Expand(false);
end;
except
on E: Exception do
Messagebox(self.Handle,
PAnsiChar('数据库操作失败!请检查数据连接是否正常。' + chr(10) + chr(13)
+ '详细错误信息如下:' + chr(10) + chr(13) + E.Message),
PAnsiChar('信息'), MB_OK + MB_ICONINFORMATION);
end;
end;
//移动节点
procedure TENTITYTreeView.TreeMoveItem(ParentID: string; ID: string);
begin
if ParentID = PTNKEY(TreeFindItem(nil, ID).Parent.Data)^.ID then
Exit;
TreeFindItem(nil, ID).MoveTo(TreeFindItem(nil, ParentID), naAddChild);
end;
//查找父节点
function TENTITYTreeView.TreeFindItem(NodeItem: TTreeNode; ID: string):
TTreeNode;
begin
if NodeItem = nil then
NodeItem := Self.items.getfirstnode
else
NodeItem := NodeItem.getfirstchild;
if (NodeItem <> nil) and (PTNKEY(NodeItem.Data)^.ID <> ID) then
repeat
NodeItem := NodeItem.GetNext;
until (NodeItem = nil) or (PTNKEY(NodeItem.Data)^.ID = ID);
Result := NodeItem;
end;
procedure TENTITYTreeView.TreeLocation(ID: string);
begin
TreeFindItem(nil, ID).Selected := true;
end;
//得到节点ID值
function TENTITYTreeView.GetTreeNodeID(): string;
begin
if Self.Items.Count = 0 then
Result := '0'
else
Result := PTNKEY(Self.Selected.Data)^.ID;
end;
function TENTITYTreeView.GetTreeNodeID(ID: string): string;
begin
if Self.Items.Count = 0 then
Result := '0'
else
Result := PTNKEY(TreeFindItem(nil, ID).Data)^.ID;
end;
//得到节点ENCode值
function TENTITYTreeView.GetTreeNodeENCode(): string;
begin
if Self.Items.Count = 0 then
Result := ''
else
Result := PTNKEY(Self.Selected.Data)^.ENCode;
end;
function TENTITYTreeView.GetTreeNodeENCode(ID: string): string;
begin
if Self.Items.Count = 0 then
Result := ''
else
Result := PTNKEY(TreeFindItem(nil, ID).Data)^.ENCode;
end;
//得到节点ENName值
function TENTITYTreeView.GetTreeNodeENName(): string;
begin
if Self.Items.Count = 0 then
Result := ''
else
Result := PTNKEY(Self.Selected.Data)^.ENName;
end;
function TENTITYTreeView.GetTreeNodeENName(ID: string): string;
begin
if Self.Items.Count = 0 then
Result := ''
else
Result := PTNKEY(TreeFindItem(nil, ID).Data)^.ENName;
end;
//得到节点ParentID值
function TENTITYTreeView.GetTreeNodeParentID(): string;
begin
if Self.Items.Count = 0 then
Result := ''
else
Result := PTNKEY(Self.Selected.Data)^.ParentID;
end;
function TENTITYTreeView.GetTreeNodeParentID(ID: string): string;
begin
if Self.Items.Count = 0 then
Result := ''
else
Result := PTNKEY(TreeFindItem(nil, ID).Data)^.ParentID;
end;
//得到节点KeepTime值
function TENTITYTreeView.GetTreeNodeKeepTime(): string;
begin
if Self.Items.Count = 0 then
Result := ''
else
Result := PTNKEY(Self.Selected.Data)^.KeepTime;
end;
function TENTITYTreeView.GetTreeNodeKeepTime(ID: string): string;
begin
if Self.Items.Count = 0 then
Result := ''
else
Result := PTNKEY(TreeFindItem(nil, ID).Data)^.KeepTime;
end;
procedure TENTITYTreeView.TreeAddChildItem(ParentNode: TTreeNode);
var
NewNode: TTreeNode;
FKey: PTNKEY;
sText: string;
adoquery: TADOQuery;
strSQL: string;
begin
{New(FKey);
FKey^.ID := ItemList[0];
FKey^.ENCode := ItemList[1];
FKey^.ENName := ItemList[2];
FKey^.ParentID := ItemList[3];
FKey^.KeepTime := ItemList[4];
Self.Items.BeginUpdate; }
try
//ParentNode := TreeFindItem(nil, ItemList[3]);
{if ItemList[4] = '' then
sText := ItemList[1] + ' ' + ItemList[2]
else
sText := ItemList[1] + ' ' + ItemList[2] + ' ' + ItemList[4];
if ParentNode <> nil then
begin
NewNode := Self.items.AddChildObject(ParentNode, sText, FKey);
end
else
begin
NewNode := Self.items.AddObject(nil, sText, FKey);
end; }
//获取子结点数据
adoquery := TADOQuery.Create(self);
adoquery.Connection := FADOconn;
strSql := 'SELECT ID,C_ENTITYCODE,C_ENTITYNAME,I_PARENTID,C_KEEPTIME FROM SYS_ENTITY WHERE C_ENTITYSORTNAME = '''
+ FENSort + ''' AND I_PARENTID=' + PTNKEY(ParentNode.Data).ID +
' ORDER BY I_PARENTID,C_ENTITYCODE';
adoquery.SQL.add(strSql);
adoquery.Open;
while not adoquery.Eof do
begin
New(FKey);
FKey^.ID := adoquery.FieldByName('ID').AsString; //ItemList[0];
FKey^.ENCode := adoquery.FieldByName('C_ENTITYCODE').AsString;
//ItemList[1];
FKey^.ENName := adoquery.FieldByName('C_ENTITYNAME').AsString;
//ItemList[2];
FKey^.ParentID := adoquery.FieldByName('I_PARENTID').AsString;
//ItemList[3];
FKey^.KeepTime := adoquery.FieldByName('C_KEEPTIME').AsString;
//ItemList[4];
if FKey^.KeepTime = '' then
sText := FKey^.ENCode + ' ' + FKey^.ENName
else
sText := FKey^.ENCode + ' ' + FKey^.ENName + ' ' + FKey^.KeepTime;
NewNode := Self.items.AddChildObject(ParentNode, sText, FKey);
NewNode.ImageIndex := 1;
NewNode.SelectedIndex := 1;
NewNode.Selected := true;
TreeAddChildItem(NewNode);
adoquery.Next;
end;
adoquery.Close;
adoquery.Destroy;
finally
//Self.Items.EndUpdate;
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -