2012-06-11 29 views
8

Nếu tôi muốn thay thế thành phần VCL TXxx, tôi có nên đặt thành phần của mình trên TXxx hoặc TCustomXxx không?Lớp cơ sở nào để sử dụng khi phát triển thành phần VCL Delphi?

Tôi đang tìm cách thay thế các thành phần chỉnh sửa văn bản (TEdit, TMemo, v.v.) để có bộ xử lý WM_PASTE để khử trùng đầu vào cho back-end rất cầu kỳ về những gì nó sẽ chấp nhận (về cơ bản chỉ các ký tự có thể in ASCII 7 bit, dấu cách và cặp CR/LF ... ngay cả ký tự tab cũng không thể chấp nhận được). Các thành phần mới này phải đi vào một ứng dụng hiện có, và tôi không muốn làm bất cứ điều gì tôi không hoàn toàn phải làm để chúng hoạt động chính xác theo cách cũ, ngoại trừ hành vi dán không mặc định.

Tôi đã thực hiện một dựa trên TMemo và có vẻ như hoạt động, nhưng bằng cách nào đó hoặc cách khác tôi có ấn tượng rằng cách tiếp cận được khuyến nghị sẽ là sử dụng TCustomMemo. Có điều gì tôi đang thiếu?

Trả lời

16

Theo quy ước, sự khác biệt giữa TSomething và TCustomSomething là quy tắc sau không có hoặc rất ít thuộc tính được xuất bản để bạn có thể chọn những thuộc tính nào xuất bản chính mình. Nếu không thì không nên có bất kỳ sự khác biệt nào.

+0

Cảm ơn, đó là những gì tôi đã hy vọng được nghe. – wades

0

TObject -> TPersistent -> TComponent -> TControl -> TWinControl -> TCustomEdit -> TCustomMemo -> TMemo

enter image description here

TMemo chỉ là một 'wrapper' cho sự kiểm soát TCustomMemo. Bạn có thể sử dụng cả hai nhưng tôi thích sử dụng phiên bản Tùy chỉnh vì bạn lấy được từ một thành phần không trực quan.

Nếu bạn muốn thay thế các thành phần trong các dự án trong tương lai, bạn có thể xây dựng một datamodule xung quanh điều khiển và quản lý các thuộc tính của nó trong datamodule. Sau khi thay thế bạn chỉ phải thay đổi cách datamodule xử lý thành phần chứ không phải mọi thành phần trong dự án của bạn.

-1

Một lựa chọn khác sẽ được chỉ đơn giản là phân lớp các thành phần tương ứng như thế này:

unit SubClassedControls; 

interface 

uses StdCtrls, Messages; 

type 

    TEdit = class(StdCtrls.TEdit) 
    private 
    procedure WMPaste(Message: TWMPaste); message WM_PASTE; 
    end; 

implementation 

{ TEdit } 

procedure TEdit.WMPaste(Message: TWMPaste); 
begin 
    // do whatever is necessary 
end; 

end. 

Sau đó, điều quan trọng là để thêm SubClassedControls đơn vị đằng sau những đơn vị StdCtrls trong việc sử dụng khoản của biểu mẫu. Bằng cách này, bạn chỉ có thể tiếp tục sử dụng các điều khiển tiêu chuẩn hiện có, nhưng khi chạy ứng dụng của bạn sẽ thực sự sử dụng các điều khiển được phân lớp của bạn. Trong trường hợp bạn có một ứng dụng hiện có với nhiều điều khiển, đây có thể là cách dễ dàng hơn để thay đổi hành vi của các điều khiển của bạn.

+0

-1 vì bạn không đọc câu hỏi. Bạn đề nghị làm chính xác những gì tôi đang nói, và không chú ý đến phần mà tôi không hiểu. – wades

+0

@ wades, xin lỗi, câu trả lời của tôi chỉ là để đáp lại "... và tôi không muốn làm bất cứ điều gì tôi không hoàn toàn phải làm cho họ làm việc chính xác theo cách cũ, ngoại trừ không hành vi dán mặc định. ".Và tôi vẫn nghĩ rằng giải pháp của tôi là đơn giản nhất cho vấn đề của bạn trong tầm tay. Tất nhiên bạn có thể trao đổi hàng trăm điều khiển với TMyEdit của riêng bạn có nguồn gốc từ TCustomEdit vv, nhưng điều này là nhiều hơn IMO rườm rà. – iamjoosy

1

Cách tôi luôn hiểu khái niệm về việc có TSomethingTCustomSomething là khi bạn tạo quyền thừa kế của riêng mình, giả sử TButton thành của riêng bạn được gọi là TMyBytton. Giả sử bạn muốn ẩn một thuộc tính, chẳng hạn như Caption (giả sử bạn có thể không muốn văn bản). Với số TButton, bạn không thể ẩn thuộc tính này. Nhưng sử dụng TCustomButton, bạn có thể xuất bản bao giờ thuộc tính bạn muốn hiển thị trong thanh tra đối tượng và loại trừ những thuộc tính bạn không muốn xem. Khi một thuộc tính đã được xuất bản, nó không thể không được công bố trong các lớp thừa kế hơn nữa.

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