C++:如何使 VCL 组件引用自身?
C++: How do I make a VCL component reference itself?
我在 RAD Studio 10.2 中使用 C++ Builder。我不确定我在标题中问的是否正确,但我想说的是,每当我使用 C++ 关键字 'this' 时,它都会引用我的组件的 Parent我正在尝试访问,但不是组件本身。
例如,下面的代码更改了 Form 的 颜色和字体颜色,而不是 Panel 的 颜色和字体颜色:
void __fastcall TForm1::Panel1MouseEnter(TObject *Sender)
{
this->Color = cl3DLight;
this->Font->Color = clMaroon;
}
此外,如果我执行与上面相同的操作但省略关键字 'this',它仍然会更改窗体的属性而不是面板的属性(请参见下面的代码)。
void __fastcall TForm1::Panel1MouseEnter(TObject *Sender)
{
Color = cl3DLight;
Font->Color = clMaroon;
}
我该如何编码才能访问 面板的 'Color' 和 'Font->Color' 而不是表单?谢谢。
注意: 我之所以没有这样做的原因是:Panel1->Color = "cl3DLight";
是因为我正在尝试为创建的组件找到一种方法在 run-time.
Sender
参数表示正在生成事件的组件。您可以将该指针强制转换为正确的类型,以便访问该组件的属性。
如果您确定事件的所有内容都是 TPanel
,您可以直接对其进行类型转换(正如雷米在下面的评论中指出的那样):
void __fastcall TForm1::Panel1MouseEnter(TObject *Sender)
{
TPanel *panel = static_cast<TPanel *>(Sender);
panel->Color = cl3DLight;
panel->Font->Color = clMaroon;
}
如果您对不同的控件类型使用相同的事件处理程序,则可以改为测试适当的类型:
void __fastcall TForm1::Panel1MouseEnter(TObject *Sender)
{
TPanel *panel = dynamic_cast<TPanel *>(Sender);
if (panel)
{
panel->Color = cl3DLight;
panel->Font->Color = clMaroon;
}
}
我在 RAD Studio 10.2 中使用 C++ Builder。我不确定我在标题中问的是否正确,但我想说的是,每当我使用 C++ 关键字 'this' 时,它都会引用我的组件的 Parent我正在尝试访问,但不是组件本身。
例如,下面的代码更改了 Form 的 颜色和字体颜色,而不是 Panel 的 颜色和字体颜色:
void __fastcall TForm1::Panel1MouseEnter(TObject *Sender)
{
this->Color = cl3DLight;
this->Font->Color = clMaroon;
}
此外,如果我执行与上面相同的操作但省略关键字 'this',它仍然会更改窗体的属性而不是面板的属性(请参见下面的代码)。
void __fastcall TForm1::Panel1MouseEnter(TObject *Sender)
{
Color = cl3DLight;
Font->Color = clMaroon;
}
我该如何编码才能访问 面板的 'Color' 和 'Font->Color' 而不是表单?谢谢。
注意: 我之所以没有这样做的原因是:Panel1->Color = "cl3DLight";
是因为我正在尝试为创建的组件找到一种方法在 run-time.
Sender
参数表示正在生成事件的组件。您可以将该指针强制转换为正确的类型,以便访问该组件的属性。
如果您确定事件的所有内容都是 TPanel
,您可以直接对其进行类型转换(正如雷米在下面的评论中指出的那样):
void __fastcall TForm1::Panel1MouseEnter(TObject *Sender)
{
TPanel *panel = static_cast<TPanel *>(Sender);
panel->Color = cl3DLight;
panel->Font->Color = clMaroon;
}
如果您对不同的控件类型使用相同的事件处理程序,则可以改为测试适当的类型:
void __fastcall TForm1::Panel1MouseEnter(TObject *Sender)
{
TPanel *panel = dynamic_cast<TPanel *>(Sender);
if (panel)
{
panel->Color = cl3DLight;
panel->Font->Color = clMaroon;
}
}