To make TSpeedButton work with TAction.Checked when it’s a singular option (either On or Off), make sure that at design-time:
SpeedButton.Action = Action
SpeedButton.GroupIndex = 0
SpeedButton.AllowAllUp = true
Action.GroupIndex = 0
Action.AutoCheck = true //only if you need AutoCheck
Then add this to
SpeedButton.GroupIndex := 17; //any non-used group index
SpeedButtons are linked to Actions through TSpeedButtonActionLink. It only updates their Down property if AllowAllUp is set and SpeedButton.GroupIndex property is NOT 0.
But when Action is linked, SpeedButton.GroupIndex gets rewritten by Action.GroupIndex on load.
And if Action.GroupIndex is 0 because it’s a singular option, then no matter what you put into SpeedButton.GroupIndex at design-time, it’s going to be rewritten with 0 at load, so TSpeedButtonActionLink does not update Down property.
The simplest solution is to set SpeedButton.GroupIndex to something in FormCreate.