实现 TComponentEditor 的自定义 Firemonkey 组件。在设计时将子控件添加到父控件

Custom Firemonkey Component that implements TComponentEditor. Add child control to parent at design time

我有一个自定义的 FireMonkey 控件 (TComboBox),它也有一个自定义的 TComponentEditor。当我覆盖 ExecuteVerb 方法并尝试添加子组件(自定义 TListBoxControl)自定义 TComboBox 时,它在设计时 shown

默认 TComboBox 行为:

自定义 TComboBox

我的 ExecuteVerb 代码:

var
  PpComboItem : TPpListBoxItem;
  PpCombo: TPpComboBox;
begin
  if (Component is TPpComboBox) then
    PpCombo := (Component as TPpComboBox) else
      exit;

  PpComboItem := TPpListBoxItem.Create(PpCombo);
  PpComboItem.Parent := PpCombo;
end

我试图追踪 TComboBox 尝试执行此操作的方式,但似乎无法找到具有正确实现的单元

** 编辑 **

好的 - 我已经设法了解了 TMS 的人是如何使用他们的组件(购买并支付的)实现这一目标的,并且我已经设法推断出以下内容

var
  PpComboItem : TPpListBoxItem;
  PpCombo: TPpComboBox;
begin
  inherited;
  if (Component is TPpComboBox) then
    PpCombo := (Component as TPpComboBox) else
      exit;

  PpComboItem := (TPpListBoxItem(Designer.CreateComponent(TPpListBoxItem,  PpCombo, 10, 10, 100, 100)));
  PpComboItem.Parent := PpCombo;
  Designer.Modified;
end;

但是当我在 ComponentEditor 中单击 AddTPpListBoxItem 时,出现以下错误:

Class TPpListBoxItem is not applicable to this module

我找到了答案。要实现此功能,您需要

确保您尝试作为子项添加到父项的组件也已注册:

USES TPpListBoxItem.pas, TPpComboBox.pas, DesignIntf, DesignEditors

//TComponentEditor Type Decleration //

procedure Register;
begin
  RegisterComponents('Sample', [TPpListBoxItem]);
  RegisterComponents('Sample', [TPpComboBox]);
  RegisterComponentEditor(TPpComboBox, TComboComponentEditor);
end;

覆盖Parent Component的TComponentEditor的ExecuteVerb方法(在我的问题第一次编辑的地方找到代码):

基本上肉是:

...
PpComboItem := (TPpListBoxItem(Designer.CreateComponent(TPpListBoxItem, PpCombo, 10, 10, 100, 100)));
PpComboItem.Parent := PpCombo;
Designer.Modified;
...

瞧!