zoukankan      html  css  js  c++  java
  • dxDBTreeView的结点间移动

    利用TdxDBTreeView控件(此处设为DBTreeMain)时,可以从表中直接显示出树结构,有时需要拖动对节点进行排序,而且数据表中有字段SortCode用于排序码,此时需要编写对应代码,步骤如下
    1.先设置DBTreeMain的DragMode属性为dmAutomatic
    2.设置DBTreeMain的StateIndexField属性为SortCode
    3.在其OnEndDragTreeNode事件中写入
    var
      m: TNodeAttachMode;
      oldOption: TdxDBTreeViewOptions;
      node: TdxDBTreeNode;
      bm: TBookmarkStr;
      idx: Integer;
    begin
      inherited;
      try
        frmDragOption := TfrmDragOption.Create(nil);
        if frmDragOption.ShowModal = mrOK then
        begin
          //ShowMessage('1');
          if frmDragOption.rgOption.ItemIndex = 0 then
            m := naInsert
          else
            m := naAddChild;
          AttachMode := m;
          with DBTreeMain do
          begin
            oldOption := Options;
            Options := Options - [trCanDBNavigate];
            OnCompare := nil;
            bm := qryTree.Bookmark;
            qryTree.DisableControls;
            Items.BeginUpdate;
            try
              if m = naInsert then
              begin
                node := TdxDBTreeNode(Destination);
                idx := node.ImageIndex;
                UpdateSortCode(Source, idx);
                while node <> nil do
                begin
                  Inc(idx, 10);
                  UpdateSortCode(node, idx);
                  node := TdxDBTreeNode(node.getNextSibling);
                  if node = Source then
                    Break;
                end;
              end
              else //添加子
              begin
                idx := GetChildMaxIdx(Destination) + 10;
                UpdateSortCode(Source, idx);
              end;
            finally
              Items.EndUpdate;
              Options := oldOption;
              OnCompare := DBTreeMainCompare;
              qryTree.EnableControls;
              qryTree.Bookmark := bm;
            end;
          end;
        end
        else
          //
      finally
        frmDragOption.Free;
      end;
    end;

     

    //UpdateSortCode过程
    procedure TfrmSetTree.UpdateSortCode(ANode: TTreeNode; ASortCode: Integer);
    var
      key: Variant;
    begin
      key := TdxDBTreeNode(ANode).KeyFieldValue;
      with qryTree do
      begin
        if Locate('ID', key, []) then
        begin
          Edit;
          FieldByName('SortCode').AsInteger := ASortCode;
          Post;
        end;
      end;
      ANode.ImageIndex := ASortCode;
    end;

     

    //GetChildMaxIdx过程
    function TfrmSetTree.GetChildMaxIdx(ANode: TTreeNode): Integer;
    var
      i: Integer;
    begin
      Result := 0;
      for i := 0 to ANode.Count - 1 do
      begin
        if ANode[i].ImageIndex > Result then
          Result := ANode[i].ImageIndex;
      end;
    end;

     

    4.在其OnCompare事件中写入
    procedure TfrmSetTree.DBTreeMainCompare(Sender: TObject; Node1,
      Node2: TTreeNode; Data: Integer; var Compare: Integer);
    begin
      inherited;
      if Node1.ImageIndex > Node2.ImageIndex then
        Compare := 1
      else if Node1.ImageIndex = Node2.ImageIndex then
        Compare := 0
      else
        Compare := -1;
    end;

  • 相关阅读:
    来了!GitHub for mobile 发布!iOS beta 版已来,Android 版即将发布
    五角场之殇。曾与张江、漕河泾、紫竹齐名。如今,上海四大IT科技园是否还在?
    Visual Studio Online 的 FAQ:iPad 支持、自托管环境、Web 版 VS Code、Azure 账号等
    VS Code 1.40 发布!可自行搭建 Web 版 VS Code!
    Visual Studio Online,带来四种开发模式,未来已来。
    基于七牛云对象存储,搭建一个自己专属的极简Web图床应用(手摸手的注释讲解核心部分的实现原理)
    css伪元素::before与::after使用基础示例
    gcc生成静态链接库与动态链接库步骤,并链接生成可执行文件的简单示例
    shell求水仙花数
    shell实现简单的数组排序
  • 原文地址:https://www.cnblogs.com/djcsch2001/p/2035715.html
Copyright © 2011-2022 走看看