在单元格中嵌入控件

所以,我的最终游戏就是有一种方法,用客户区中的添加/删除按钮列出项目(如vsReport中的TListView)。

例如:

|----------------|
|Old Item 1    X |
|Old Item 2    X |
|Add new item... |
|                |
|----------------|

如果你知道一个没有这些额外工作的组件,请告诉我!

所以我选择了一个红色的关闭“X”,并使用TJvTransparentButton(Jedi Components - JVCL)来显示它。 它处理按/不按状态,只显示图像。 我原来使用了一个TButton,但我并不需要在字形周围的所有绒毛。

现在,我将图像按钮保存在与每个节点关联的记录中。

代码如下:

procedure TfrmMain.AddNewAccount(const Username, Password: String);
var
  Data : PTreeData;
  XNode : PVirtualNode;
Begin
  XNode := vstAccounts.AddChild(nil);
  If vstAccounts.AbsoluteIndex(XNode) > -1 Then
    begin
    Data := vstAccounts.GetNodeData(Xnode);
    Data^.Column0 := Username;
    Data^.Column1 := '';
    Data^.DeleteButton := TJvTransparentButton.Create(nil);
    With Data^.DeleteButton Do
      begin
      Parent := vstAccounts;
      Left := 0;
      Top := 0;
      Width := 16;
      Height := 16;
      Anchors := [];
      AutoGray := False;
      BorderWidth := 0;
      FrameStyle := fsNone;
      Images.ActiveImage := iListView;
      Images.ActiveIndex := 0;
    end;
  end;
end;

在OnAfterCellPaint事件中,我管理图像按钮的位置,如下所示:

procedure TfrmMain.vstAccountsAfterCellPaint(Sender: TBaseVirtualTree;
  TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
  CellRect: TRect);
var
  Data : PTreeData;
begin
  If Column = 1 Then
    begin
    Data := vstAccounts.GetNodeData(Node);
    If Assigned(Data) Then
      begin
      With Data^.DeleteButton Do
        begin
        BoundsRect := CellRect;
      end;
    end;
  end;
end;

现在的问题是,这根本不显示该项目。 我知道TImageList中的图像很好,因为我可以在设计时创建按钮,并且在运行时看起来很好。

我也知道这段代码应该可以工作,因为如果我让TJvTransparentButton成为普通的TButton(不改变代码逻辑),它工作得很好,并且显示出来很好!

我唯一能想到的是TButton从TWinControl继承而TJvTransparentButton继承自TControl。

有任何想法吗?


我假定TJvTransparentButton是一个TGraphicControl,并且作为父类背景的一部分显示(这就是为什么Tlabel总是在同一个父类中位于TEdit或TButton之后的原因)。
TButton是一个TWinControl,因此被绘制在Parent的顶部,并且在同一个Parent中的其他WinControls的上方或下方。

因此,无论是在绘制单元格的常规绘图(更新BoundsRect还不够)之后再次绘制TJvTransparentButton,还是使用WinControl。
例如,使用带有TJvTransparentButton的TPanel应该可以工作。

免责声明:我不熟悉VirtualStringTree和TJvTransparentButton ...


你以错误的方式做这件事。 您必须为实现IVTEditLink接口的TVirtualStringTree编写自己的编辑器。 然后在OnCreateEditor事件中,您需要创建您的编辑器:

procedure TForm1.VSTCreateEditor(Sender: TBaseVirtualTree;
  Node: PVirtualNode; Column: TColumnIndex; out EditLink: IVTEditLink);
begin
  EditLink:=TStringEditLink.Create;
end;

你可以在这里获得更多信息。

链接地址: http://www.djcxy.com/p/35025.html

上一篇: Embedding Controls In Cells

下一篇: Is it possible to display one object multiple times in a VirtualStringTree?