![]() |
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 |
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 10:04 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz