Einzelnen Beitrag anzeigen

Baltenweck

Registriert seit: 30. Okt 2014
2 Beiträge
 
FreePascal / Lazarus
 
#2

AW: Virtualtreeview - Controls auf Nodes

  Alt 31. Okt 2014, 14:15
Eine Lösung hab ich noch nicht gefunden.

Als Alternative hab ich einen Workaround:
Neben dem VST lege ich eine Scrollbox in der ich die Panels erzeuge. Es müssen dann nur noch die Scrollbars der Beiden synchronisiert werden.

Hier mein Testprogramm:

Delphi-Quellcode:
// 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.
  Mit Zitat antworten Zitat