数据库怎么建,代码怎么写才能写出来树型目录来啊.!(主要是想能让TREEVIEW与数据 库结合)!另求代码!

解决方案 »

  1.   

    //本单元实现:
    //       1、建立ErrorTreeView与DataBase之间的关联关系;
    //       2、ErrorTreeView的Editor方式的操作;unit ErrorTree;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtCtrls, Buttons, ComCtrls,Menus;type
      TErrorTreeForm = class(TForm)
        ErrorTreeView: TTreeView;
        BitBtn1: TBitBtn;
        BitBtn2: TBitBtn;
        BitBtn4: TBitBtn;
        BitBtn6: TBitBtn;
        Image1: TImage;
        Label1: TLabel;
        LabeledEditName: TEdit;
        Label2: TLabel;
        EditCode: TEdit;
        Label3: TLabel;
        BitBtn7: TBitBtn;
        BitBtn5: TBitBtn;
        BitBtn3: TBitBtn;
        Bevel1: TBevel;
        OpenDialog1: TOpenDialog;
        SaveDialog1: TSaveDialog;
        procedure FormShow(Sender: TObject);
        procedure BitBtn1Click(Sender: TObject);
        procedure BitBtn2Click(Sender: TObject);
        procedure BitBtn3Click(Sender: TObject);
        procedure BitBtn4Click(Sender: TObject);
        procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
        procedure BitBtn5Click(Sender: TObject);
        procedure LabeledEditNameKeyUp(Sender: TObject; var Key: Word;
          Shift: TShiftState);
        procedure ErrorTreeViewChange(Sender: TObject; Node: TTreeNode);
        procedure BitBtn7Click(Sender: TObject);
        procedure BitBtn6Click(Sender: TObject);
        procedure ErrorTreeViewExpanding(Sender: TObject; Node: TTreeNode;
          var AllowExpansion: Boolean);
      private
        { Private declarations }
      public
        NewNode: TTreeNode;
          //新加Node
        function SaveTreeViewListToDatabase: Integer;
          //将树结构保存至数据库
        function GetMaxCode(SendNode: TTreeNode): Integer;
          //获得TreeView中当前同层的编号最大值
        function GetMaxCodeStr(SendNode: TTreeNode): String;
          //获得TreeView中当前同层的编号最新的字符型编号
        function GetCodeStrList(var CodeStrList: TStringList): Boolean;
          //获得索引编码列表
        function CheckExistsBool(CodeStr: String; CodeStrList: TStringList): Boolean;
          //检查数据库中是否已经存在该项
        function DataBaseClear: Boolean;
          //删除表中全部数据
        function DrawErrorTreeView: Integer;
          //从数据库中导入全部数据到TreeView
        function GetParentNodeForWrite(TierLen: Integer;
          ParentCodeStr: String; var ParentNode: TTreeNode): Integer;
          //为数据的写入从TreeView中找出父层节点
        { Public declarations }
      end;var
      ErrorTreeForm: TErrorTreeForm;
      function GetTreeViewMaxTierFromDatabase: Integer;
          //从数据表中获得TreeView的最大层数
      function GetParentCodeStr(CodeStr: String): string;
          //获得父节点的编号implementationuses DataModF;
    {$R *.dfm}procedure TErrorTreeForm.FormShow(Sender: TObject);
    begin
      NewNode:= TTreeNode.Create(Nil);
      DrawErrorTreeView;
      NewNode:= Nil;                         // 初始化NewNode
    end;procedure TErrorTreeForm.BitBtn1Click(Sender: TObject);  //建同级目录
    var
      CurNode: TTreeNode;
      MaxCodeStr: String;
    begin
      LabeledEditName.Text:= '';
      EditCode.Text:= '';
      MaxCodeStr:= GetMaxCodeStr(NewNode);
      if ErrorTreeView.Selected<> nil then
      begin
        CurNode:= ErrorTreeView.Selected;
        NewNode:= ErrorTreeView.Items.AddChild(CurNode.Parent,MaxCodeStr);
      end
      else
        NewNode:= ErrorTreeView.Items.AddChild(nil,MaxCodeStr);
      NewNode.Selected:= True;
      EditCode.Text:= MaxCodeStr;
      LabeledEditName.SetFocus;
    end;procedure TErrorTreeForm.BitBtn2Click(Sender: TObject);  //建下级目录
    var
      CurNode: TTreeNode;
      MaxCodeStr: String;
    begin
      LabeledEditName.Text:= '';
      EditCode.Text:= '';
      if ErrorTreeView.Selected= nil then Exit;
      CurNode:= ErrorTreeView.Selected;
      NewNode:= ErrorTreeView.Items.AddChild(CurNode,'');
      CurNode.Expand(True);
      NewNode.Selected:= True;
      MaxCodeStr:= GetMaxCodeStr(NewNode);
      MaxCodeStr:= Copy(MaxCodeStr,1,Length(MaxCodeStr)-1)+IntToStr(StrToInt(Copy(MaxCodeStr,Length(MaxCodeStr),1))-1);
        //最后一位减一
      NewNode.Text:= MaxCodeStr;
      EditCode.Text:= MaxCodeStr;
      LabeledEditName.SetFocus;
    end;procedure TErrorTreeForm.BitBtn3Click(Sender: TObject);
    begin
      Close;
    end;procedure TErrorTreeForm.BitBtn4Click(Sender: TObject);
    var
      CurNode,TempNode: TTreeNode;
    begin
      if Application.MessageBox('确认删除吗?','警告',MB_ICONWARNING+MB_YESNO)<>mrYES then Exit;
      LabeledEditName.Text:= '';
      if ErrorTreeView.Selected= nil then Exit;
      CurNode:= ErrorTreeView.Selected;
      if not CurNode.IsFirstNode then           //删除前移动焦点,默认前移
        TempNode:= CurNode.GetPrev
      else
        TempNode:= CurNode.GetNext;
      CurNode.Delete;
      NewNode:= TempNode;
    end;procedure TErrorTreeForm.FormCloseQuery(Sender: TObject;
      var CanClose: Boolean);
    begin
      NewNode.Free;         //关闭时释放资源
    end;procedure TErrorTreeForm.BitBtn5Click(Sender: TObject);
    begin
      if SaveTreeViewListToDatabase = 0 then
        Close
      else
        Application.MessageBox('数据保存时出错!','错误',MB_ICONWARNING+MB_OK);
    end;procedure TErrorTreeForm.LabeledEditNameKeyUp(Sender: TObject;
      var Key: Word; Shift: TShiftState);
    begin
      if NewNode = nil then Exit;
      NewNode.Text:= EditCode.Text + '_' + LabeledEditName.Text;     //输入时TreeView同时更新
      if key = 13 then                         //回车时TreeView设置焦点
      begin
        NewNode.Selected:= True;
        ErrorTreeView.SetFocus;
      end;
    end;procedure TErrorTreeForm.ErrorTreeViewChange(Sender: TObject;
      Node: TTreeNode);
    begin
      if ErrorTreeView.Selected= nil then Exit;
      NewNode:= ErrorTreeView.Selected;
      LabeledEditName.Text:= Copy(NewNode.Text,(NewNode.Level+1)*2+2,Length(NewNode.Text)-(NewNode.Level+1)*2+1);
      EditCode.Text:= Copy(NewNode.Text,1,(NewNode.Level+1)*2);
      LabeledEditName.SetFocus;
    end;function TErrorTreeForm.SaveTreeViewListToDatabase: Integer;
    var
      CurNode: TTreeNode;
      i,j: Integer;
      NodeLevel: Integer;
      CodeStr, ErrorName, NodeTxt,S: String;
      CodeStrList: TStringList;
    begin
      Result:= 0;
      CodeStrList:= TStringList.Create;
      try
       try
        GetCodeStrList(CodeStrList);
        with ErrorTreeView do
        begin
          CurNode:= Items.GetFirstNode;
          DataBaseClear;
          for i:= 0 to items.Count-1 do
          begin
            NodeLevel:= CurNode.Level;
            NodeTxt:= CurNode.Text;
            CodeStr:= Copy(NodeTxt,1,(NodeLevel+1)*2);
            ErrorName:= Copy(NodeTxt,(NodeLevel+1)*2+2,Length(NodeTxt));
            S:= 'insert ErrorName (故障名称id,故障名称) values('''+CodeStr+''','''+ErrorName+''')';
            with  DataMod.QryErrorName do
            begin
              Close;
              SQL.Clear;
              SQL.Add(s);
              Prepare;
              ExecSQL;
            end;
            CurNode:= CurNode.GetNext;
          end;
        end;
       finally
        CodeStrList.Free;
       end;
      except
       Result:= 1;
      end;
    end;function TErrorTreeForm.GetMaxCode(SendNode: TTreeNode): Integer;
    var
      TempNode: TTreeNode;
      i: integer;
    begin
      if SendNode = Nil then
      begin
        Result:= 0;
        Exit;
      end;
      i:=0;
      if SendNode.Parent<>nil then
        TempNode:= SendNode.Parent.getFirstChild
      else
        TempNode:= ErrorTreeView.Items.GetFirstNode;  
      Repeat
        TempNode:= TempNode.getNextSibling;
        i:= i+1;
      until
        TempNode = nil;
      Result:= i;
    end;function TErrorTreeForm.GetMaxCodeStr(SendNode: TTreeNode): String;
    var
      MaxCode: Integer;
      ParentCodeStr: String;
    begin
      MaxCode:= GetMaxCode(SendNode) + 1;
      if (SendNode <> nil) and (SendNode.Parent <> Nil) then
        ParentCodeStr:= Copy(SendNode.Parent.Text,1,(SendNode.Parent.Level+1)*2)
      else
        ParentCodeStr:='';
      if MaxCode < 10 then
        Result:= ParentCodeStr + '0'+IntToStr(MaxCode)
      else
        Result:= ParentCodeStr + IntToStr(MaxCode);
    end;
      

  2.   

    function TErrorTreeForm.GetCodeStrList(
      var CodeStrList: TStringList): Boolean;
    begin
      Result:= True;
     try
      CodeStrList.Clear;
      with DataMod.QryErrorName do
      begin
        Close;
        SQL.Clear;
        SQL.Add('select 故障名称id from errorname');
        Prepare;
        Open;
        while not eof do
        begin
          CodeStrList.Add(FieldByName('故障名称id').AsString);
          Next;
        end;
      end;
     except
      Result:= False;
     end;
    end;function TErrorTreeForm.CheckExistsBool(CodeStr: String;
      CodeStrList: TStringList): Boolean;
    var
      i: Integer;
    begin
      Result:= False;
      for i:= 0 to CodeStrList.Count-1 do
        if CodeStrList[i]=CodeStr then
        begin
          Result:= True;
          Break;
        end;
    end;procedure TErrorTreeForm.BitBtn7Click(Sender: TObject);
    var
      txtFileName: TFileName;
    begin
      SaveDialog1.Filter:= '文本文件(*.txt)|*.txt';
      if SaveDialog1.Execute then
      begin
        txtFileName:= SaveDialog1.FileName;
        try
          if not FileExists(txtFileName) then
            FileClose(FileCreate(txtFileName));
          ErrorTreeView.SaveToFile(txtFileName);
        except
          Application.MessageBox(Pchar('保存失败,请确认路径是否正确?'+#13#10+txtFileName),'错误',MB_ICONWARNING+MB_OK);
          Exit;
        end;
          Application.MessageBox(Pchar('文件保存成功!'+#13#10+txtFileName),'提示',MB_ICONWARNING+MB_OK);
      end;
    end;procedure TErrorTreeForm.BitBtn6Click(Sender: TObject);
    var
      txtFileName: TFileName;
    begin
      OpenDialog1.Filter:= '文本文件(*.txt)|*.txt';
      if OpenDialog1.Execute then
      begin
        txtFileName:= OpenDialog1.FileName;
        try
          ErrorTreeView.Items.Clear;
          ErrorTreeView.LoadFromFile(txtFileName);
        except
          Application.MessageBox(Pchar('导入错误,请确认该文件是否有效?'+#13#10+txtFileName),'错误',MB_ICONWARNING+MB_OK);
          Exit;
        end;
          Application.MessageBox(Pchar('导入成功!'+#13#10+txtFileName),'提示',MB_ICONWARNING+MB_OK);
      end;
    end;function TErrorTreeForm.DataBaseClear: Boolean;
    begin
     try
      with DataMod.QryErrorName do
      begin
        Close;
        SQL.Clear;
        SQL.Add('delete from errorname');
        Prepare;
        ExecSQL;
      end;
     except
      Result:= False;
      Exit;
     end;
      Result:= True;
    end;function TErrorTreeForm.DrawErrorTreeView: Integer;
    var
      MaxCodeLen,TierLen: Integer;
      CodeStr,ParentCodeStr: String;
      ParentNode: TTreeNode;
    begin
      Result:= 0;
      try
        MaxCodeLen:= GetTreeViewMaxTierFromDatabase;
        for TierLen:=1 to MaxCodeLen do
        begin
          with DataMod.QryErrorName do
          begin
          Close;
          SQL.Clear;
          SQL.Add('select 故障名称id,故障名称 from ErrorName ');
          SQL.Add('where len(故障名称id)='+IntToStr(TierLen*2));
          Prepare;
          Open;
    //      showmessage(inttostr(recordcount));
          while Not Eof do
          begin
            CodeStr:= FieldByName('故障名称id').AsString;
            ParentCodeStr:= GetParentCodeStr(CodeStr);
            GetParentNodeForWrite(TierLen,ParentCodeStr,ParentNode);
            ErrorTreeView.Items.AddChild(ParentNode,CodeStr+'_'+FieldByName('故障名称').AsString);
            Next;
          end;
          end;
        end;
      except
        Result:= 1;
      end;
    end;procedure TErrorTreeForm.ErrorTreeViewExpanding(Sender: TObject;
      Node: TTreeNode; var AllowExpansion: Boolean);
    begin
    //  if Node=nil then Exit;
    //  TreeViewExpend(Node);
    end;function TErrorTreeForm.GetParentNodeForWrite(TierLen: Integer;
      ParentCodeStr: String; var ParentNode: TTreeNode): Integer;
    var
      TempNode: TTreeNode;
      i: Integer;
    begin
      Result:= 0;
      with ErrorTreeView do
      begin
        TempNode:= Items.GetFirstNode;
        for i:= 0 to Items.Count-1 do
        begin
          if TempNode = nil then Break;
          if Copy(TempNode.Text,1,(TierLen-1)*2)='' then Break;  //检测是否为第一层
          if Copy(TempNode.Text,1,(TierLen-1)*2)=ParentCodeStr then
          begin
            ParentNode:= TempNode;
            Exit;
          end;
          TempNode:= TempNode.GetNext;
        end; 
        ParentNode:= Nil;
      end;
    end;function GetTreeViewMaxTierFromDatabase: Integer;
    begin
      with DataMod.QryErrorName do
      begin
        Close;
        SQL.Clear;
        SQL.Add('select maxlen=max(len(故障名称id)) from errorname');
        Prepare;
        Open;
        Result:= FieldByName('maxlen').AsInteger div 2;
      end;
    end;function GetParentCodeStr(CodeStr: String): string;
    begin
      Result:= Copy(CodeStr,1,Length(CodeStr)-2);
    end;end.