zoukankan      html  css  js  c++  java
  • TTreeView TTreeNodes TTreeNode

    TTreeView

    填写 TTreeView 的内容一般是这样开始的(下图), 不过我觉得最好习惯用动态建立.


    TTreeView - 宜凌 - Delphi天空



    打个比方: 譬如 TreeView 是一个军营的"营部"! 这里会有营长、连长、排长、班长、战士等等.

    我们把它们分成三种对象: 营部、营长(总当家)、营长的下属.

    在这里的对应关系是:
    TTreeView - 营部
    TTreeNodes - 营长
    TTreeNode - 营长的下属

    上面的例子中的"营长"不是具体的哪个元素, 他代表着全营, 很多事情都是他说了算;
    其他成员都是"营长"的兵.

    换成 Delphi 的说法:TTreeView 不过是一个包含元素的框架, 最重要的是里面的元素;
    每一个元素都是一个 TTreeNode 对象;
    所有对象的集合也是一个对象: TTreeNodes, TTreeNodes 就像那个"营长"是个幕后管理者, 它对属下的所有成员有生杀大权.

    学习 TreeView 要面对的不仅仅是 TTreeView 类, 更重要的是 TTreeNodes 和 TTreeNode 类.

    TreeView1.Items 属性就是 TreeView1 的 TTreeNodes.

    先做这样一个例子: 按照同样的编制, 再建一个营房.
    准备工作: 在窗体上再添加一个 TreeView2 和一个按钮.
    先看运行效果图:


    TTreeView - 宜凌 - Delphi天空



    代码:


    unit Unit1;

    interface

    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, ComCtrls, StdCtrls;

    type
    TForm1 = class(TForm)
    TreeView1: TTreeView;
    TreeView2: TTreeView;
    Button1: TButton;
    Button2: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    end;

    var
    Form1: TForm1;

    implementation

    {$R *.dfm}

    procedure TForm1.FormCreate(Sender: TObject);
    begin
    Button1.Caption := '转移';
    Button2.Caption := '回防';
    end;

    {转移: TreeView1 → TreeView2}
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    if Boolean(TreeView1.Items.Count) then {如果其中元素总数不是 0}
    begin
    TreeView2.Items := TreeView1.Items;
    TreeView1.Items.Clear;
    end;
    end;

    {回防: TreeView2 → TreeView1}
    procedure TForm1.Button2Click(Sender: TObject);
    var
    Nodes: TTreeNodes; {尽早习惯使用 TTreeNodes}
    begin
    Nodes := TreeView2.Items;
    if Boolean(Nodes.Count) then
    begin
    TreeView1.Items := Nodes;
    TreeView2.Items.Clear;
    end;
    end;

    end.
    =================================================================
    本例效果图:

    TTreeView - 宜凌 - Delphi天空

    源码:
    unit Unit1;

    interface

    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, ComCtrls, StdCtrls;

    type
    TForm1 = class(TForm)
    TreeView1: TTreeView;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    end;

    var
    Form1: TForm1;

    implementation

    {$R *.dfm}

    var
    i: Integer;

    {这四个按钮的功能是一模一样的}
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    Self.Text := TreeView1.Items.Item[i].Text;
    if i < TreeView1.Items.Count-1 then Inc(i) else i := 0;

    TreeView1.SetFocus;
    TreeView1.Select(TreeView1.Items.Item[i]);
    end;

    {TreeView1.Items.Item[i] 是默认属性, 可以简写为: TreeView1.Items[i]}
    procedure TForm1.Button2Click(Sender: TObject);
    begin
    Text := TreeView1.Items[i].Text;
    if i < TreeView1.Items.Count-1 then Inc(i) else i := 0;

    TreeView1.SetFocus;
    TreeView1.Select(TreeView1.Items[i]);
    end;

    {每个元素都是 TTreeNode 类型的}
    procedure TForm1.Button3Click(Sender: TObject);
    var
    node: TTreeNode;
    begin
    node := TreeView1.Items[i];
    Text := node.Text;
    if i < TreeView1.Items.Count-1 then Inc(i) else i := 0;

    TreeView1.SetFocus;
    TreeView1.Select(node);
    end;

    {尽量使用 TTreeNodes 与 TTreeNode}
    procedure TForm1.Button4Click(Sender: TObject);
    var
    Nodes: TTreeNodes;
    node: TTreeNode;
    begin
    Nodes := TreeView1.Items;
    node := Nodes[i];
    Text := node.Text;
    if i < Nodes.Count-1 then Inc(i) else i := 0;

    TreeView1.SetFocus;
    TreeView1.Select(node);
    end;

    end.
    ================================================================================================
    本例效果图:

    TTreeView - 宜凌 - Delphi天空
    unit Unit1;

    interface

    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, ComCtrls, StdCtrls;

    type
    TForm1 = class(TForm)
    TreeView1: TTreeView;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    end;

    var
    Form1: TForm1;

    implementation

    {$R *.dfm}

    {方法1: 按职务顺序入场}
    procedure TForm1.Button1Click(Sender: TObject);
    var
    Nodes: TTreeNodes;
    node: TTreeNode;
    begin
    Nodes := TreeView1.Items;

    {添加第一个元素}
    node := Nodes.Add(nil, '一连长'); {'一连长'好孤独, 旁边没人}

    {现在 node 代表"一连长", 继续添加与其平级人员, 当然要参照"一连长"}
    Nodes.Add(node, '二连长');
    Nodes.Add(node, '三连长');

    {安排"一连"的下一层: "排长"; 同时让 node 指向"一排长"}
    node := Nodes.AddChild(node, '一排长');
    Nodes.Add(node, '二排长');
    Nodes.Add(node, '三排长');

    {添加平级用 Add, 添加下级用 AddChild; 继续:}
    node := Nodes.AddChild(node, '一班长');
    Nodes.Add(node, '二班长');
    Nodes.Add(node, '三班长');

    {还有 AddChildFirst 和 AddFirst 是专门添加第一个的, 假如忘了第一个...}
    node := Nodes.AddChild(node, '战士2');
    Nodes.Add(node, '战士3');
    Nodes.Add(node, '战士4');
    Nodes.AddFirst(node, '战士1'); {用 AddFirst 可以让它站在前面}
    end;


    {方法2: 按先后顺序入场}
    procedure TForm1.Button2Click(Sender: TObject);
    var
    Nodes: TTreeNodes;
    node: TTreeNode;
    begin
    Nodes := TreeView1.Items;

    node := Nodes.Add(nil, '一连长');
    node := Nodes.AddChild(node, '一排长');
    node := Nodes.AddChild(node, '一班长');
    node := Nodes.AddChild(node, '战士1');
    Nodes.Add(node, '战士2');
    Nodes.Add(node, '战士3');
    Nodes.Add(node, '战士4');

    node := node.Parent; {让 node 指向上一层}
    Nodes.Add(node, '二班长');
    Nodes.Add(node, '三班长');

    node := node.Parent;
    Nodes.Add(node, '二排长');
    Nodes.Add(node, '三排长');

    node := node.Parent;
    Nodes.Add(node, '二连长');
    Nodes.Add(node, '三连长');
    end;


    {方法3: 因为没使用 TTreeNodes 和 TTreeNode, 挺麻烦的}
    procedure TForm1.Button3Click(Sender: TObject);
    begin
    TreeView1.Items.Add(nil, '一连长');
    TreeView1.Items.Add(TreeView1.Items[0], '二连长');
    TreeView1.Items.Add(TreeView1.Items[0], '三连长');

    TreeView1.Items.AddChild(TreeView1.Items[0], '一排长');
    TreeView1.Items.Add(TreeView1.Items[0].Item[0], '二排长');
    TreeView1.Items.Add(TreeView1.Items[0].Item[0], '三排长');

    TreeView1.Items.AddChild(TreeView1.Items[0].Item[0], '一班长');
    TreeView1.Items.Add(TreeView1.Items[0].Item[0].Item[0], '二班长');
    TreeView1.Items.Add(TreeView1.Items[0].Item[0].Item[0], '三班长');

    TreeView1.Items.AddChild(TreeView1.Items[0].Item[0].Item[0], '战士1');
    TreeView1.Items.Add(TreeView1.Items[0].Item[0].Item[0].Item[0], '战士2');
    TreeView1.Items.Add(TreeView1.Items[0].Item[0].Item[0].Item[0], '战士3');
    TreeView1.Items.Add(TreeView1.Items[0].Item[0].Item[0].Item[0], '战士4');
    end;


    {方法4: 用 with 简化了"方法3", 也够绕的; 推荐使用前两种方法}
    procedure TForm1.Button4Click(Sender: TObject);
    begin
    with TreeView1 do begin
    Items.Add(nil, '一连长');
    Items.Add(Items[0], '二连长');
    Items.Add(Items[0], '三连长');

    Items.AddChild(Items[0], '一排长');
    Items.Add(Items[0].Item[0], '二排长');
    Items.Add(Items[0].Item[0], '三排长');

    Items.AddChild(Items[0].Item[0], '一班长');
    Items.Add(Items[0].Item[0].Item[0], '二班长');
    Items.Add(Items[0].Item[0].Item[0], '三班长');

    Items.AddChild(Items[0].Item[0].Item[0], '战士1');
    Items.Add(Items[0].Item[0].Item[0].Item[0], '战士2');
    Items.Add(Items[0].Item[0].Item[0].Item[0], '战士3');
    Items.Add(Items[0].Item[0].Item[0].Item[0], '战士4');
    end;
    end;


    procedure TForm1.Button5Click(Sender: TObject);
    begin
    TreeView1.Items.Clear;
    TButton(Sender).Caption := '清空';
    end;

    end.
    =========================================================================================
    本例效果图:

    TTreeView - 宜凌 - Delphi天空
    unit Unit1;

    interface

    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, ComCtrls, StdCtrls, Grids;

    type
    TForm1 = class(TForm)
    TreeView1: TTreeView;
    StringGrid1: TStringGrid;
    procedure FormCreate(Sender: TObject);
    procedure TreeView1Change(Sender: TObject; Node: TTreeNode);
    end;

    var
    Form1: TForm1;

    implementation

    {$R *.dfm}

    procedure TForm1.FormCreate(Sender: TObject);
    var
    Nodes: TTreeNodes;
    node: TTreeNode;
    begin
    {初始化 TreeView1}
    TreeView1.Align := alLeft;
    Nodes := TreeView1.Items;
    node := Nodes.Add(nil, '一连长');
    node := Nodes.AddChild(node, '一排长');
    node := Nodes.AddChild(node, '一班长');
    node := Nodes.AddChild(node, '战士1');
    Nodes.Add(node, '战士2');
    Nodes.Add(node, '战士3');
    Nodes.Add(node, '战士4');
    node := node.Parent;
    Nodes.Add(node, '二班长');
    Nodes.Add(node, '三班长');
    node := node.Parent;
    Nodes.Add(node, '二排长');
    Nodes.Add(node, '三排长');
    node := node.Parent;
    Nodes.Add(node, '二连长');
    Nodes.Add(node, '三连长');

    {初始化 StringGrid1}
    with StringGrid1 do begin
    Align := alClient;
    FixedRows := 0;
    ColCount := 2;
    ColWidths[0] := 78;
    ColWidths[1] := 50;
    DefaultRowHeight := 18;
    RowCount := 15;
    Cells[0,0] := '当前选择';
    Cells[0,1] := '序号';
    Cells[0,2] := '所在级别';
    Cells[0,3] := '在兄弟中排行';
    Cells[0,4] := '下级总数';
    Cells[0,5] := '上级元素';
    Cells[0,6] := '上一个';
    Cells[0,7] := '下一个';
    Cells[0,8] := '上一个兄弟';
    Cells[0,9] := '下一个兄弟';
    Cells[0,10] := '上一个可见';
    Cells[0,11] := '下一个可见';
    Cells[0,12] := '第一个下级';
    Cells[0,13] := '最后一个下级';
    Cells[0,14] := '总数';
    end;
    end;

    procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
    begin
    with StringGrid1 do begin

    {清除第二列的数据}
    StringGrid1.Cols[1].Clear;

    {当前选择}
    Cells[1,0] := Node.Text;

    {序号; AbsoluteIndex 是绝对序号}
    Cells[1,1] := IntToStr(Node.AbsoluteIndex);

    {所在级别}
    Cells[1,2] := IntToStr(Node.Level);

    {在兄弟中排行}
    Cells[1,3] := IntToStr(Node.Index);

    {下级总数}
    Cells[1,4] := IntToStr(Node.Count);

    {上级元素}
    if Boolean(Node.Parent) then Cells[1,5] := Node.Parent.Text;

    {上一个}
    if Boolean(Node.GetPrev) then Cells[1,6] := Node.GetPrev.Text;

    {下一个}
    if Boolean(Node.GetNext) then Cells[1,7] := Node.GetNext.Text;

    {上一个兄弟}
    if Boolean(Node.getPrevSibling) then Cells[1,8] := Node.getPrevSibling.Text;

    {下一个兄弟}
    if Boolean(Node.getNextSibling) then Cells[1,9] := Node.getNextSibling.Text;

    {上一个可见}
    if Boolean(Node.GetPrevVisible) then Cells[1,10] := Node.GetPrevVisible.Text;

    {下一个可见}
    if Boolean(Node.GetNextVisible) then Cells[1,11] := Node.GetNextVisible.Text;

    {第一个下级}
    if Node.HasChildren then Cells[1,12] := Node.getFirstChild.Text;

    {最后一个下级}
    if Node.HasChildren then Cells[1,13] := Node.GetLastChild.Text;

    {总数}
    Cells[1,14] := IntToStr(Node.Owner.Count);
    end;
    end;

    end.
    ==================================================================
    
    
    之前忘了 StringOfChar 函数的存在, 曾经把程序写作:

    unit Unit1;

    interface

    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, ComCtrls, StdCtrls, Grids, ExtCtrls;

    type
    TForm1 = class(TForm)
    TreeView1: TTreeView;
    Memo1: TMemo;
    Panel1: TPanel;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    end;

    var
    Form1: TForm1;

    implementation

    {$R *.dfm}

    {初始化 TreeView1}
    procedure TForm1.FormCreate(Sender: TObject);
    var
    Nodes: TTreeNodes;
    node: TTreeNode;
    begin
    TreeView1.Align := alLeft;
    Nodes := TreeView1.Items;
    node := Nodes.Add(nil, '一连长');
    node := Nodes.AddChild(node, '一排长');
    node := Nodes.AddChild(node, '一班长');
    node := Nodes.AddChild(node, '战士1');
    Nodes.Add(node, '战士2');
    Nodes.Add(node, '战士3');
    Nodes.Add(node, '战士4');
    node := node.Parent;
    Nodes.Add(node, '二班长');
    Nodes.Add(node, '三班长');
    node := node.Parent;
    Nodes.Add(node, '二排长');
    Nodes.Add(node, '三排长');
    node := node.Parent;
    Nodes.Add(node, '二连长');
    Nodes.Add(node, '三连长');
    end;

    {获取元素名列表}
    procedure TForm1.Button1Click(Sender: TObject);
    var
    i: Integer;
    begin
    Memo1.Clear;
    for i := 0 to TreeView1.Items.Count - 1 do
    Memo1.Lines.Add(TreeView1.Items[i].Text);
    end;

    {使用 Level 属性和 Tab 字符格式化列表}
    procedure TForm1.Button2Click(Sender: TObject);
    var
    arr: array[0..MAXBYTE] of Char;
    i: Integer;
    s: string;
    begin
    Memo1.Clear;
    FillChar(arr, Length(arr), #9);
    for i := 0 to TreeView1.Items.Count - 1 do
    begin
    s := Copy(arr, 0, TreeView1.Items[i].Level);
    s := s + TreeView1.Items[i].Text;
    Memo1.Lines.Add(s);
    end;
    end;

    {上面那个不好看, 这个是用了 4 个空格做 Level 标识}
    procedure TForm1.Button3Click(Sender: TObject);
    var
    arr: array[0..MAXBYTE] of Char;
    i: Integer;
    s: string;
    begin
    Memo1.Clear;
    FillChar(arr, Length(arr), #32);
    for i := 0 to TreeView1.Items.Count - 1 do
    begin
    s := Copy(arr, 0, TreeView1.Items[i].Level * 4);
    s := s + TreeView1.Items[i].Text;
    Memo1.Lines.Add(s);
    end;
    end;

    end.
    ===================================================================================
    本例效果图:

    TTreeView - 宜凌 - Delphi天空
    unit Unit1;

    interface

    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, ComCtrls, StdCtrls, Grids, ExtCtrls;

    type
    TForm1 = class(TForm)
    TreeView1: TTreeView;
    Memo1: TMemo;
    Panel1: TPanel;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    end;

    var
    Form1: TForm1;

    implementation

    {$R *.dfm}

    {初始化 TreeView1}
    procedure TForm1.FormCreate(Sender: TObject);
    var
    Nodes: TTreeNodes;
    node: TTreeNode;
    begin
    TreeView1.Align := alLeft;
    Nodes := TreeView1.Items;
    node := Nodes.Add(nil, '一连长');
    node := Nodes.AddChild(node, '一排长');
    node := Nodes.AddChild(node, '一班长');
    node := Nodes.AddChild(node, '战士1');
    Nodes.Add(node, '战士2');
    Nodes.Add(node, '战士3');
    Nodes.Add(node, '战士4');
    node := node.Parent;
    Nodes.Add(node, '二班长');
    Nodes.Add(node, '三班长');
    node := node.Parent;
    Nodes.Add(node, '二排长');
    Nodes.Add(node, '三排长');
    node := node.Parent;
    Nodes.Add(node, '二连长');
    Nodes.Add(node, '三连长');
    end;

    {保存到文件}
    procedure TForm1.Button1Click(Sender: TObject);
    const
    path = 'c: emp ree.txt';
    begin
    TreeView1.SaveToFile(path);
    TButton(Sender).Caption := '保存';
    end;

    {从文件中载入}
    procedure TForm1.Button2Click(Sender: TObject);
    const
    path = 'c: emp ree.txt';
    begin
    if FileExists(path) then TreeView1.LoadFromFile(path);
    TButton(Sender).Caption := '载入';
    end;

    {从流中读取}
    procedure TForm1.Button3Click(Sender: TObject);
    var
    stream: TStream;
    begin
    stream := TMemoryStream.Create;
    try
    Memo1.Lines.SaveToStream(stream);
    stream.Position := 0;
    TreeView1.LoadFromStream(stream);
    finally
    stream.Free;
    end;
    end;

    end.
    {注意: 上面例子中的"从流中读取"部分, 对 Memo 中的数据格式有严格要求, 要求必须是树状结构;

    结构中可以用"空格"和"Tab"分层.}
    ============================================================================================================
    本例效果图:

    TTreeView - 宜凌 - Delphi天空
    unit Unit1;

    interface

    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, ComCtrls, StdCtrls, Grids, ExtCtrls;

    type
    TForm1 = class(TForm)
    TreeView1: TTreeView;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    end;

    var
    Form1: TForm1;

    implementation

    {$R *.dfm}

    procedure TForm1.FormCreate(Sender: TObject);
    var
    Nodes: TTreeNodes;
    node: TTreeNode;
    begin
    TreeView1.Align := alLeft;
    Nodes := TreeView1.Items;
    node := Nodes.Add(nil, '一连长');
    node := Nodes.AddChild(node, '一排长');
    node := Nodes.AddChild(node, '一班长');
    node := Nodes.AddChild(node, '战士1');
    Nodes.Add(node, '战士2');
    Nodes.Add(node, '战士3');
    Nodes.Add(node, '战士4');
    node := node.Parent;
    Nodes.Add(node, '二班长');
    Nodes.Add(node, '三班长');
    node := node.Parent;
    Nodes.Add(node, '二排长');
    Nodes.Add(node, '三排长');
    node := node.Parent;
    Nodes.Add(node, '二连长');
    Nodes.Add(node, '三连长');
    end;

    {初始化}
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    TreeView1.Items.Clear;
    FormCreate(nil);
    TButton(Sender).Caption := '初始化';
    end;

    {删除}
    procedure TForm1.Button2Click(Sender: TObject);
    var
    node: TTreeNode;
    begin
    if not Boolean(TreeView1.Items) then Exit; {如果 TreeView1 无内容}
    if TreeView1.SelectionCount = 0 then Exit; {如果无选择}
    node := TreeView1.Selected;
    node.Delete;

    TButton(Sender).Caption := '删除';
    end;

    {删除它的所有下级}
    procedure TForm1.Button3Click(Sender: TObject);
    var
    node: TTreeNode;
    begin
    if not Boolean(TreeView1.Items) then Exit;
    if TreeView1.SelectionCount = 0 then Exit;
    node := TreeView1.Selected;
    if node.HasChildren then node.DeleteChildren
    else ShowMessage(node.Text + ' 没有下级');

    TButton(Sender).Caption := '删除下级';
    end;

    {用 TTreeNodes 删除}
    procedure TForm1.Button4Click(Sender: TObject);
    var
    node: TTreeNode;
    begin
    if not Boolean(TreeView1.Items) then Exit;
    if TreeView1.SelectionCount = 0 then Exit;
    node := TreeView1.Selected;
    TreeView1.Items.Delete(node);

    TButton(Sender).Caption := '用 TTreeNodes 删除';
    end;

    {插入, 只能通过 TTreeNodes}
    procedure TForm1.Button5Click(Sender: TObject);
    var
    node: TTreeNode;
    begin
    if not Boolean(TreeView1.Items) then Exit;
    if TreeView1.SelectionCount = 0 then Exit;
    node := TreeView1.Selected;
    TreeView1.Items.Insert(node, '新成员');

    TButton(Sender).Caption := '插入';
    end;

    end.
    =================================================================================================
    本例效果图:

    TTreeView - 宜凌 - Delphi天空
    unit Unit1;

    interface

    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, ComCtrls, StdCtrls;

    type
    TForm1 = class(TForm)
    TreeView1: TTreeView;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    end;

    var
    Form1: TForm1;

    implementation

    {$R *.dfm}

    {初始化}
    procedure TForm1.FormCreate(Sender: TObject);
    var
    stream: TMemoryStream;
    begin
    TreeView1.Align := alLeft;
    stream := TMemoryStream.Create;
    with TStringList.Create do
    begin
    Add('2');
    Add('3');
    Add('1');
    Add('4');
    Add(#32'2');
    Add(#32'3');
    Add(#32'1');
    Add(#32'4');
    Add(#32#32'2');
    Add(#32#32'3');
    Add(#32#32'1');
    Add(#32#32'4');
    SaveToStream(stream);
    Free;
    end;
    stream.Position := 0;
    TreeView1.LoadFromStream(stream);
    TreeView1.SortType := stNone;
    stream.Free;

    Button1.Caption := '排序第一层';
    Button2.Caption := '全部排序';
    Button3.Caption := '指定排序类型';
    Button4.Caption := '倒排序';
    Button5.Caption := '初始化';
    end;

    {只排序第一层}
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    TreeView1.AlphaSort(False);
    end;

    {全部排序}
    procedure TForm1.Button2Click(Sender: TObject);
    begin
    TreeView1.AlphaSort;
    end;

    {指定排序类型}
    procedure TForm1.Button3Click(Sender: TObject);
    begin
    TreeView1.SortType := stText;

    {SortType 有四种选择:
    stNone, stData, stText, stBoth
    stText 表示按显示的标签文本排序.
    }

    end;

    {倒排序}
    procedure TForm1.Button4Click(Sender: TObject);
    function MySort(Node1, Node2: TTreeNode; lParam: Integer): Integer; stdcall;
    begin
    Result := -AnsiStrIComp(PChar(Node1.Text), PChar(Node2.Text));
    end;
    begin
    TreeView1.CustomSort(@MySort, 0);
    end;

    {重新初始化}
    procedure TForm1.Button5Click(Sender: TObject);
    begin
    FormCreate(nil);
    end;

    end.
  • 相关阅读:
    Oracle数据库中。varchar 和 varchar2的区别
    gvim 编辑器初学
    鼠标事件以及clientX、offsetX、screenX、pageX、x的区别
    清除浮动的5种方法
    按钮的单双击事件
    webstrom中的快捷键
    限制 input 输入框只能输入纯数字
    控制<标签>不可被点击
    way.js
    ECharts 折线图and柱状图
  • 原文地址:https://www.cnblogs.com/shijiaoyun/p/4045026.html
Copyright © 2011-2022 走看看