2012-02-28 39 views
9

Tôi mới tạo thành phần và đã thử nghiệm với việc tạo một số thành phần có nguồn gốc tùy chỉnh của riêng mình bằng cách sử dụng VCL vấn đề tiêu chuẩn từ Delphi.Tạo thành phần - Tham gia các thành phần cùng nhau?

Tôi nghĩ tôi có thể kết hợp hai thành phần với nhau, để tạo ra một số ít. Đi dưới đây những gì tôi có cho đến nay, ý tưởng là để đặt một TImage bên trong một 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. 

Nếu tôi biên dịch và cài đặt trên vào một gói, kết quả được như hình dưới đây:

enter image description here

enter image description here

vấn đề

Tôi muốn thành phần của mình được đăng ký là một thành phần duy nhất. Nhưng thành phần phải là sự kết hợp của cả TScrollBox và TImage. Thành phần chính sẽ là TScrollBox, nhưng bây giờ nó sẽ có quyền truy cập vào các thuộc tính và sự kiện vv của TImage.

Ví dụ, TMyPanel có thể chia sẻ các thuộc tính của TImage và TScrollBox với nhau:

  • AutoSize
  • BorderStyle
  • HorzScrollBar
  • ParentBackground
  • Hình
  • VertScrollBar

Tôi nghĩ rằng nó sẽ là quá mức cần thiết để viết hoàn toàn một thành phần mới để thực hiện hành vi được mô tả ở trên, điều đó và tôi thực sự sẽ không biết bắt đầu từ đâu. Nếu điều này có thể được thực hiện, bạn có thể tạo một số thành phần thú vị được kết hợp thành một, nhưng giữ nguyên các thuộc tính, phương thức và sự kiện ban đầu, v.v.

Đây là những gì tôi muốn đạt được ở đây với một TImage bên trong TScrollBox.

Giải pháp

Câu trả lời thể hiện bởi Uwe Raabe công trình như mong đợi. TImage hiện đã được đăng ký bên trong TScrollBox, nhưng xuất hiện dưới dạng một thành phần. Các thuộc tính của TImage được hiển thị trong Object Inspector dưới dạng Image. > Mà sẽ tiết lộ các thuộc tính của TImage :)

+4

Lưu ý rằng bạn phải cung cấp 'Self' như chủ sở hữu của thành phần phụ. Sử dụng cùng một chủ sở hữu với 'TMyPanel' sẽ dẫn đến các vấn đề về ô nhiễm và phát tán DFM. – NGLN

+1

Thật vậy, bạn vẫn không hiểu đúng. Xem câu trả lời cập nhật của tôi. –

+0

+1 cảm ơn bạn Uwe đã cho thấy một ví dụ. –

Trả lời

12

Bạn nên làm cho hình ảnh một tiểu hợp phần của TMyPanel: SetSubComponent

Cập nhật: Dưới đây là một ví dụ

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 Cảm ơn bạn đã trả lời nhanh, tôi có cảm giác có thể có điều gì khác mà tôi cần phải làm. Hãy để tôi có một cái nhìn tại bài viết này một số chi tiết .. –

+0

Với cách tiếp cận được hiển thị ở trên thuộc tính Hình ảnh đã xuất bản sẽ hiển thị và có thể mở rộng trong Trình kiểm tra đối tượng. –

+2

Tôi khuyên bạn nên đặt tên cho thành phần phụ. Ngay bây giờ thanh tra đối tượng sẽ hiển thị _MyPanel._, nhưng nó có thể trông giống như _MyPanel.SubImage_. – NGLN

Các vấn đề liên quan