Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Virtualtreeview - Controls auf Nodes (https://www.delphipraxis.net/182533-virtualtreeview-controls-auf-nodes.html)

Baltenweck 30. Okt 2014 10:47

Virtualtreeview - Controls auf Nodes
 
Hallo zusammen,

auf den Nodes eines TVirtualStringTree's möchte ich ein Panel darstellen.
Hier mal das Testprogramm (lazerus):

Delphi-Quellcode:
unit Unit1;

{$mode DELPHI}

interface

uses
  Classes, SysUtils, FileUtil, VirtualTrees, Forms, Controls, Graphics, Dialogs,
  StdCtrls,ExtCtrls;

type
 
  TForm1 = class(TForm)
    Button1: TButton;
    Panel1: TPanel;
    VST: TVirtualStringTree;
    procedure Button1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
    procedure FormCreate(Sender: TObject);
    procedure VSTAfterCellPaint(Sender: TBaseVirtualTree;
      TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
      const CellRect: TRect);
  private
    { private declarations }
  public
    { public declarations }
  end;

type
  PTreeData = ^TTreeData;
  TTreeData = record
    NodeName : String; // Eindeutige Bezeichnung
    Panel : TPanel;
  end;

var
  Form1: TForm1;
  Node : PVirtualNode;
  Data: PTreeData;

implementation

{$R *.lfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  VST.NodeDataSize:=SizeOf(TTreeData);
  VST.DefaultNodeHeight:=50;
end;

procedure TForm1.VSTAfterCellPaint(Sender: TBaseVirtualTree;
  TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
  const CellRect: TRect);
begin
  Data := VST.GetNodeData(Node);
  If Assigned(Data) Then begin
    Data^.Panel.Left:=20;
    Data^.Panel.Width:=CellRect.Right-CellRect.Left-Data^.Panel.Left;
    Data^.Panel.Top:=CellRect.Top;
    Data^.Panel.Height:=CellRect.Bottom-CellRect.Top;
  end;
end;

procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
  VST.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Node := VST.AddChild(nil);
  If VST.AbsoluteIndex(Node) > -1 then begin
    Data := VST.GetNodeData(Node);
    Data^.NodeName:='Nodename';
    Data^.Panel:= TPanel.Create(nil);
    Data^.Panel.Parent := VST;
    Data^.Panel.Left := 40;
    Data^.Panel.Top := 0;
    Data^.Panel.Width := 50;
    Data^.Panel.Height := VST.DefaultNodeHeight;
    Data^.Panel.Anchors := [akTop,akLeft];
    Data^.Panel.BorderWidth := 0;
    Data^.Panel.Autosize:=True;
    Data^.Panel.Color:=clRed;
    Data^.Panel.Visible:=True;
  end;
end;

end.

:?: Die Frage ist: Warum wird das Panel nicht angezeigt
Wäre für Denkanstöße sehr Dankbar !!

Gruß
Patrick

Baltenweck 31. Okt 2014 14:15

AW: Virtualtreeview - Controls auf Nodes
 
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:46 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz