我已經在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中。
我知道這與設置父屬性MenuPanel做,但構造函數採用TComponent *所有者參數,它的形式。然而面板可以放置在面板內,面板內,標籤放置在正確的面板上。
有沒有人遇到過同樣的問題?
非常感謝您的回答。我遇到了另一種解決方案來解決父母的設計和運行時間問題。重寫CreateParams,調用基類並從中檢索WndParent。 – loonighan