Moin,
für mich hat sich jetzt dieses Vorgehen bewährt, zuerst ein Objekt, das die Daten und zur Visualisierung ein Panel enthält:
Delphi-Quellcode:
TFoodform = class(TBaseFoodform)
private
FPanel: TPanel;
function GetPanel: TPanel;
procedure SetPanel(const Value: TPanel);
published
property Panel: TPanel read GetPanel write SetPanel;
Das VST befindet sich auf einem Formular mit diesen Deklarationen:
Delphi-Quellcode:
type
PTreeData = ^TFoodform;
TFrmKostformen = class(TFrmStammBasis)
...
private
FoodformList: TFoodformlist;
...
In der Prozedur, die das VST mit Inhalt füllt, befindet sich dieser Code:
Delphi-Quellcode:
for i := 0 to Foodformlist.Count - 1 do
begin
VST1.AddChild(nil, Foodformlist[i]);
Foodformlist[i].Panel := TPanel.Create(nil);
Foodformlist[i].Panel.Parent := VST1;
Foodformlist[i].Panel.StyleElements := [];
Foodformlist[i].Panel.Color := Foodformlist[i].Color;
Foodformlist[i].Panel.Height := VST1.DefaultNodeHeight;
Foodformlist[i].Panel.Visible := False;
end;
Jetzt muss das nur noch zur Anzeige gebracht werden:
Delphi-Quellcode:
procedure TFrmKostformen.VST1AfterCellPaint(Sender: TBaseVirtualTree; TargetCanvas: TCanvas;
Node: PVirtualNode; Column: TColumnIndex; CellRect: TRect);
var
data: PTreeData;
begin
...
if Column=3 then
begin
data := Sender.GetNodeData(node);
if assigned(data.Panel) then
begin
data.Panel.Visible := vsVisible in Node.States;
Data.Panel.BoundsRect := Sender.GetDisplayRect(Node, Column, False);
end;
end;
end;
Ich habe das testweise auch mal mit einem TButton statt einem TPanel ausprobiert und kann da keine Probleme mit dem Zeichnen feststellen.