我正在尝试创建复合组件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中添加节点,但我不能为它唤起树节点编辑器。
我该怎么办?
感谢名单
答案 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组件(如TPageControl
和TCoolBar
)允许在设计时点击其子标签/按钮/等的方式。
答案 1 :(得分:3)
这是子组件的标准行为。您可以使用TLabeledEdit查看它,您无法使用鼠标选择标签。
如果您想要单独的可选组件,请使用TFrame。