如何在 Delphi 5 中的虚拟节点内设置面板的宽度

问题描述 投票:0回答:1

对于我在公司的项目,我应该实现一个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;
delphi delphi-5 tvirtualstringtree
1个回答
0
投票

经过很长时间我找到了解决问题的方法。 您需要在程序 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;
© www.soinside.com 2019 - 2024. All rights reserved.