2012-02-28 3 views
9

Я новичок в создании компонентов и экспериментировал с созданием некоторых собственных собственных производных компонентов, используя стандартный выпуск VCL из Delphi.Создание компонента - Объединение компонентов вместе?

Я думал, что смогу объединить два компонента вместе, чтобы создать один единственный. Возьмите ниже того, что я до сих пор, идея заключается в том, чтобы положить TImage внутри TScrollBox:

unit MyComponent; 

interface 

uses 
    Windows, 
    Classes, 
    Controls, 
    Forms, 
    ExtCtrls; 

type 
    TMyPanel = class(TScrollBox) 
    public 
    constructor Create(AOwner: TComponent); override; 
    destructor Destroy; override; 
    end; 

procedure Register; 

implementation 

procedure Register; 
begin 
    RegisterComponents('Standard', [TMyPanel]); 
end; 

{ TMyPanel } 

constructor TMyPanel.Create(AOwner: TComponent); 
var 
    AImage: TImage; 
begin 
    inherited Create(AOwner); 

    AImage := TImage.Create(AOwner); 
    AImage.Align := alClient; 
    AImage.Parent := Self; 
end; 

destructor TMyPanel.Destroy; 
begin 
    inherited; 
end; 

end. 

Если я скомпилировать и установить выше в пакет, то результат, как показано ниже:

enter image description here

enter image description here

Проблема

Я хочу, чтобы мой компонент регистрировался как один компонент. Но компонент должен быть комбинацией как TScrollBox, так и TImage. Основным компонентом будет TScrollBox, но теперь он должен иметь доступ к свойствам и событиям и т. Д. TImage.

Например, TMyPanel может разделить свойства TImage и TScrollBox вместе:

  • Авторазмер
  • BorderStyle
  • HorzScrollBar
  • ParentBackground
  • Изображение
  • VertScrollBar

Я думаю, что было бы излишним полностью написать новый компонент, чтобы выполнить описанное выше поведение, и я действительно не знаю, с чего начать. Если это можно сделать, вы можете создать несколько интересных компонентов, которые объединены в один, но сохраните исходные свойства, методы и события и т. Д.

Это то, чего я хочу достичь здесь с помощью TImage внутри TScrollBox.

Решение

Ответа проявленных Уве Рааб работает, как ожидалось. TImage теперь зарегистрирован внутри TScrollBox, но отображается как один компонент. Свойства TImage показаны в Object Inspector как изображение. > Который раскроет свойства TImage :)

+4

Обратите внимание, что вы должны предоставить 'Self', как владелец подкомпонента. Использование того же владельца, что и у TMyPanel, приведет к проблемам с загрязнением и потоками DFM. – NGLN

+1

Действительно, вы все еще не поняли. См. Мой обновленный ответ. –

+0

+1 спасибо вам за показ примера. –

ответ

12

Вы должны сделать изображение подкомпонентой TMyPanel: SetSubComponent

Update: Вот пример

unit MyComponent; 

interface 

uses 
    System.Classes, 
    VCL.Controls, 
    VCL.Forms, 
    VCL.ExtCtrls; 

type 
    TMyPanel = class(TScrollBox) 
    private 
    FImage: TImage; 
    public 
    constructor Create(AOwner: TComponent); override; 
    destructor Destroy; override; 
    published 
    property Image: TImage read FImage; 
    end; 

procedure Register; 

implementation 

procedure Register; 
begin 
    RegisterComponents('Standard', [TMyPanel]); 
end; 

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

    FImage := TImage.Create(Self); 
    FImage.SetSubComponent(true); 
    FImage.Align := alClient; 
    FImage.Parent := Self; 
end; 

destructor TMyPanel.Destroy; 
begin 
    inherited; 
end; 

end. 
+0

+1 Спасибо за быстрый ответ, у меня было ощущение, что может быть что-то еще, что мне нужно сделать. Позвольте мне взглянуть на эту статью еще немного. –

+0

С приведенным выше подходом опубликованное свойство изображения должно быть видимым и расширяемым в Инспекторе объектов. –

+2

Советую назвать субкомпонент. Сейчас инспектор объектов покажет _MyPanel._, но он может выглядеть как _MyPanel.SubImage_. – NGLN

Смежные вопросы