2012-02-28 33 views
9

Soy nuevo en la creación de componentes y estaba experimentando con la creación de algunos de mis propios componentes derivados utilizando el estándar VCL de Delphi.Creación de componentes: ¿unir componentes juntos?

Pensé que podría mezclar dos componentes juntos, para crear uno singular. Tome por debajo de lo que tengo hasta ahora, la idea es poner una TImage dentro de un 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. 

Si compilar e instalar lo anterior en un paquete, el resultado es como se muestra a continuación:

enter image description here

enter image description here

Problema

Me gustaría que mi componente se registre como un solo componente. Pero el componente debe ser una combinación de TScrollBox y TImage. El componente principal será el TScrollBox, pero ahora debería tener acceso a las propiedades y eventos, etc. del TImage también.

Por ejemplo, TMyPanel podría compartir las propiedades de TImage y TScrollBox juntos:

  • AutoSize
  • BorderStyle
  • HorzScrollBar
  • ParentBackground
  • Imagen
  • VertScrollBar

Creo que sería excesivo escribir completamente un nuevo componente para realizar el comportamiento descrito anteriormente, eso y realmente no sabría por dónde empezar. Si esto se puede lograr, puede crear algunos componentes interesantes que se combinan en uno, pero mantener allí las propiedades, métodos y eventos originales, etc.

Esto es lo que quiero lograr aquí con un TImage dentro de un TScrollBox.

Solución

La respuesta mostrada por Uwe Raabe funciona como se espera. El TImage ahora está registrado dentro de TScrollBox, pero aparece como un componente. Las propiedades del TImage se muestran en el Inspector de Objetos como Imagen. > Que revelará las propiedades de TImage :)

+4

Tenga en cuenta que debe proporcionar 'Self' como propietario del subcomponente Usar el mismo propietario que el de 'TMyPanel' dará como resultado la contaminación DFM y problemas de transmisión. – NGLN

+1

De hecho, todavía no entendiste bien. Ver mi respuesta actualizada. –

+0

+1 gracias Uwe por mostrar un ejemplo. –

Respuesta

12

Usted debe hacer la imagen un subcomponente de TMyPanel: SetSubComponent

Actualización: Aquí es un ejemplo

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 Gracias por su respuesta rápida, tuve la sensación de que podría haber algo más que deba hacer. Déjenme echar un vistazo a este artículo un poco más ... –

+0

Con el enfoque que se muestra arriba, la propiedad de Imagen publicada debería ser visible y ampliable en el Inspector de Objetos. –

+2

Aconsejo nombrar el subcomponente. En este momento, el inspector de objetos mostrará _MyPanel._, pero podría parecerse a _MyPanel.SubImage_. – NGLN