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
相关产品推荐
相关产品推荐

