2011-09-16 27 views
7

Tôi đã tạo thành phần có nguồn gốc từ TCustomPanel. Trên bảng điều khiển đó, tôi có một thuộc tính được xuất bản của một lớp có nguồn gốc từ TOwnedCollection. Tất cả đều hoạt động tốt và nhấp vào dấu ba chấm trong trình kiểm tra đối tượng cho thuộc tính đó mở trình chỉnh sửa bộ sưu tập mặc định, nơi tôi có thể quản lý TCollectionItems trong danh sách.Cách gọi trình soạn thảo thuộc tính của thành phần tại thời điểm thiết kế

TMyCustomPanel = class(TCustomPanel) 
    private 
    ... 
    published 
    property MyOwnedCollection: TMyOwnedCollection read GetMyOwnedCollection write SetMyOwnedCollection; 
    end; 

Tôi cũng muốn có thể nhấp đúp vào bảng điều khiển tại thời điểm thiết kế và mở trình chỉnh sửa bộ sưu tập theo mặc định. Tôi đã bắt đầu bằng cách tạo một lớp có nguồn gốc từ TDefaultEditor và đăng ký nó.

TMyCustomPanelEditor = class(TDefaultEditor) 
    protected 
    procedure EditProperty(const PropertyEditor: IProperty; var Continue: Boolean); override; 
    end; 

    RegisterComponentEditor(TMyCustomPanel, TMyCustomPanelEditor); 

Điều này dường như chạy đúng lúc, nhưng tôi bị kẹt về cách khởi chạy trình chỉnh sửa thuộc tính cho bộ sưu tập tại thời điểm đó.

procedure TMyCustomPanelEditor.EditProperty(const PropertyEditor: IProperty; var Continue: Boolean); 
begin 
    inherited; 

    // Comes in here on double-click of the panel 
    // How to launch collection editor here for property MyOwnedCollection? 

    Continue := false; 
end; 

Bất kỳ giải pháp hoặc cách tiếp cận khác sẽ được đánh giá cao.

Trả lời

9

Bạn hiện không sử dụng trình chỉnh sửa chính xác, cho đến khi tôi có thể biết. TDefaultEditor được mô tả như sau:

Một biên tập cung cấp hành vi mặc định cho đôi nhấp chuột đó sẽ lặp qua các thuộc tính tìm kiếm các tài sản phương pháp thích hợp nhất để chỉnh sửa

Đây là một trình soạn thảo đáp ứng nhấp đúp vào biểu mẫu bằng cách thả bạn vào trình chỉnh sửa mã với trình xử lý sự kiện mới được tạo. Hãy suy nghĩ về những gì sẽ xảy ra khi bạn nhấp đúp vào một số TButton và bạn bị rơi vào trình xử lý OnClick.

Đã lâu rồi kể từ khi tôi viết một trình soạn thảo thời gian thiết kế (tôi hy vọng bộ nhớ của tôi đang hoạt động hôm nay) nhưng tôi tin rằng trình soạn thảo của bạn nên được lấy từ TComponentEditor. Để hiển thị trình chỉnh sửa bộ sưu tập, bạn gọi ShowCollectionEditor từ đơn vị ColnEdit.

Bạn có thể ghi đè phương thức EditTComponentEditor và gọi ShowCollectionEditor từ đó. Nếu bạn muốn nâng cao hơn, thay vào đó bạn có thể khai báo một số động từ với GetVerbCount, GetVerbExecuteVerb. Nếu bạn làm theo cách này thì bạn mở rộng menu ngữ cảnh và triển khai thực hiện Edit mặc định sẽ thực thi động từ 0.

+1

Xuất phát từ TComponentEditor và triển khai Get/ExecuteVerb để gọi ShowCollectionEditor hoạt động hoàn hảo. Cảm ơn nhiều. – avenmore

+0

Chà, tôi phải thừa nhận rằng tôi hơi ngạc nhiên khi nó thực sự dễ dàng, nó đúng là từ rất lâu rồi khi tôi cuối cùng làm bất cứ điều gì như thế! –

5

Theo câu trả lời đúng của David, tôi muốn cung cấp mã hoàn chỉnh cho thấy Bộ sưu tập cho một tài sản cụ thể của giao diện người dùng kiểm soát khi nó được nhấp đúp vào lúc thiết kế.

type 
    TMyCustomPanel = class(TCustomPanel) 
    private 
    ... 
    published 
    property MyOwnedCollection: TMyOwnedCollection read GetMyOwnedCollection write SetMyOwnedCollection; 
    end; 


    TMyCustomPanelEditor = class(TComponentEditor) 
    public 
    function GetVerbCount: Integer; override; 
    function GetVerb(Index: Integer): string; override; 
    procedure ExecuteVerb(Index: Integer); override; 
    end; 


procedure Register; 
begin 
    RegisterComponentEditor(TMyCustomPanel, TMyCustomPanelEditor); 
end; 

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

function TMyCustomPanelEditor.GetVerb(Index: Integer): string; 
begin 
    Result := ''; 
    case Index of 
    0: Result := 'Edit MyOwnedCollection'; 
    end; 
end; 

procedure TMyCustomPanelEditor.ExecuteVerb(Index: Integer); 
begin 
    inherited; 
    case Index of 
    0: begin 
      // Procedure in the unit ColnEdit.pas 
      ShowCollectionEditor(Designer, Component, TMyCustomPanel(Component).MyOwnedCollection, 'MyOwnedCollection'); 
     end; 
    end; 
end; 
+0

Ví dụ hay! Cảm ơn bạn! – REALSOFO

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