• 虚拟树DemosMinimal 简单的例子


    //分析虚拟树demo
    6-VirtualTreeViewVirtualTreeViewV5.3.0DemosMinimal的main.pas文件

    unit Main;
    
    // Demonstration project for TVirtualStringTree to generally show how to get started.
    // Written by Mike Lischke.
    interface
    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      VirtualTrees, StdCtrls, ExtCtrls;
    type
      TMainForm = class(TForm)
        VST: TVirtualStringTree;
        ClearButton: TButton;
        AddOneButton: TButton;
        Edit1: TEdit;
        Button1: TButton;
        Label1: TLabel;
        CloseButton: TButton;
        procedure FormCreate(Sender: TObject);
        procedure ClearButtonClick(Sender: TObject);
        procedure AddButtonClick(Sender: TObject);
        procedure VSTGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex;
          TextType: TVSTTextType; var Text: UnicodeString);
        procedure VSTFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
        procedure VSTInitNode(Sender: TBaseVirtualTree; ParentNode, Node: PVirtualNode;
          var InitialStates: TVirtualNodeInitStates);
        procedure CloseButtonClick(Sender: TObject);
        procedure VSTStartDrag(Sender: TObject; var DragObject: TDragObject);
      end;
    
    var
      MainForm: TMainForm;
    //----------------------------------------------------------------------------------------------------------------------
    implementation
    {$R *.DFM}
    type
      // This is a very simple record we use to store data in the nodes.
      // Since the application is responsible to manage all data including the node's caption
      // this record can be considered as minimal requirement in all VT applications.
      // Extend it to whatever your application needs.
      PMyRec = ^TMyRec;
      TMyRec = record
        Caption: WideString;
      end;
    //----------------------------------------------------------------------------------------------------------------------
    procedure TMainForm.FormCreate(Sender: TObject);
    begin
      // We assign the OnGetText handler manually to keep the demo source code compatible
      // with older Delphi versions after using UnicodeString instead of WideString.
      VST.OnGetText := VSTGetText;
      // Let the tree know how much data space we need.
      VST.NodeDataSize := SizeOf(TMyRec); //设定一个node的内存大小,虚拟树的妙处
      // Set an initial number of nodes.
      VST.RootNodeCount := 20;
    end;
    //----------------------------------------------------------------------------------------------------------------------
    procedure TMainForm.ClearButtonClick(Sender: TObject);
    var
      Start: Cardinal;
    begin
      Screen.Cursor := crHourGlass;
      try
        Start := GetTickCount;
        VST.Clear;
        Label1.Caption := Format('Last operation duration: %d ms', [GetTickCount - Start]);
      finally
        Screen.Cursor := crDefault;
      end;
    end;
    //----------------------------------------------------------------------------------------------------------------------
    procedure TMainForm.AddButtonClick(Sender: TObject);
    var
      Count: Cardinal;
      Start: Cardinal;
    begin
      // Add some nodes to the treeview.
      Screen.Cursor := crHourGlass;
      with VST do
      try
        Start := GetTickCount;
        case (Sender as TButton).Tag of
          0: // add to root
            begin
              Count := StrToInt(Edit1.Text);
              RootNodeCount := RootNodeCount + Count;//自动改变这个属性即可
            end;
          1: // add as child
            if Assigned(FocusedNode) then
            begin
              Count := StrToInt(Edit1.Text);
              ChildCount[FocusedNode] := ChildCount[FocusedNode] + Count;
              Expanded[FocusedNode] := True;
              InvalidateToBottom(FocusedNode);//要放到后面
            end;
        end;
        Label1.Caption := Format('Last operation duration: %d ms', [GetTickCount - Start]);
      finally
        Screen.Cursor := crDefault;
      end;
    end;
    
    //----------------------------------------------------------------------------------------------------------------------
    procedure TMainForm.VSTGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex;
      TextType: TVSTTextType; var Text: UnicodeString);
    var
      Data: PMyRec;
    begin
      // A handler for the OnGetText event is always needed as it provides the tree with the string data to display.
      // Note that we are always using WideString.
      // OnGetText事件处理程序总是需要为它提供了树显示的字符串数据。
    //注意,我们总是使用WideString。
      Data := Sender.GetNodeData(Node);//虚拟树的取值
      if Assigned(Data) then
        Text := Data.Caption;
    end;
    //----------------------------------------------------------------------------------------------------------------------
    procedure TMainForm.VSTFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
    var
      Data: PMyRec;
    begin
      Data := Sender.GetNodeData(Node);
      // Explicitely free the string, the VCL cannot know that there is one but needs to free
      // it nonetheless. For more fields in such a record which must be freed use Finalize(Data^) instead touching
      // every member individually.
      ///影响自由的字符串,VCL无法知道有一个但仍然需要自由。
      //为多个字段的记录必须释放使用Finalize(数据^)而不是单独触摸每一个成员。
      Finalize(Data^);
    end;
    //----------------------------------------------------------------------------------------------------------------------
    procedure TMainForm.VSTInitNode(Sender: TBaseVirtualTree; ParentNode, Node: PVirtualNode;
      var InitialStates: TVirtualNodeInitStates);
    var
      Data: PMyRec;
    begin
      with Sender do
      begin
        Data := GetNodeData(Node);
        // Construct a node caption. This event is triggered once for each node but
        // appears asynchronously, which means when the node is displayed not when it is added.
        //构造一个节点标题。这个事件触发异步为每个节点,但一旦出现,这意味着当节点添加时不显示。  每次初始化时都会给这样的值
        Data.Caption := Format('Level %d, Index %d', [GetNodeLevel(Node), Node.Index]);
      end;
    end;
    //----------------------------------------------------------------------------------------------------------------------
    procedure TMainForm.CloseButtonClick(Sender: TObject);
    begin
      Close;
    end;
    //----------------------------------------------------------------------------------------------------------------------
    procedure TMainForm.VSTStartDrag(Sender: TObject; var DragObject: TDragObject);
    begin
      DragObject := TDragObject.Create;
    end;
    //----------------------------------------------------------------------------------------------------------------------
    end.
  • 相关阅读:
    [DB2]删除大数据量数据及57011错误处理
    [DB2]DB2日常维护——REORG TABLE命令优化数据库性能
    [转]解读DIV CSS网页布局中CSS无效十个原因
    [DB2]DB2 sqlstate 57016 原因码 "7"错误
    [翻译]15个最常见的WCF问题
    [DB2]DB2数据库备份与恢复和导出表结构与导入导出表数据
    [转]网站(bs系统)怎样实现即时消息思路总结
    【摘抄】DB2字符集问题
    [转]jQuery必知必熟基础知识
    sql 2005/2008 订阅与发布的几个概念
  • 原文地址:https://www.cnblogs.com/rogge7/p/5753868.html
Copyright © 2020-2023  润新知