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;
    }
}