Запретить Delphi IDE создавать значки компонентов во время разработки - PullRequest
6 голосов
/ 22 ноября 2010

Я создал пользовательский элемент управления TOuterControl, который является родительским для нескольких TInnerControls.

Все работает нормально, за исключением того, что в среде IDE создаются значки для каждого дочернего элемента TInnerControl (InnerControl1 и InnerControl2 на снимке экрана). Как предотвратить создание значков в среде IDE?

alt text

unit TestControl;

interface

Procedure Register;

implementation

Uses
    Classes,
    Controls,
    SysUtils,
    DesignEditors,
    DesignIntf,
    VCLEditors;

Type

TOuterControl = Class;

TInnerControl = Class(TComponent)
Protected
    FOuterControl : TOuterControl;

    function GetParentComponent: TComponent; Override;
    Function HasParent : Boolean; Override;
    procedure SetParentComponent                  (Value: TComponent); Override;
End;

TOuterControl = Class(TCustomControl)
Protected
    FInnerControls : TList;

    Procedure Paint; Override;
Public
    Constructor Create(AOwner : TComponent); Override;
    Procedure AddInnerControl(AInnerControl : TInnerControl);
    procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override;
End;

TOuterControlEditor = Class(TDefaultEditor)
Public
    Procedure ExecuteVerb(Index : Integer);          Override;
    Function  GetVerb    (Index : Integer) : String; Override;
    Function  GetVerbCount      : Integer;           Override;
End;

procedure TOuterControl.AddInnerControl(AInnerControl: TInnerControl);
begin
    AInnerControl.FOuterControl := Self;;
    FInnerControls.Add(AInnerControl);
    Invalidate;
end;

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

    FInnerControls := TList.Create;
end;

procedure TOuterControl.GetChildren(Proc: TGetChildProc; Root: TComponent);
var
    I : Integer;
begin
    inherited;

    For I := 0 To FInnerControls.Count - 1 Do
        Proc(FInnerControls[I]);
end;

procedure TOuterControl.Paint;
begin
    inherited;

    Canvas.FillRect(ClientRect);
    Canvas.TextOut(0,0, Format('Inner Control Count = %d', [FInnerControls.Count]));
end;

function TInnerControl.GetParentComponent: TComponent;
begin
    Result := FOuterControl;
end;

function TInnerControl.HasParent: Boolean;
begin
    Result := True;
end;

procedure TInnerControl.SetParentComponent(Value: TComponent);
begin
    If Value Is TOuterControl Then
        If FOuterControl <> Value Then
    Begin
        FOuterControl := TOuterControl(Value);
        FOuterControl.AddInnerControl(Self);
    End;
end;

procedure TOuterControlEditor.ExecuteVerb(Index: Integer);
Var
    OuterControl : TOuterControl;
    InnerControl : TInnerControl;
begin
    inherited;

    OuterControl := TOuterControl(Component);

    If Index = 0 Then
    Begin
        InnerControl := TInnerControl.Create(OuterControl.Owner);
        OuterControl.AddInnerControl(InnerControl);
    End;
end;

function TOuterControlEditor.GetVerb(Index: Integer): String;
begin
    Result := 'Add Inner';
end;

function TOuterControlEditor.GetVerbCount: Integer;
begin
    Result := 1;
end;

Procedure Register;
Begin
    RegisterComponents('AA', [TOuterControl]);
    RegisterComponentEditor(TOuterControl, TOuterControlEditor);
End;


Initialization
    Classes.RegisterClasses([TInnerControl]);

end.

Ответы [ 3 ]

7 голосов
/ 22 ноября 2010

Вы можете запретить их появление в форме с помощью:

RegisterNoIcon([TInnerControl]);

Более подробную информацию о RegisterNoIcon можно найти по адресу http://docwiki.embarcadero.com/VCL/e/index.php/Classes.RegisterNoIcon

Немного сбивает с толку наличие классов с именем, котороезаканчивается "Control", которые не являются обычными визуальными элементами управления.

5 голосов
/ 23 ноября 2010

Если TInnerControl предназначен для использования только внутри TOuterControl, вам следует вызвать SetSubComponent (True) во время / после создания TInnerControl.

4 голосов
/ 22 ноября 2010

Когда вы создаете внутренние элементы управления, вы говорите им, что их владельцем является форма (владелец внешнего элемента управления). Поэтому форма рисует их так же, как и все остальные компоненты, которыми она владеет. Вы, вероятно, хотите, чтобы внешний контроль владел внутренними.

...