2013-07-10 25 views
3

我正在嘗試創建複合組件TTreePage(後代形式TCustomControl)。它應該包含3個子組件:Treeview(TTreeview)align:= alLeft,Splitter(TSplitter)align:= alLeft和Container(TPanel)align:= alClient。在設計時訪問子組件屬性

這裏是contstructor:

constructor TTreePage.Create(AOwner: TComponent); 
begin 
    inherited; 
    FTreeview := TTreeView.Create(self); 
    FTreeview.SetSubComponent(True); 
    InsertControl(FTreeview); 
    FSplitter := TSplitter.Create(self); 
    FSplitter.SetSubComponent(True); 
    FSplitter.Width := 3; 
    FSplitter.Color := clBlack; 
    InsertControl(FSplitter); 
    FContainer:= TPanel.Create(Self); 
    FContainer.SetSubComponent(True); 
    FContainer.BevelInner := bvNone; 
    FContainer.BevelOuter := bvNone; 
    FContainer.Color := clYellow; 
    InsertControl(FContainer); 
    RefreshLayout; // this performs alignment of subcomponents 
end; 

這裏是創建PARAMS過程:

procedure TTreePage.CreateParams(var Params:TCreateParams); 
begin 
    inherited; 
    Params.Style := Params.Style + WS_EX_CONTROLPARENT; 
    ControlStyle := ControlStyle + [csAcceptsControls, csCaptureMouse, csOpaque]; 
end; 

整個組件表現爲一個單塊。我無法通過鼠標選擇任何子組件(TTreeview,TSplitter或TPanel)。是的,我可以在Object Inspector中編輯它們的屬性,但我不能編輯例如TTreeview的寬度或拖動TSplitter。對我來說最重要的是在設計時在TTreeview中添加節點,但是我無法爲它調用Tree節點編輯器。

我該怎麼辦?

Thanx

回答

3

這是子組件的標準行爲。你可以用TLabeledEdit看到它,你不能用鼠標選擇標籤。

如果您希望單獨的可選組件使用TFrame。

5

TTreePage組件處理CM_DESIGNHITTEST消息,該消息提供用於單擊的鼠標座標。如果這些座標位於要單擊的子組件上,請將消息的結果設置爲1,否則設置爲0(或致電inherited)。當返回1時,鼠標點擊被傳遞給子組件進行進一步處理。由於您的整個客戶區域覆蓋在要點擊子,只是返回1無條件的,如:

type 
    TTreePage = class(TCustomControl) 
    private 
    ... 
    procedure CMDesignHitTest(var Message: TCMDesignHitTest); message CM_DESIGNHITTEST; 
    ... 
    end; 

procedure TTreePage.CMDesignHitTest(var Message: TCMDesignHitTest); 
begin 
    Message.Result := 1; 
end; 

這是怎麼了一些本地VCL組件,如TPageControlTCoolBar,允許他們的子標籤/按鈕/等在設計時可點擊。

+0

你的建議看起來很有希望,但是當我將它添加到我的代碼中時,它似乎不會簡單地啓動。我在程序中放置了showmessage,我點擊,一遍又一遍地移動鼠標,但沒有發生任何事情。 – lyborko