2012-06-11 16 views
8

Jeśli chcę zastąpić komponent VCL TXxx, czy powinienem oprzeć mój komponent na TXxx lub TCustomXxx?Jakiej klasy bazowej użyć podczas tworzenia składnika Delphi VCL?

szukam do drop-in zamienniki dla różnych komponentów edycji tekstu (TEdit, TMemo, etc.) mają WM_PASTE ładowarki do dezynfekcji wejść do back-end, który jest bardzo wrażliwy na to, co będzie przyjmować (w zasadzie tylko 7-bitowe glify ASCII do wydrukowania, spacje i pary CR/LF ... nawet znaki tabulacji nie są do zaakceptowania). Te nowe komponenty muszą przejść do istniejącej aplikacji, a ja nie chcę robić niczego, czego nie muszę koniecznie robić, aby działały dokładnie tak, jak robią to stare, z wyjątkiem domyślnego sposobu wklejania.

Zrobiłem jeden oparty na TMemo i wydaje się, że działa, ale tak czy inaczej mam wrażenie, że zalecanym podejściem byłoby użycie TCustomMemo. Czy jest coś, czego mi brakuje?

Odpowiedz

16

Zgodnie z konwencją różnica między TSomething i TCustomSomething polega na tym, że ta ostatnia ma niewiele lub bardzo niewiele opublikowanych właściwości, aby można było wybrać, które z nich zostaną opublikowane. W przeciwnym razie nie powinno być żadnych różnic.

+0

Dzięki, właśnie to miałem nadzieję usłyszeć. – wades

0

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

enter image description here

TMemo jest tylko 'wrapper' do kontroli TCustomMemo. Możesz użyć obu, ale ja lubię używać wersji niestandardowej, ponieważ pochodzą one z niewizualnego komponentu.

Jeśli chcesz zastąpić komponenty w przyszłych projektach, możesz zbudować moduł danych wokół kontrolki i zarządzać jego właściwościami w obrębie modułu danych. Po wymianie wystarczy zmienić sposób, w jaki moduł danych obsługuje komponent, a nie każdy komponent w projekcie.

-1

Innym rozwiązaniem byłoby po prostu podklasy odpowiednie składniki tak:

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. 

Wtedy ważne jest, aby dodać SubClassedControls jednostkowe za urządzeniem StdCtrls w klauzuli uses formularza. W ten sposób można nadal używać istniejących standardowych elementów sterujących, ale w czasie wykonywania aplikacja będzie faktycznie używać kontrolek podklasowanych. W przypadku istniejącej aplikacji z dużą ilością elementów sterujących może to być łatwiejszy sposób zmiany zachowania kontrolek.

+0

-1, ponieważ nie przeczytałeś pytania. Sugerujesz robienie dokładnie tego, o czym mówiłem, i nie zwracałem uwagi na część, której nie rozumiałem. – wades

+0

@wades, przepraszam, moja odpowiedź była tylko odpowiedzią na "... i nie chcę robić niczego, czego nie muszę koniecznie robić, aby działały dokładnie tak, jak zrobiły to stare, z wyjątkiem domyślne zachowanie pasty. ".I nadal uważam, że moje rozwiązanie jest jak dotąd najprostsze dla twojego problemu. Oczywiście możesz wymieniać setki kontrolek z własną wersją TMyEdit pochodzącą z TCustomEdit itp., Ale jest to o wiele bardziej kłopotliwe IMO. – iamjoosy

1

Sposób Zawsze rozumieć pojęcie konieczności TSomething i TCustomSomething jest podczas tworzenia własnego dziedzictwa, powiedzmy TButton do własnych nazywa TMyBytton. Załóżmy, że chcesz ukryć właściwość, na przykład Caption (zakładając, że nie chcesz tekstu). W przypadku TButton nie można ukryć tej właściwości. Ale używając TCustomButton, możesz opublikować, które kiedykolwiek właściwości chcesz być widoczne w inspektorze obiektów i wykluczyć te, które nie chcesz zobaczyć. Po opublikowaniu nieruchomości nie można jej nie opublikować w kolejnych dziedziczonych klasach.

Powiązane problemy