814123 2018-07-02 11:57 采纳率: 50%
浏览 1192
已采纳

delphi Treeview的节点移动和保存节点位置?

节点移动我用NowNode.MoveTo(NowNode.getPrevSibling,naInsert);可以移动了。
但是下次打开的时候,位置又复原了。
在移动的同时怎么保存它的位置到数据库里呢?

  • 写回答

4条回答

  • threenewbee 2018-07-03 05:40
    关注
     unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, DB, ADODB, StdCtrls, ComCtrls;
    
    type
      TForm1 = class(TForm)
        TreeView1: TTreeView;
        Button1: TButton;
        Button2: TButton;
        ADOConnection1: TADOConnection;
        ADOCommand1: TADOCommand;
        ADODataSet1: TADODataSet;
        procedure FormCreate(Sender: TObject);
        procedure LoadSub(id: Integer; node: TTreeNode);
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
       PMyRc = ^TMyRc;
       TMyRc = Record
         id:Integer;
       end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    
    procedure TForm1.LoadSub(id: Integer; node: TTreeNode);
    var
      node1 : TTreeNode;
      ADOCommand2 : TADOCommand;
      ADODataSet2 : TADODataSet;
      p:PMyRc;
    begin
      ADOCommand2 := TADOCommand.Create(Self);
      ADOCommand2.Connection := ADOConnection1;
      ADOCommand2.CommandText := 'select * from table1 where parentid =' + IntToStr(id) + ' order by [order]';
      ADODataSet2 := TADODataSet.Create(Self);
      ADODataSet2.Recordset := ADOCommand2.Execute();
      while not(ADODataSet2.Eof) do
      begin
        node1 := TreeView1.Items.AddChild(node, ADODataSet2['text']);
        New(p);
        p.id:=StrToInt(ADODataSet2['id']);
        node1.Data := p;
        LoadSub(ADODataSet2['id'], node1);
        ADODataSet2.Next();
      end;
    end;
    
    procedure TForm1.FormCreate(Sender: TObject);
    var
      node : TTreeNode;
      p:PMyRc;
    begin
      ADOConnection1.Open();
      ADOCommand1.CommandText := 'select * from table1 where parentid = -1 order by [order]';
      ADODataSet1.Recordset := ADOCommand1.Execute();
      while not(ADODataSet1.Eof) do
      begin
        node := TreeView1.Items.AddChild(nil, ADODataSet1['text']);
        New(p);
        p.id:=StrToInt(ADODataSet1['id']);
        node.Data := p;
        LoadSub(ADODataSet1['id'], node);
        ADODataSet1.Next();
      end;
    end;
    
    procedure TForm1.Button1Click(Sender: TObject);
    var
      Curr : TTreeNode;
      Pre : TTreeNode;
    begin
      Curr := TreeView1.Selected;
      Pre := Curr.getPrevSibling();
      if (Pre <> nil) then
        Curr.MoveTo(Pre, naInsert);
      TreeView1.SetFocus();
    end;
    
    procedure TForm1.Button2Click(Sender: TObject);
    var
      Curr : TTreeNode;
      Pre : TTreeNode;
    begin
      Curr := TreeView1.Selected;
      Pre := Curr.getNextSibling();
      if (Pre <> nil) then
        Curr.MoveTo(Pre, naAdd);
      TreeView1.SetFocus();
    end;
    
    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    var
      i : Integer;
      p:PMyRc;
    begin
      for i := 0 to TreeView1.Items.Count - 1 do
      begin
         p := pmyrc(TreeView1.Items[i].Data);
         ADOCommand1.CommandText := 'update table1 set [order] = ' + IntToStr(i) + ' where id =' + IntToStr(p^.id);
         ADOCommand1.Execute();
      end;
    end;
    
    end.
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 mmocr的训练错误,结果全为0
  • ¥15 python的qt5界面
  • ¥15 无线电能传输系统MATLAB仿真问题
  • ¥50 如何用脚本实现输入法的热键设置
  • ¥20 我想使用一些网络协议或者部分协议也行,主要想实现类似于traceroute的一定步长内的路由拓扑功能
  • ¥30 深度学习,前后端连接
  • ¥15 孟德尔随机化结果不一致
  • ¥15 apm2.8飞控罗盘bad health,加速度计校准失败
  • ¥15 求解O-S方程的特征值问题给出边界层布拉休斯平行流的中性曲线
  • ¥15 谁有desed数据集呀