TCategoryPanel:如何向标题区域添加控件?

时间:2015-09-24 23:44:26

标签: delphi vcl

我有一个TCategoryPanel后代,并希望在其标题区域添加多个控件,例如TComboBoxTButton

我查看了TCustomCategoryPanel代码,根据我的理解,它使用FPanelSurface的消息处理程序TCustomCategoryPanel.CMControlListChanging将控件添加到其内部CM_CONTROLLISTCHANGING容器中

我在我的后代创建了一个类似的消息处理程序:

interface

// ...

TElementsCategoryPanel = class(TCategoryPanel)
  // ...
private
  FObservationTypeSelector: TComboBox;

  procedure CMControlListChanging(var Message: TCMControlListChanging);
    message CM_CONTROLLISTCHANGING;
  // ...
end;

implementation

// ...

constructor TElementsCategoryPanel.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);

  // ...

  FObservationTypeSelector := TComboBox.Create(Self);
  FObservationTypeSelector.Name := 'ObservationTypeSelector';
  FObservationTypeSelector.Parent := Self; // *

  // ...
end;

procedure TElementsCategoryPanel.CMControlListChanging(
  var Message: TCMControlListChanging);
begin
  if not (Message.ControlListItem^.Control = FObservationTypeSelector) then // *
    inherited;
end;

使用断点*来逐步完成逻辑。在FObservationTypeSelector.Parent := Self中设置constructor后,我的CMControlListChanging被调用:

如果Message.ControlListItem^.Control不是我的FObservationTypeSelector组合框,它将通过inherited调用其父函数。

如果Message.ControlListItem^.Control 我的FObservationTypeSelector组合框,它将不执行任何操作,这意味着它将从构造函数中保留其分配。

但代码似乎没有效果。然后在显示面板后定位我的组合框时,将其设置为FObservationTypeSelector.Top := 0它仍然绑定在FPanelSurface容器内,放在标题下,而不是按照预期放在它内部。

现状:

期望状态:

我在这里做错了什么?

0 个答案:

没有答案