// TESTPROGRAMM
//
// Erzeugen von Panels in einer Scrollbox und "gleisetzen" mit Nodes des VST
// Synchronisieren der Vertikalscrollbars VirtualstringTree mit Scrollbox
//
// Benötigt wird:
//
// Komponente: Name
// TButton Button1
// TVirtualStringTree VST
// TScrollBox SCB
// TLabel Label1
// TLabel Label2
unit syncsrollmain;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, VirtualTrees, Forms, Controls, Graphics, Dialogs,
StdCtrls, ExtCtrls, types;
type
{ TForm1 }
TForm1 =
class(TForm)
Button1: TButton;
Label1: TLabel;
Label2: TLabel;
SCB: TScrollBox;
VST: TVirtualStringTree;
procedure Button1Click(Sender: TObject);
procedure FormClose(Sender: TObject;
var CloseAction: TCloseAction);
procedure FormCreate(Sender: TObject);
procedure VDTAfterCellPaint(Sender: TBaseVirtualTree;
TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
const CellRect: TRect);
procedure VSTGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
Column: TColumnIndex; TextType: TVSTTextType;
var CellText:
String);
procedure VSTScroll(Sender: TBaseVirtualTree; DeltaX, DeltaY: Integer);
private
{ private declarations }
public
{ public declarations }
end;
type
VSTPTreeData = ^VSTTTreeData;
VSTTTreeData =
record
NodeName :
String;
// Eindeutige Bezeichnung
end;
Const
H = 50;
// Höhe der Nodes
S = 5;
// Anzahl der Nodes im Sichtbereich der Scrollareas
var
Form1: TForm1;
VSTNode : PVirtualNode;
Data: VSTPTreeData;
i : integer;
Pan : TPanel;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
begin
Form1.Left:=1;
Form1.Top:=1;
Form1.Height:=370;
Form1.Width:=450;
Button1.Top:=10;
Button1.Left:=30;
VST.NodeDataSize:=SizeOf(VSTTTreeData);
VST.DefaultNodeHeight:=H;
VST.Header.Options:=VST.Header.Options-[hoVisible];
VST.Top:=50;
VST.Left:=30;
VST.Height:=H*S;
VST.Width:=200;
SCB.Height:=VST.Height;
SCB.Top:=VST.Top;
SCB.Left:=VST.Left+VST.Width;
SCB.HorzScrollBar.Visible:=False;
SCB.VertScrollBar.Visible:=False;
Label1.Left:=VST.Left+20;
Label2.Left:=Label1.Left+VST.Width;
Label1.Top:=VST.Top+VSt.Height+10;
Label2.Top:=Label1.Top;
Label1.Caption:='
VST Offset Y = '+FloatToStrF(VST.OffsetY,ffFixed,10,0);
Label2.Caption:='
SCB Position Y = '+FloatToStrF(SCB.VertScrollBar.Position,ffFixed,10,0);
end;
procedure TForm1.VDTAfterCellPaint(Sender: TBaseVirtualTree;
TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
const CellRect: TRect);
begin
end;
procedure TForm1.VSTGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
Column: TColumnIndex; TextType: TVSTTextType;
var CellText:
String);
begin
Data := VST.GetNodeData(Node);
CellText := Data^.NodeName;
end;
procedure TForm1.VSTScroll(Sender: TBaseVirtualTree; DeltaX, DeltaY: Integer);
begin
SCB.VertScrollBar.Position:=VST.OffsetY*-1;
Label1.Caption:='
VST Offset Y = '+FloatToStrF(VST.OffsetY,ffFixed,10,0);
Label2.Caption:='
SCB Position Y = '+FloatToStrF(SCB.VertScrollBar.Position,ffFixed,10,0);
end;
procedure TForm1.FormClose(Sender: TObject;
var CloseAction: TCloseAction);
begin
VST.Free;
end;
procedure TForm1.Button1Click(Sender: TObject);
Var i : Integer;
begin
for i:= 0
to 19
do begin
VSTNode := VST.AddChild(
nil);
VST.BeginUpdate;
Data := VST.GetNodeData(VSTNode);
Data^.NodeName:=IntToStr(VST.AbsoluteIndex(VSTNode));
VST.EndUpdate;
Pan := TPanel.Create(Self);
Pan.Parent := SCB;
Pan.Left := 0;
Pan.Top := i*H;
Pan.Height:=H;
Pan.Width:=SCB.Width;
Pan.Caption:=Data^.NodeName;
end;
end;
end.