2012-06-11 72 views
8

如果我想替換一個VCL組件TXxx應該基於TXxx還是TCustomXxx我的組件?開發Delphi VCL組件時使用什麼基類?

我期待作出直接替代各種文本編輯組件(TEditTMemo等)有WM_PASTE處理程序來淨化輸入後端是什麼它將接受很挑剔(基本上只有7位ASCII可打印的字形,空格和CR/LF對...甚至製表符不可接受)。這些新的組件必須進入現有的應用程序,並且我不想做任何我不一定非要做的事情,以使它們的工作方式與舊版應用程序完全相同,除非非默認粘貼行爲。

我已經做了一個基於TMemo,它似乎工作,但不知何故或其他我有一個印象,推薦的方法將使用TCustomMemo。有什麼我失蹤?

回答

16

按照慣例,TSomething和TCustomSomething之間的區別在於後者沒有或很少發佈屬性,因此您可以選擇自己發佈的屬性。否則應該沒有任何區別。

+0

謝謝,這正是我希望聽到的。 – wades

0

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

enter image description here

TMemo僅僅是一個用於控制TCustomMemo '包裝器'。您可以使用兩者,但我喜歡使用自定義版本,因爲您是從非可視組件導出的。

如果您想在未來的項目中替換組件,您可以在控件周圍構建數據模塊並管理其在數據模塊中的屬性。更換之後,您只需更改datamodule處理組件的方式,而不是更改項目中的每個組件。

-1

另一種選擇是簡單地創建子類的各部件這樣的:

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. 

然後添加單元StdCtrls中後面的單元SubClassedControls形式的用途子句中是重要的。通過這樣做,您可以繼續使用現有的標準控件,但在運行時,您的應用程序將實際使用您的子類控件。如果你有一個有很多控件的現有應用程序,這可能是一個更簡單的方法來改變你的控件的行爲。

+0

-1因爲你沒有看過這個問題。你建議完全按照我所說的去做,而沒有關注我不瞭解的部分。 – wades

+0

@wades,對不起,我的回答只是爲了迴應「......我不想做任何我不絕對必須做的事情,以便讓他們的工作方式與老員工的做法完全相同,默認粘貼行爲「。而且我仍然認爲我的解決方案對於您手頭的問題來說是最簡單的。當然,你可以用你自己的TCustomEdit派生的TMyEdit等來交換數百個控件,但是這更麻煩IMO。 – iamjoosy

1

我一直理解爲具有TSomethingTCustomSomething的概念的方法是,當你創建自己的傳承,讓我們說TButton你自己叫TMyBytton。假設你想隱藏一個屬性,比如Caption(假設你可能不需要文本)。與TButton,你不能隱藏這個屬性。但是使用TCustomButton,您可以發佈想要在對象檢查器中可見的屬性,並排除不想看到的屬性。一旦一個屬性已經發布,它就不能在更多的繼承類中被取消發佈。

相關問題