这里有一个VCL组件新手,所以请原谅我这是一个愚蠢的问题......
我试图在放到表单上时使用默认项目制作一个TComboBox组件,即在表单上删除时,将在其项目列表中包含月份列表的TMonthComboBox。
我发现在构建期间尝试访问Items属性会导致" 控制''没有父窗口"如果我尝试在表单上删除这样的组合框,则会出错。
这是(部分)构造函数:
__fastcall TMonthCombo::TMonthCombo(TComponent *Owner):TComboBox(Owner)
{
this->Style = csDropDownList; // this is okay
this->Items->Add("January"); // This is causing problem
}
我认为问题源于这样一个事实,即物品属性在构造的这一点上还不可用。
无论如何确保组件已准备好在组件源代码本身内接受其Items属性的值(即在设计时不在属性编辑器中添加列表项)?
在有人告诉我&#34之前;只需在运行时添加应用程序代码中的项目",我必须解释这个ComboBox将在很多地方频繁使用,而月选择只是一个简单的我用来解释这个问题的例子,我想要放在ComboBox中的实际值更加多样化,而且大部分时间都是动态的。它还必须以各种方式响应用户选择。
我尝试过运行时的方式,但它变得非常繁琐。这就是我将它变成一个组件的原因,这样它就可以自行处理,而不必重复输入多个版本的代码来填充组合框。
感谢您的帮助。
编辑:经过尝试manlio的解决方案后,ComboBox在运行时看起来很奇怪:
ComboBox在运行时具有双重图像。我做错了什么?
__fastcall TYearCombo::TYearCombo(TComponent* Owner) : TComboBox(Owner), init_items(true)
{
}
//---------------------------------------------------------------------------
void __fastcall TYearCombo::CreateWnd()
{
unsigned short yr, mn, dy;
this->Width = 90;
this->Style = csDropDownList;
this->DropDownCount = 11;
TDate d = Today();
d.DecodeDate(&yr, &mn, &dy);
year = yr;
if (init_items)
{
init_items = false;
TComboBox::CreateWnd();
Items->BeginUpdate();
for(int i=year-5; i<=year+5; i++)
{
Items->Add(IntToStr(i));
}
this->ItemIndex = 5;
Items->EndUpdate();
}
}
//---------------------------------------------------------------------------
答案 0 :(得分:-1)
你可以试试这个:
覆盖CreateWnd
虚拟方法并添加init_items
私有数据成员:
class TMonthCombo : public TComboBox
{
// ...
protected:
virtual void __fastcall CreateWnd();
private:
bool init_items;
// ...
};
设置init_items
标志:
TMonthCombo::TMonthCombo(TComponent *Owner) : TComboBox(Owner),
init_items(true)
{
// ...
}
在CreateWnd
内,您可以添加新项目:
void __fastcall TMonthCombo::CreateWnd()
{
TComboBox::CreateWnd();
if (init_items)
{
init_items = false;
Items->BeginUpdate();
Items->Add("January");
// ...
Items->EndUpdate();
}
}
补充说明:
TComboBox
需要分配HWND
才能在其Items
属性中存储字符串。只需将构造函数的Owner
参数强制转换为TWinControl
,然后将结果分配给组件的Parent
属性 isn&#39;解决方案:
TMonthCombo::TMonthCombo(TComponent *Owner) : TComBoBox(Owner)
{
Parent = static_cast<TWinControl *>(Owner);
// ...
}
该作业解决了&#34; Control没有父窗口错误&#34; 但又产生了另一个问题:表单始终是组件的父级(您无法将表单添加到一个不同的容器)。