要增加兄弟节点和子节点,代码是什么样的啊?

解决方案 »

  1.   

    nit Base_Sele_Unit;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, Base_Unit, BusinessSkinForm, dxExEdtr, bsSkinCtrls, ExtCtrls,
      dxCntner, dxTL, dxDBCtrl, dxDBTL, kbmMemTable, DB, ADODB, Grids, DBGrids;type
      TBase_Sele_Frm = class(Tbase_Frm)
        bsSkinPanel1: TbsSkinPanel;
        bsSkinPanel2: TbsSkinPanel;
        LeftTV: TdxDBTreeList;
        RightTV: TdxDBTreeList;
        CenterTV: TdxDBTreeList;
        Splitter1: TSplitter;
        Splitter2: TSplitter;
        bsSkinButton2: TbsSkinButton;
        leftADS: TADODataSet;
        RightADS: TADODataSet;
        bsSkinPanel3: TbsSkinPanel;
        bsSkinButton3: TbsSkinButton;
        bsSkinButton4: TbsSkinButton;
        CenterADS: TADODataSet;
        DataSource1: TDataSource;
        DataSource2: TDataSource;
        DataSource3: TDataSource;
        bsSkinButton1: TbsSkinButton;
        procedure bsSkinButton4Click(Sender: TObject);
        procedure leftADSAfterScroll(DataSet: TDataSet);
        procedure bsSkinButton3Click(Sender: TObject);
        procedure bsSkinButton2Click(Sender: TObject);
        procedure bsSkinButton1Click(Sender: TObject);
        procedure Splitter1Moved(Sender: TObject);
        procedure Splitter2Moved(Sender: TObject);
        procedure FormResize(Sender: TObject);
        procedure LeftTVGetImageIndex(Sender: TObject; Node: TdxTreeListNode;
          var Index: Integer);
        procedure LeftTVGetSelectedIndex(Sender: TObject;
          Node: TdxTreeListNode; var Index: Integer);
        procedure CenterTVDragOver(Sender, Source: TObject; X, Y: Integer;
          State: TDragState; var Accept: Boolean);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
      private
        LeftFld , RightFld,CenterTab : string;
        SQLLeft, SQLCenter, SQLRight : string;
        SaveFld : string;
        //改变GRID的宽度
        procedure ChangeColWidth;    procedure OpenData;
        procedure loadGrid;
        procedure AddSelNode(node : TDXTreeListNode);
        procedure RemoveSelNode;
        procedure SaveDB;
        procedure SaveCenterDB;
      protected    procedure ListData(SQLLeft1, SQLCenter1, SQLRight1 ,LeftFld1,RightFld1,CenterTab1: string);
        procedure ListCenterGrid(fld ,fldCaption,fldWidth : string);
        procedure SetSaveFld(SaveFld1 : string);
      public
        { Public declarations }
      end;var
      Base_Sele_Frm: TBase_Sele_Frm;implementationuses SysPublic, DM_Unit;{$R *.dfm}{ TBase_Sele_Frm }procedure TBase_Sele_Frm.AddSelNode(node : TDXTreeListNode);
    var
      bm : TBookMark;
      procedure AddToCenterTV;
      begin
        CenterADS.Append;
        CenterADS.FieldByName(LeftFld).AsInteger  := LeftADS.FieldByName('id').asInteger;
        CenterADS.FieldByName(RightFld).AsInteger := RightADS.FieldByName('id').asInteger;
        CenterADS.fieldbyName('ID').AsInteger     := getTabID(CenterTab);
        CenterADS.FieldByName('RName').AsString   := RightADS.fieldbyName('name').asString;
        CenterADS.Post;
      end;
      function LoateFilter(iID : integer ) : boolean;
      var
        bm : TBookMark;
      begin
        result := False;
        CenterADS.First;
        bm := CenterADS.GetBook;
        CenterADS.DisableControls;
        while not CenterADS.Eof do
        begin
          if CenterADS.FieldByName(RightFld).AsInteger = RightADS.fieldByName('id').asInteger then
          begin
            result := True;
            CenterADS.GotoBook(bm);
            break;
          end;
          CenterADS.Next;
        end;
        CenterADS.EnableControls;
        CenterADS.FreeBook(bm);  end;
    begin
      if LeftTV.FocusedNode.HasChildren then
      begin
        ShowMsg('请选中左边树的子节点!');
        exit;
      end;  if node <> nil then
      begin
        if not node.HasChildren then
        begin
          if CenterADS.IsEmpty then
            AddToCenterTV
          else
          begin
              if not LoateFilter(RightADS.fieldByName('id').asInteger) then
              //if not CenterADS.Locate((leftFld+';'+RightFld), vararrayof([LeftADS.FieldByName('id').AsInteger,RightADS.FieldByName('id').AsInteger]),[loCaseInsensitive]) then
              //if not CenterADS.Locate(LeftFld,RightADS.FieldByName('id').asInteger,[loCaseInsensitive]) then
             // if not CenterADS.Locate(LeftFld,RightADS.FieldByName('id').asInteger,[loCaseInsensitive]) then
              AddToCenterTV
            else
              ShowMsg('已选择此节点!');
            end;
        end
        else
        begin
          ShowMsg('请选择右边树的明细节点!');
          {RightADS.DisableControls;
          bm := RightADS.GetBook;      RightADS.GotoBook(bm);
          RightADS.EnableControls;}
        end;
      end;end;procedure TBase_Sele_Frm.ListData(SQLLeft1, SQLCenter1, SQLRight1 ,LeftFld1,RightFld1,CenterTab1: string);
    begin
      SQLLeft   := SQLLeft1;
      SQLCenter := SQLCenter1;
      SQLRight  := SQLRight1;
      LeftFld   := LeftFld1;
      RightFld  := RightFld1;
      CenterTab := CenterTab1;
      OpenData;
      LoadGrid;
    end;
      

  2.   

    procedure TBase_Sele_Frm.OpenData;
    begin
      OpenDataSet(LeftADS   ,SQLLeft);
      OpenDataSet(RightADS  ,SQLRight);
      OpenDataSet(CenterADS ,SQLCenter);
    end;procedure TBase_Sele_Frm.RemoveSelNode;
    beginend;procedure TBase_Sele_Frm.bsSkinButton4Click(Sender: TObject);begin
      inherited;
      if CenterADS.IsEmpty then exit;
      if ShowAskMsg('确认删除此项记录吗?') = idOK then
        CenterADS.Delete;end;procedure TBase_Sele_Frm.leftADSAfterScroll(DataSet: TDataSet);
    begin
      inherited;
    {  if CenterADS.State <> dsBrowse then
      begin
        if ShowASKMsg('数据已经修改,是否保存?') = idOk then
          SaveCenterDB;
      end;}  if CenterADS.Filtered then
        CenterADS.Filtered := False;
      CenterADS.Filter := LeftFld + ' = '+ LeftADS.fieldbyName('id').asString;
      CenterADS.Filtered := True;end;procedure TBase_Sele_Frm.SaveCenterDB;
    beginend;procedure TBase_Sele_Frm.loadGrid;
    begin
      //读取左边的树
      StrToTreeField(LeftTV,'name','名称','100');  LeftTv.KeyField := 'ID';  if LeftADS.FieldByName('parent') <> nil then
        LeftTV.ParentField := 'parent';  //读取右边的树
      StrToTreeField(RightTV,'name','名称','100');  RightTv.KeyField := 'ID';
      if RightADS.FieldByName('parent') <> nil then
        RightTV.ParentField := 'parent';
      ChangeColWidth;    
    end;procedure TBase_Sele_Frm.ListCenterGrid(fld, fldCaption,fldWidth: string);
    begin
      StrToTreeField(CenterTV,fld,fldCaption,'100');
      CenterTV.KeyField := 'ID';
      CenterTV.ParentField := 'ID';
      CenterADS.Recordset.Properties.Item['Unique Table'].Value := CenterTab;
      ChangeColWidth;
    end;procedure TBase_Sele_Frm.bsSkinButton3Click(Sender: TObject);
    begin
      inherited;
      AddSelNode(RightTV.FocusedNode);
    end;procedure TBase_Sele_Frm.bsSkinButton2Click(Sender: TObject);
    begin
      inherited;
      close;
    end;procedure TBase_Sele_Frm.SaveDB;
    var
      i : integer;
      iFldCount : integer;
      tmpADS : TAdoDataSet;
      sFldName : string;
    begin
      CenterADS.First;
      iFldCount := GetCommaStrCount(SaveFld);
      tmpADS := TAdoDataSet.Create(nil);
      OpenDataSet(tmpADS, 'select * from ' + CenterTab);
      //如果有这个编号,则修改,否则新增
      while not CenterADS.Eof do
      begin
        if tmpADS.Locate('id', CenterADS.FieldByName('id').asInteger,[]) then
          tmpADS.Edit
        else
          tmpADS.Append;
        for i := 1 to iFldCount do
        begin
          sFldName := GetCommaStr(SaveFld,i);
          tmpADS.FieldByName(sFldName).Value := CenterADS.FieldByName(sFldName).Value;
        end;
        tmpADS.Post;
        CenterADS.Next;
      end;
    end;procedure TBase_Sele_Frm.SetSaveFld(SaveFld1: string);
    begin
      SaveFld := SaveFld1;
    end;procedure TBase_Sele_Frm.bsSkinButton1Click(Sender: TObject);
    begin
      inherited;
      SaveDB;
    end;procedure TBase_Sele_Frm.ChangeColWidth;
    var
      i, iWid : integer;
    begin
      LeftTV.ColumnByFieldName('name').Width := LeftTV.Width - 5;
      RightTV.ColumnByFieldName('name').Width := RightTV.Width - 5;  iWid := 0;
      if CenterTV.ColumnCount < 1 then exit;
      for i := 0 to CenterTV.ColumnCount - 1 do
      begin
        iWid := iWid + CenterTV.Columns[i].Width;
      end;  //if iWid < CenterTV.Width - 5 then
      CenterTV.columns[CenterTV.ColumnCount - 1].Width := CenterTV.columns[CenterTV.ColumnCount - 1].Width + (CenterTV.Width - 5 - iWid)
      //else
    end;procedure TBase_Sele_Frm.Splitter1Moved(Sender: TObject);
    begin
      inherited;
      ChangeColWidth;
    end;procedure TBase_Sele_Frm.Splitter2Moved(Sender: TObject);
    begin
      inherited;
      ChangeColWidth;
    end;procedure TBase_Sele_Frm.FormResize(Sender: TObject);
    begin
      inherited;
      ChangeColWidth;
    end;procedure TBase_Sele_Frm.LeftTVGetImageIndex(Sender: TObject;
      Node: TdxTreeListNode; var Index: Integer);
    const
      ImagesIndex: array[Boolean] of Integer = (16, 17);
    begin
      inherited;
      if Node.HasChildren then
        Index := ImagesIndex[Node.Expanded]
      else
        Index := 16;
    end;procedure TBase_Sele_Frm.LeftTVGetSelectedIndex(Sender: TObject;
      Node: TdxTreeListNode; var Index: Integer);
    const
      ImagesIndex: array[Boolean] of Integer = (16, 17);
    begin
      inherited;
      if Node.HasChildren then
        Index := ImagesIndex[Node.Expanded]
      else
        Index := 16;
    end;procedure TBase_Sele_Frm.CenterTVDragOver(Sender, Source: TObject; X,
      Y: Integer; State: TDragState; var Accept: Boolean);
    begin
      inherited;
     // exit;
      if Source.ClassType = TdxDBTreeList then
      begin
        if not TdxDBTreeList(Source).DragNode.HasChildren then
        begin
          AddSelNode(RightTV.DragNode);
          Accept := True;
        end;
      end;
    end;procedure TBase_Sele_Frm.FormClose(Sender: TObject;
      var Action: TCloseAction);
    begin
      inherited;
      leftADS.Active   := False;
      RightADS.Active  := False;
      CenterADS.Active := False;
    end;end.