You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi 10 Architect报E2362无法访问受保护符号TControl.Color如何解决

报错原因

E2362 Cannot access protected symbol TControl.Color错误触发是因为TControl基类的Color属性被定义为受保护成员,按照Delphi的封装规则,受保护成员仅允许类自身、同单元内的类、子类访问,你直接在窗体类的事件方法中访问TShape实例(shp1/shp2/shp3均为TShape类实例,TShape继承自TControl)的受保护Color属性,不符合访问权限要求,因此编译报错。

解决方法

最优方案:直接修改Brush属性

TShape的填充色本身由Brush.Color属性控制,该属性是公开成员,无需绕过访问限制,直接修改即可,修改后代码如下:

var
  TrafficLights: TTrafficLights;

implementation

{$R *.dfm}

procedure TTrafficLights.btn1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  shp1.Brush.Color := clRed;
end;

procedure TTrafficLights.btn2MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  shp2.Brush.Color := clYellow;
end;

procedure TTrafficLights.btn3MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  shp3.Brush.Color := clGreen;
end;

通用绕保护方案1:使用类助手

如果确实需要直接访问TControl的Color属性,可以通过类助手将受保护属性公开:
首先在单元的interface或implementation区域声明类助手:

type
  TControlHelper = class helper for TControl
  public
    // 将受保护的Color属性公开为PublicColor
    property PublicColor: TColor read Color write Color;
  end;

后续访问时直接调用公开属性即可:

shp1.PublicColor := clRed;

通用绕保护方案2:使用子类Hack

利用Delphi同单元内受保护成员可见的规则,声明空的继承类后强制类型转换访问:
首先在单元内声明继承类:

type
  THackControl = class(TControl);

访问时强转实例即可:

THackControl(shp1).Color := clRed;

内容的提问来源于stack exchange,提问作者Jason

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 07:45:06