2014-06-25 46 views
0

我已經在XE5中創建了兩個用戶組件。第一個是TCustomPanel的後代,其目的是作爲第二個組件的容器,它是TCustomLabel的後代。在用戶組件中設置父項

該容器。

class PACKAGE TMenuPanel : public TCustomPanel 
{ 
private: 
protected: 
public: 
    __fastcall TMenuPanel(TComponent* Owner); 
__published: 
    __property Align; 
    __property Caption; 
}; 

static inline void ValidCtrCheck(TMenuPanel *) 
{ 
    new TMenuPanel(NULL); 
} 
//--------------------------------------------------------------------------- 
__fastcall TMenuPanel::TMenuPanel(TComponent* Owner) 
    : TCustomPanel(Owner) 
{ 
} 
//--------------------------------------------------------------------------- 
namespace Menupanel 
{ 
    void __fastcall PACKAGE Register() 
    { 
     TComponentClass classes[1] = {__classid(TMenuPanel)}; 
     RegisterComponents(L"Isis", classes, 0); 
    } 
} 

包含。

//--------------------------------------------------------------------------- 
class PACKAGE TMenuLabel : public TCustomLabel 
{ 
private: 
    UnicodeString FOption; 
    int    FIndex; 
    bool   FHighlighted; 
protected: 
    UnicodeString __fastcall GetOption(); 
    void   __fastcall SetOption(UnicodeString Option); 
    int    __fastcall GetIndex(); 
    void   __fastcall SetIndex(int Index); 
    void   __fastcall SetHighlighted(bool Flag); 
    void   __fastcall RecaptionLabel(); 
public: 
    __fastcall TMenuLabel(TComponent* Owner); 
__published: 

    __property int   Index = {read=GetIndex, write=SetIndex, nodefault}; 
    __property UnicodeString Option = {read=GetOption, write=SetOption, nodefault}; 
    __property bool   Highlighted = {read=FHighlighted, write=SetHighlighted, nodefault}; 
}; 

static inline void ValidCtrCheck(TMenuLabel *) 
{ 
    new TMenuLabel(NULL); 
} 
//--------------------------------------------------------------------------- 
__fastcall TMenuLabel::TMenuLabel(TComponent* Owner) 
    : TCustomLabel(Owner) 
{ 
    if (!Name.IsEmpty()) { 
     FOption = L"Option"+Name; 
    } else { 
     FOption = L"Option"; 
    } 
    FHighlighted = false; 
} 

到目前爲止好,組件安裝,他們出現在調色板和他們的屬性在檢查。但是...

如果將MenuPanel放置在窗體上,則將MenuLabels放置在其中。如果將它放置在窗體中的面板上,則菜單標籤將放置在面板中。有趣的是,如果在窗體中放置的MenuPanel被剪切並粘貼在面板上,則MenuLabels位於MenuPanel中。

MenuLabels in MenuPanels

我知道這與設置父屬性MenuPanel做,但構造函數採用TComponent *所有者參數,它的形式。然而面板可以放置在面板內,面板內,標籤放置在正確的面板上。

有沒有人遇到過同樣的問題?

回答

0

當您在窗體設計器拖放組件,其Parent成爲當前焦點的組件(如果ControlStyle包含csAcceptsControls,否則其Parent來代替,依此類推,直到csAcceptsControls找到)。因此,請確保您的MenuPanel組件在其構造函數中啓用了csAcceptsControls標誌,並且在放棄MenuLabel對象時在表單設計器中選擇了您的MenuPanel。

+0

非常感謝您的回答。我遇到了另一種解決方案來解決父母的設計和運行時間問題。重寫CreateParams,調用基類並從中檢索WndParent。 – loonighan

0

我需要對組件父項的引用,因爲它具有特定子組件字體顏色的值。 ParentFont提供FontName,Size,Styles,但容器爲特定的TStaticText派生組件定義字體顏色屬性。

的容器定義:

MESSAGE void __fastcall MPIntHandler(TMyIntMessage &Msg); 
BEGIN_MESSAGE_MAP 
    MESSAGE_HANDLER(IC_GETCOLOR, TMyIntMessage, MPIntHandler); 
END_MESSAGE_MAP(TComponent) 


//--------------------------------------------------------------------------- 
void __fastcall TMenuPanel::MPIntHandler(TMyIntMessage &Msg) 
{ 
    WPARAM WP = *Msg.wparam; 
    WORD lWord = LOWORD(WP); 
    if (lWord == CLR_LABEL) { 
     OutputDebugStringA("Returning FLabelColor"); 
     Msg.Result = (long)FLabelColor; 
    } else { 
     OutputDebugStringA("lWord != CLR_LABEL"); 
     Msg.Result = (long)clRed; 
    } 
} 

孩子覆蓋的CreateParams:

//--------------------------------------------------------------------------- 

    void __fastcall TMenuLabel::CreateParams(TCreateParams &Params) 
    { 
    int wParam = MAKEWPARAM(CLR_LABEL,0); 
    int lParam = 0; 

     OutputDebugStringA("CreateParams"); 
     TStaticText::CreateParams(Params); 
     if (Params.WndParent != NULL) { 
      hwndParent = Params.WndParent; 
      LRESULT lRes = SendGetIntMessage(hwndParent,IC_GETCOLOR,wParam,lParam); 
      Font->Color = (TColor)lRes; 
     } 
    } 

這在設計作品都和運行時間。