unit UnitOperationDoc;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, ExtCtrls, StdCtrls, ImgList, Menus, UnitCommon,
UnitCommonDM, DBClient;
type
NodeOperation= ^NodeStr; //用于存放节点字符串集
NodeStr = record
iID: Integer; //业务编号
iNodeLevel: Integer; //结点级别
sIsValid:String; //有效标记
iParent_ID: Integer; //父节点
end;
TfrmOperationDoc = class(TForm)
Panel1: TPanel;
StatusBar1: TStatusBar;
TV1: TTreeView;
Panel2: TPanel;
edtTitle: TEdit;
Label1: TLabel;
memoContent: TMemo;
BtnSave: TButton;
BtnCancel: TButton;
btnDelete: TButton;
BtnRefresh: TButton;
btnAdd: TButton;
ImageList1: TImageList;
PopMenu: TPopupMenu;
popAdd: TMenuItem;
N2: TMenuItem;
popModify: TMenuItem;
popDelete: TMenuItem;
N5: TMenuItem;
popRefresh: TMenuItem;
popRename: TMenuItem;
procedure BtnCancelClick(Sender: TObject);
procedure btnAddClick(Sender: TObject);
procedure btnDeleteClick(Sender: TObject);
procedure popAddClick(Sender: TObject);
procedure BtnSaveClick(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure BtnRefreshClick(Sender: TObject);
procedure TV1Click(Sender: TObject);
procedure popModifyClick(Sender: TObject);
procedure popDeleteClick(Sender: TObject);
procedure popRenameClick(Sender: TObject);
procedure popRefreshClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
function SaveOperation(oNode:TTreeNode):Boolean; //保存节点信息
function BuildTree(oDataSet:TClientDataSet;
oTreeView: TTreeView): Boolean; //创建树结构
function GetContent(iID: Integer):String; //根据 ID 得到内容
function AddNode(oTV:TTreeView; sTitle:String) : Boolean; //添加节点
function DeleteNode(iID: Integer):Boolean; //删除指定的 ID 节点
end;
var
frmOperationDoc: TfrmOperationDoc;
iOperationCount: Integer; //记录当前数据记录总数
implementation
{$R *.dfm}
procedure TfrmOperationDoc.BtnCancelClick(Sender: TObject);
begin
Close;
end;
procedure TfrmOperationDoc.btnAddClick(Sender: TObject);
begin
AddNode(TV1, edtTitle.Text );
btnSave.Enabled := True;
end;
procedure TfrmOperationDoc.btnDeleteClick(Sender: TObject);
var
iId : Integer;
begin
if MessageBox(Self.Handle,'确定要删除吗(Y/N)?','系统提示',MB_YESNO) = IDYES then
begin
try
iId := NodeOperation(Tv1.Selected.Data)^.iID;
except
iID := -1;
end;
if Tv1.Selected.Level=0 then
ShowMessage('根节点不能删除!')
else if Tv1.selected.HasChildren=true then
showmessage('该节点存在子节点,请删除全部子节点后再删除')
else
begin
if DeleteNode(iId) then
Tv1.selected.Delete;
end;
end;
end;
procedure TfrmOperationDoc.popAddClick(Sender: TObject);
begin
btnAddClick(Self);
end;
function TfrmOperationDoc.SaveOperation( oNode: TTreeNode): Boolean;
var
sSQL, sID: String;
begin
try
sID := IntToStr(NodeOperation(oNode.Data)^.iID);
except
sID := '-1';
end;
sSQL :='select * from ' + USER_TB_OPERATION
+ ' where id='+ sID;
OpenSQL(DMcommon.ClientDataSet2, sSQL);
edtTitle.Text := StringReplace(edtTitle.Text,'''', '‘',[rfReplaceAll]); //替换出现的,号以免保存时出错
memoContent.Text := StringReplace(memoContent.Text ,'''', '‘',[rfReplaceAll]);
if(DMcommon.ClientDataSet2.RecordCount = 0) then
begin
sSQL :='insert into ' + USER_TB_OPERATION + '(ID,Title,Content,NodeLevel,IsValid,Parent_ID,Memo)'
+ 'Values(' + USER_TB_OPERATION_ID + '.nextval,'''
+ edtTitle.Text + ''',''' + Trim(memoContent.Text) +''','
+ IntToStr(oNode.Level) + ',''' + '1' + ''','
+ IntToStr(NodeOperation(oNode.Parent.Data)^.iID) + ','''+ '-' +''')';
ExecuteSQL(DMcommon.ClientDataSet2, sSQL);
end
else
begin
sSQL :='update ' + USER_TB_OPERATION + ' set Title ='''+edtTitle.Text+''',Content='''
+ Trim(memoContent.Text) + ''', Isvalid =''' + '1' +''','
+ ' Parent_ID =' + IntToStr(NodeOperation(oNode.Parent.Data)^.iID) + ','
+ ' NodeLevel =' + IntToStr(oNode.Level)
+ ' Where ID =' + sID;
ExecuteSQL(DMcommon.ClientDataSet2, sSQL);
end;
sSQL :='select * from ' + USER_TB_OPERATION + ' order by ID';
OpenSql(DMcommon.ClientDataSet2,sSQL);
Result := True;
end;
procedure TfrmOperationDoc.BtnSaveClick(Sender: TObject);
begin
{
try
ShowMessage('ID=' + IntToStr(NodeOperation(TV1.Selected.Data)^.iID)+
',Parent_ID=' + IntToStr(NodeOperation(TV1.Selected.Data)^.iParent_ID));
except
end;
}
SaveOperation(Tv1.Selected);
BtnRefreshClick(Self);
btnSave.Enabled := False;
end;
function TfrmOperationDoc.BuildTree(oDataSet:TClientDataSet;
oTreeView: TTreeView): Boolean; //Build tree
var
i, id, parent_id, iLevel:Integer;
sTitle, sSQL, sIsValid :String;
Node1 :TTreeNode;
p: NodeOperation;
begin
Result:=False;
sSql := 'Select ID,Title,NodeLevel,IsValid,Parent_ID from '
+ USER_TB_OPERATION
+ ' order by ID';
DMcommon.sCommonSQL :=sSql;
oTreeView.Items.Clear ;
try
with oDataSet do
begin
Close;
Open;
iOperationCount := RecordCount;
while Not Eof do
begin
id :=User_GetFiledName(oDataSet, 'ID');
sTitle :=User_GetFiledName(oDataSet, 'Title');
iLevel :=User_GetFiledName(oDataSet, 'NodeLevel');
sIsValid :=User_GetFiledName(oDataSet, 'IsValid');
parent_id :=User_GetFiledName(oDataSet, 'Parent_ID');
New(P);
P^.iID := id;
P^.iNodeLevel := iLevel;
P^.sIsValid := sIsValid;
P^.iParent_ID := parent_id;
if parent_id = -1 then
begin
Node1 := oTreeView.Items.Add(nil,sTitle);
Node1.Data := P;
end else
begin
for i:=0 to oTreeView.Items.Count -1 do
begin
if NodeOperation(oTreeView.Items[i].Data)^.iID = parent_id then
begin
Node1:=oTreeView.Items.AddChild(oTreeView.Items[i],sTitle);
Node1.Data :=P;
end;
end;
//Node1 := oTreeView.Items.AddChild(oTreeView.Items[parent_id],sTitle);
//Node1.Data := P;
end;
//Dispose(P);
Next;
end;
Close;
end;
except
begin
ShowMessage('Building TreeView error!');
Exit;
end;
Result:=True;
end;
end;
procedure TfrmOperationDoc.FormShow(Sender: TObject);
begin
BuildTree(DMcommon.ClientDataSet2, TV1); //创建树结构
StatusBar1.Panels[0].Text := '当前用户:' + gCurrentUser;
StatusBar1.Panels[1].Text := '当前记录条数为:' + IntToStr(iOperationCount);
end;
procedure TfrmOperationDoc.BtnRefreshClick(Sender: TObject);
begin
BuildTree(DMcommon.ClientDataSet2, TV1); //刷新树结构
end;
procedure TfrmOperationDoc.TV1Click(Sender: TObject);
begin
if TV1.Selected.Selected then
begin
edtTitle.Text := TV1.Selected.Text ;
{
ShowMessage('Parent Node Text=' + TV1.Selected.Parent.Text + ',Parent Node ID='
+ IntToStr(NodeOperation(TV1.Selected.Parent.Data)^.iID)+ chr(13) +chr(10)
+'Node Text=' + TV1.Selected.Text + ',Node ID='
+ IntToStr(NodeOperation(TV1.Selected.Data)^.iID));
}
try
memoContent.Text := GetContent(NodeOperation(TV1.Selected.Data)^.iID);
except
memoContent.Text := '';
end;
end;
btnSave.Enabled := True;
end;
function TfrmOperationDoc.GetContent(iID: Integer):String; //根据 ID 得到内容
var
sSQL, sID: String;
begin
sID := IntToStr(iID);
sSQL :='select * from ' + USER_TB_OPERATION
+ ' where id='+ sID;
OpenSQL(DMcommon.ClientDataSet2, sSQL);
Result := User_GetFiledName(DMcommon.ClientDataSet2, 'Content');
end;
function TfrmOperationDoc.AddNode(oTV:TTreeView; sTitle:String) : Boolean;
var
iCount, iChildNodesCount:integer;
bChkRepeat:Boolean; //检查是否有名称重复
MyNode:TTreeNode;
p: NodeOperation;
begin
iCount:=0;
bChkRepeat := False;
iChildNodesCount := oTV.Selected.Count; //得到所选节点子节点数量
MyNode := oTV.Selected;
while iCount < iChildNodesCount do
begin
if oTV.Selected.Item[iCount].Text= sTitle then
begin
ShowMessage('编码重复!');
bChkRepeat := True;
edtTitle.SetFocus;
end;
iCount:=iCount + 1;
end;
if Not bChkRepeat then
begin
sTitle := '新建节点';
new(P);
P^.iID := 0;
MyNode := oTV.Items.AddChild(MyNode,sTitle);
MyNode.Data := P;
end;
Result := True;
end;
function TfrmOperationDoc.DeleteNode(iID: Integer):Boolean; //删除指定的 ID 节点
var
sSQL, sID: String;
begin
sID := IntToStr(iID);
sSQL :='Delete from ' + USER_TB_OPERATION
+ ' where id='+ sID;
ExecuteSQL(DMcommon.ClientDataSet2, sSQL);
Result := True;
end;
procedure TfrmOperationDoc.popModifyClick(Sender: TObject);
begin
edtTitle.Enabled := True;
memoContent.Enabled := True;
end;
procedure TfrmOperationDoc.popDeleteClick(Sender: TObject);
begin
btnDeleteClick(Sender);
end;
procedure TfrmOperationDoc.popRenameClick(Sender: TObject);
begin
Tv1.Selected.EditText ;
end;
procedure TfrmOperationDoc.popRefreshClick(Sender: TObject);
begin
BtnRefreshClick(Sender);
end;
end.