在设计时访问子组件属性

lyb*_*rko 3 delphi vcl

我正在尝试创建复合组件TTreePage(后代形式TCustomControl).它应该包含3个子组件:Treeview(TTreeview)align:= alLeft,Splitter(TSplitter)align:= alLeft和Container(TPanel)align:= alClient.

这是contstructor:

constructor TTreePage.Create(AOwner: TComponent);
begin
  inherited;
  FTreeview := TTreeView.Create(self);
  FTreeview.SetSubComponent(True);
  InsertControl(FTreeview);
  FSplitter := TSplitter.Create(self);
  FSplitter.SetSubComponent(True);
  FSplitter.Width := 3;
  FSplitter.Color := clBlack;
  InsertControl(FSplitter);
  FContainer:= TPanel.Create(Self);
  FContainer.SetSubComponent(True);
  FContainer.BevelInner := bvNone;
  FContainer.BevelOuter := bvNone;
  FContainer.Color := clYellow;
  InsertControl(FContainer);
  RefreshLayout;  // this performs alignment of subcomponents
end;
Run Code Online (Sandbox Code Playgroud)

这里是创建参数程序:

procedure TTreePage.CreateParams(var Params:TCreateParams);
begin
  inherited;
  Params.Style := Params.Style + WS_EX_CONTROLPARENT;
  ControlStyle := ControlStyle + [csAcceptsControls, csCaptureMouse, csOpaque];
end;
Run Code Online (Sandbox Code Playgroud)

整个组件表现为单个块.我无法通过鼠标选择任何子组件(TTreeview,TSplitter或TPanel).是的,我可以在Object Inspector中编辑它们的属性,但是我无法编辑例如TTreeview的宽度或拖动TSplitter.对我来说最重要的是在设计时在TTreeview中添加节点,但我不能为它唤起树节点编辑器.

我该怎么办?

感谢名单

Rem*_*eau 5

TTreePage组件处理CM_DESIGNHITTEST消息,该消息为单击提供鼠标坐标.如果这些坐标位于要单击的子组件上,请将消息的结果设置为1,否则设置为0(或调用inherited).返回1时,鼠标单击将传递给子组件以进行进一步处理.由于整个客户区域都包含在您要单击的子组件中,因此只需无条件地返回1,例如:

type
  TTreePage = class(TCustomControl)
  private
    ...
    procedure CMDesignHitTest(var Message: TCMDesignHitTest); message CM_DESIGNHITTEST;
    ...
  end;
Run Code Online (Sandbox Code Playgroud)

procedure TTreePage.CMDesignHitTest(var Message: TCMDesignHitTest);
begin
  Message.Result := 1;
end; 
Run Code Online (Sandbox Code Playgroud)

这就是一些原生VCL组件,如TPageControlTCoolBar,允许他们的子标签/按钮/等在设计时可点击.