Recent

Author Topic: making default event handler for TLazVirtualStringTree  (Read 197 times)

egsuh

  • Hero Member
  • *****
  • Posts: 1562
making default event handler for TLazVirtualStringTree
« on: February 09, 2025, 10:03:37 am »
Hello,

VirtualStringTree seems a little complex at first glance. I'm looking for ways to make it more easily accessible, using helpers etc.
The following example works fine with assigning methods to event handlers.

I'm wondering there are any ways to directly change the default behavior of this TLazVirtualStringTree as in HVStr. The key is I do not have to assign event handling methods at form designer.

Code: Pascal  [Select][+][-]
  1. type
  2.   { TTreeData -- an object  }
  3.  
  4.   TTreeData = class
  5.     Field0: String;
  6.     Field1: String;
  7.     Field2: String;
  8.     Field3: String;
  9.     Field4: String;
  10.     Field5: String;
  11.     Field6: String;
  12.  
  13.   public
  14.      constructor Create(AValue:integer);
  15.   end;
  16.  
  17.  
  18.   { HVStr }
  19.  
  20.   HVStr = class helper for TLazVirtualStringTree
  21.     procedure GetText(Sender: TBaseVirtualTree; Node: PVirtualNode; // want to make this procedure as default,
  22.       Column: TColumnIndex; TextType: TVSTTextType; var CellText: String);
  23.   end;
  24.  
  25.  
  26.   { Tfrvst }
  27.  
  28.   Tfrvst = class(TFrame)
  29.     vst: TLazVirtualStringTree;
  30.  
  31.     procedure vstEditing(Sender: TBaseVirtualTree; Node: PVirtualNode;
  32.       Column: TColumnIndex; var Allowed: Boolean);
  33.     procedure vstFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
  34.     procedure vstGetNodeDataSize(Sender: TBaseVirtualTree;
  35.       var NodeDataSize: Integer);
  36.     procedure vstGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
  37.        Column: TColumnIndex; TextType: TVSTTextType; var CellText: String);
  38.     procedure vstNewText(Sender: TBaseVirtualTree; Node: PVirtualNode;
  39.       Column: TColumnIndex; const NewText: String);
  40.   end;
  41.  
  42. implementation
  43.  
  44. {$R *.lfm}
  45.  
  46. { TTreeData }
  47.  
  48. constructor TTreeData.Create(AValue: integer);
  49. begin
  50.    inherited Create;
  51.  
  52.    Field0 := IntToStr(AValue);
  53.    Field1 := 'Col 1 ' + IntToStr(Avalue);
  54.    Field2 := 'Col 2 ' + IntToStr(Avalue);
  55.    Field3 := '(col 3)';
  56.    Field4 := '(col 4)';
  57.    Field5 := '(col 5)';
  58.    Field6 := '(col 6)';
  59. end;
  60.  
  61. { HVStr }
  62.  
  63. // like following way
  64.  
  65. procedure HVStr.GetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
  66.    Column: TColumnIndex; TextType: TVSTTextType; var CellText: String);
  67. begin
  68.    with TTreeData(Sender.GetNodeData(Node)^) do begin
  69.        case Column of
  70.          0: CellText := Field0;
  71.          1: CellText := Field1;
  72.          ......
  73.          6: CellText := Field6;
  74.        end;
  75.    end;
  76. end;
  77.  
  78. { Tfrvst }
  79.  
  80.  
  81. { -------- mapping text & column --------------- }
  82.  
  83.  
  84. // ---------- current this is fine, but must be assigned to OnGetText event.
  85.  
  86. procedure Tfrvst.vstGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
  87.   Column: TColumnIndex; TextType: TVSTTextType; var CellText: String);
  88. begin
  89.   with TTreeData(Sender.GetNodeData(Node)^) do begin
  90.      case Column of
  91.        0: CellText := Field0;
  92.        1: CellText := Field1;
  93.        ......
  94.        6: CellText := Field6;
  95.      end;
  96.   end;
  97. end;
  98. // -------- }
  99.  
  100.  
  101.  
  102. procedure Tfrvst.vstNewText(Sender: TBaseVirtualTree; Node: PVirtualNode;
  103.   Column: TColumnIndex; const NewText: String);
  104. var
  105.   Data: TTreeData;
  106. begin
  107.   with TTreeData(Sender.GetNodeData(Node)^) do begin
  108.      case Column of
  109.        0: Data.Field0 := NewText;
  110.        1: Data.Field1 := NewText;
  111.        .....
  112.        6: Data.Field6 := NewText;
  113.      end;
  114.   end;
  115. end;
  116.  

 

TinyPortal © 2005-2018