You can use the protected hack
to overcome this:
TYPE
TControlHack = CLASS(TControl);
PROCEDURE SetScale(C : TControl ; NewScale : TPosition);
BEGIN
TControlHack(C).Scale:=NewScale
END;
By declaring a new class inheriting from the original class, you are in effect "dragging" the protected definitions into view when you hard cast the instance to this new class.
You could also implement it as a class helper:
TYPE
TControlHelper = CLASS HELPER FOR TControl
STRICT PRIVATE
PROCEDURE SetScale(Value : TPosition); INLINE;
FUNCTION GetScale : TPosition; INLINE;
PUBLIC
PROPERTY Scale : TPosition Read GetScale Write SetScale;
END;
FUNCTION TControlHelper.GetScale : TPosition;
BEGIN
Result:=INHERITED Scale
END;
PROCEDURE TControlHelper.SetScale(Value : TPosition);
BEGIN
INHERITED Scale:=Value
END;