What about the following:
if (fsBold in fp.Style) then
fp.Style := fp.Style - [fsBold]
else
fp.Style := fp.Style + [fsBold];
txtRTF.SetTextAttributes(txtRTF.SelStart, txtRTF.SelLength, fp);
don't.
The use of SetRangeParams is the most intuitive for implementing an editor.
One doesn't want just ASSIGN a style. But instead add or remove a particular style element, keeping all other styles intact.
Typically that means that the text range needs to be scanned for different styles and the adjustment to be applied properly.
But some system native API provide a convenient method to avoid the hardship of styles scan.
(this was a missing functionality in Delphi's TRichEdit. And that's why TRichMemo doesn't replicate TRichEdit's API)