我有一个TCategoryPanel
后代,并希望在其标题区域添加多个控件,例如TComboBox
和TButton
。
我查看了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
容器内,放在标题下,而不是按照预期放在它内部。
现状:
期望状态:
我在这里做错了什么?