一个简单的帮助文档制作工具 Treeview控件

来源:互联网 发布:苹果软件授信 编辑:程序博客网 时间:2024/05/16 06:51

 

 

 

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.

原创粉丝点击