在设计时访问子组件属性

时间:2013-07-10 14:23:59

标签: delphi vcl

我正在尝试创建复合组件TTreePage(后代形式TCustomControl)。它应包含3个子组件:Treeview(TTreeview)align:= alLeft,Splitter(TSplitter)align:= alLeft and 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;

这里是创建参数程序:

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

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

我该怎么办?

感谢名单

2 个答案:

答案 0 :(得分:5)

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

type
  TTreePage = class(TCustomControl)
  private
    ...
    procedure CMDesignHitTest(var Message: TCMDesignHitTest); message CM_DESIGNHITTEST;
    ...
  end;

procedure TTreePage.CMDesignHitTest(var Message: TCMDesignHitTest);
begin
  Message.Result := 1;
end; 

这就是某些原生VCL组件(如TPageControlTCoolBar)允许在设计时点击其子标签/按钮/等的方式。

答案 1 :(得分:3)

这是子组件的标准行为。您可以使用TLabeledEdit查看它,您无法使用鼠标选择标签。

如果您想要单独的可选组件,请使用TFrame。