对于我在公司的项目,我应该实现一个virtaulStringstree,其节点是CostumControl。这意味着它们不仅是文本,而且是带有标签和按钮的面板。 我找到了类似问题的解决方案单元格中的 virtualtreeview 嵌入按钮 这是 Kobik 的回答,这确实有帮助,但我想让 virtualNode 内的 Costum Panel 与其父 virtaulNode 具有相同的宽度。
到目前为止我尝试的是将 TmyPanel 的宽度设置为某个值并将其父项设置为 nil,这样 Tmypanel 将不会在 VirtualNode 中显示。
有人有如何减小面板宽度的想法或解决方案吗?!
TMyPanel = class(TPanel)
public
Cstar: TSpeedButton;
CName: TLabel;
CImageIndex : Integer;
end;
procedure Form.FormCreate(Sender: TObject);
var
NodeData: ^TTreeData;
Node: PVirtualNode;
MyPanel: TMyPanel;
TestBitmap: TBitmap;
begin
inherited;
vst.NodeDataSize := SizeOf(TTreeData);
vst.ScrollBarOptions.ScrollBars := ssVertical;
vst.NodeDataSize := SizeOf(TTreeData);
Node := vst.AddChild(nil);
InitializeNodeData(vst, Node, 'Vertrieb');
Node := vst.AddChild(Node);
InitializeNodeData(vst,Node, 'TMyPanel');
MyPanel := TMyPanel(CreateNodeControl(vst, Node, TMyPanel));
with MyPanel do
begin
// Caption := 'TMyPanel';
// Color := vst.Color;
// BevelOuter := bvNone;
// BevelInner := bvNone;
// ClientWidth := 10;
Width := 40;
// left := 0;
Align := alNone;
CName := TLabel.Create(MyPanel);
CName.Align := alClient;
Cname.Caption := 'test';
Cname.Top := 0;
Cname.Parent := MyPanel;
Cstar := TSpeedButton.Create(MyPanel);
Cstar.OnClick := onFavouriteClick;
Cstar.Parent := MyPanel;
Cstar.Top := 0;
Cstar.Align := AlRight;
Cstar.Flat := True;
TestBitmap := TBitmap.Create;
try
ImageList1.GetBitmap(4, TestBitmap);
Cstar.Glyph.Assign(TestBitmap);
finally
TestBitmap.Free;
end;
end;
end;
function Form.CreateNodeControl(Tree: TVirtualStringTree; Node:PVirtualNode;ControlClass: TControlClass): TControl;
var
NodeData: PTreeData;
begin
NodeData := Tree.GetNodeData(Node);
NodeData.Control := ControlClass.Create(Tree);
with NodeData.Control do
begin
Parent := vst;
Width := 10;
// Height := Tree.DefaultNodeHeight;
width:= 10;
// Align := alRight;
Visible := true;
end;
Tree.IsDisabled[Node] := True;
Result := NodeData.Control;
end;
procedure Form.InitializeNodeData(Tree: TVirtualStringTree;Node: PVirtualNode; const Text: WideString);
var
NodeData: PTreeData;
begin
NodeData := Tree.GetNodeData(Node);
Initialize(NodeData^);
NodeData.Text := Text;
end;
经过很长时间我找到了解决问题的方法。 您需要在程序 setNodeControlVisible 中设置 Rect 的 Right 属性。
转到这个问题并用下面提供的代码替换程序。 在单元格中嵌入虚拟树视图按钮
procedure Form.SetNodeControlVisible(Tree: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex = NoColumn);
var
NodeData: PTreeData;
R: TRect;
begin
NodeData := Tree.GetNodeData(Node);
if Assigned(NodeData) and Assigned(NodeData.Control) then
begin
with NodeData.Control do
begin
Visible := IsNodeVisibleInClientRect(Tree, Node, Column)
and ((Node.Parent = Tree.RootNode) or (vsExpanded in Node.Parent.States));
R := Tree.GetDisplayRect(Node, Column, true);
R.Right := Tree.ClientWidth ;
BoundsRect := R;
end;
end;
end;