C ++:如何使VCL组件本身引用?

时间:2018-10-11 23:19:08

标签: c++builder vcl

我正在RAD Studio 10.2中使用C ++ Builder。我不确定标题是否正确,但是我想说的是,每当我使用C ++关键字“ this”时,它都会引用我要访问的组件的Parent,但是不是组件本身。

例如,下面的代码更改了表单的颜色和字体颜色,而不是面板的颜色和字体颜色:

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

我该如何编码,以便它访问面板的“颜色”和“字体->颜色”而不是表单?谢谢。

注意:我之所以不这样做的原因是:Panel1->Color = "cl3DLight";是因为我试图找到一种针对在运行时创建的组件执行此操作的方法。

1 个答案:

答案 0 :(得分:2)

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