unit Unit1;
{$mode objfpc}{$H+}
interface
uses
windows, Classes, SysUtils, VirtualTrees, FileUtil, Forms, Controls, Graphics, Dialogs,
StdCtrls, Buttons, ComCtrls;
type
PData = ^TData;
TData = record
FName: String;
FOcupation: String;
FYear: String;
FMarried: String;
FImageIndex: Integer;
Button: TSpeedButton;
ButtonID: Integer;
end;
{ TForm1 }
TForm1 = class(TForm)
BitBtn1: TBitBtn;
ImageList1: TImageList;
ImageList2: TImageList;
VST: TVirtualStringTree;
procedure FormCreate(Sender: TObject);
procedure VSTAfterCellPaint(Sender: TBaseVirtualTree;
{%H-}TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
const {%H-}CellRect: TRect);
procedure VSTFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
procedure VSTGetImageIndex(Sender: TBaseVirtualTree; Node: PVirtualNode;
{%H-}Kind: TVTImageKind; Column: TColumnIndex; var {%H-}Ghosted: Boolean;
var ImageIndex: Integer);
procedure VSTGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
Column: TColumnIndex; {%H-}TextType: TVSTTextType; var CellText: String);
private
procedure CreateButton(AUniqueID: Integer; AData: PData);
procedure ButtonClick(Sender: TObject);
public
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
procedure TForm1.VSTGetImageIndex(Sender: TBaseVirtualTree; Node: PVirtualNode;
Kind: TVTImageKind; Column: TColumnIndex; var Ghosted: Boolean;
var ImageIndex: Integer);
var
Data: PData;
begin
if Column = 0 then
begin
Data := VST.GetNodeData(Node);
ImageIndex := Data^.FImageIndex;
end;
end;
procedure TForm1.VSTGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
Column: TColumnIndex; TextType: TVSTTextType; var CellText: String);
var
Data: PData;
begin
Data := VST.GetNodeData(Node);
case Column of
0: CellText := '';
1: CellText := Data^.FName;
2: CellText := Data^.FOcupation;
3: CellText := Data^.FYear;
4: CellText := Data^.FMarried;
end;
end;
procedure TForm1.CreateButton(AUniqueID: Integer; AData: PData);
begin
AData^.Button := TSpeedButton.Create(VST);
AData^.Button.Caption := 'Get Data';
AData^.Button.Parent := VST;
AData^.Button.Visible := False;
AData^.Button.Tag := AUniqueID;
AData^.Button.OnClick := @ButtonClick;
AData^.ButtonID := AUniqueID;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
Data: PData;
Node: PVirtualNode;
UniqueID: Integer;
begin
UniqueID := 0;
VST.Clear;
VST.NodeDataSize := SizeOf(TData);
Node := VST.AddChild(nil);
Data := VST.GetNodeData(Node);
VST.MultiLine[node] := true;
Data^.FName := 'erick, '#13'student, '+'18, '+'no';
Data^.FImageIndex := 0;
Inc(UniqueID);
CreateButton(UniqueID, Data);
Node := VST.AddChild(nil);
Data := VST.GetNodeData(Node);
VST.MultiLine[node] := true;
Data^.FName := 'magui, '#13'enfermera, '+'25, '+'si';
Data^.FImageIndex := 1;
Inc(UniqueID);
CreateButton(UniqueID, Data);
Node := VST.AddChild(nil);
Data := VST.GetNodeData(Node);
VST.MultiLine[node] := true;
Data^.FImageIndex := 2;
Data^.FName := 'leo, '#13'ingenier, '+'30, '+'si';
Inc(UniqueID);
CreateButton(UniqueID, Data);
Node := VST.AddChild(nil);
Data := VST.GetNodeData(Node);
VST.MultiLine[node] := true;
Data^.FName := 'erick, '#13'student, '+'18, '+'no';
Data^.FImageIndex := 0;
Inc(UniqueID);
CreateButton(UniqueID, Data);
Node := VST.AddChild(nil);
Data := VST.GetNodeData(Node);
VST.MultiLine[node] := true;
Data^.FName := 'magui, '#13'enfermera, '+'25, '+'si';
Data^.FImageIndex := 1;
Inc(UniqueID);
CreateButton(UniqueID, Data);
Node := VST.AddChild(nil);
Data := VST.GetNodeData(Node);
VST.MultiLine[node] := true;
Data^.FImageIndex := 2;
Data^.FName := 'leo, '#13'ingenier, '+'30, '+'si';
Inc(UniqueID);
CreateButton(UniqueID, Data);
Node := VST.AddChild(nil);
Data := VST.GetNodeData(Node);
VST.MultiLine[node] := true;
Data^.FName := 'erick, '#13'student, '+'18, '+'no';
Data^.FImageIndex := 0;
Inc(UniqueID);
CreateButton(UniqueID, Data);
Node := VST.AddChild(nil);
Data := VST.GetNodeData(Node);
VST.MultiLine[node] := true;
Data^.FName := 'magui, '#13'enfermera, '+'25, '+'si';
Data^.FImageIndex := 1;
Inc(UniqueID);
CreateButton(UniqueID, Data);
Node := VST.AddChild(nil);
Data := VST.GetNodeData(Node);
VST.MultiLine[node] := true;
Data^.FImageIndex := 2;
Data^.FName := 'leo, '#13'ingenier, '+'30, '+'si';
Inc(UniqueID);
CreateButton(UniqueID, Data);
Node := VST.AddChild(nil);
Data := VST.GetNodeData(Node);
VST.MultiLine[node] := true;
Data^.FName := 'erick, '#13'student, '+'18, '+'no';
Data^.FImageIndex := 0;
Inc(UniqueID);
CreateButton(UniqueID, Data);
Node := VST.AddChild(nil);
Data := VST.GetNodeData(Node);
VST.MultiLine[node] := true;
Data^.FName := 'magui, '#13'enfermera, '+'25, '+'si';
Data^.FImageIndex := 1;
Inc(UniqueID);
CreateButton(UniqueID, Data);
Node := VST.AddChild(nil);
Data := VST.GetNodeData(Node);
VST.MultiLine[node] := true;
Data^.FImageIndex := 2;
Data^.FName := 'leo, '#13'ingenier, '+'30, '+'si';
Inc(UniqueID);
CreateButton(UniqueID, Data);
Node := VST.AddChild(nil);
Data := VST.GetNodeData(Node);
VST.MultiLine[node] := true;
Data^.FName := 'erick, '#13'student, '+'18, '+'no';
Data^.FImageIndex := 0;
Inc(UniqueID);
CreateButton(UniqueID, Data);
Node := VST.AddChild(nil);
Data := VST.GetNodeData(Node);
VST.MultiLine[node] := true;
Data^.FName := 'magui, '#13'enfermera, '+'25, '+'si';
Data^.FImageIndex := 1;
Inc(UniqueID);
CreateButton(UniqueID, Data);
Node := VST.AddChild(nil);
Data := VST.GetNodeData(Node);
VST.MultiLine[node] := true;
Data^.FImageIndex := 2;
Data^.FName := 'leo, '#13'ingenier, '+'30, '+'si';
Inc(UniqueID);
CreateButton(UniqueID, Data);
end;
procedure TForm1.ButtonClick(Sender: TObject);
var
Node: PVirtualNode;
Data: PData;
ButtonID: Integer;
begin
ButtonID := (Sender as TSpeedButton).Tag;
Node := VST.GetFirst;
while Assigned(Node) do
begin
Data := VST.GetNodeData(Node);
if Data^.ButtonID = ButtonID then
begin
ShowMessage('Get data for: ' + Data^.FName);
Break;
end;
Node := VST.GetNext(Node);
end;
end;
procedure TForm1.VSTAfterCellPaint(Sender: TBaseVirtualTree;
TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
const CellRect: TRect);
var
Data: PData;
R: TRect;
begin
if Column = 2 then
begin
Data := VST.GetNodeData(Node);
if Assigned(Data^.Button) then
begin
R := VST.GetDisplayRect(Node, Column, False);
Data^.Button.Width := R.Right - R.Left - 1;
Data^.Button.Left := R.Left + 1;
Data^.Button.Top := R.Top + 1;
Data^.Button.Height := R.Bottom - R.Top - 1;
end;
Data^.Button.Visible := VST.IsVisible[Node];
end
end;
procedure TForm1.VSTFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
var
Data: PData;
begin
Data := VST.GetNodeData(Node);
if Assigned(Data^.Button) then
Data^.Button.Visible := False;
Finalize(Data^);
end;
end.