Dein TSynEditMarkChangeReasons ist ein Byte und kein LongWord/LongInt also ist es vollkommen korrekt, daß es sich nicht casten läßt.
Set:
1-8 Werte = Byte
9-16 Werte = Word
17-32 Werte = LongWord (eigentlich gibt es keine Vorzeichen im SET, aber notfalls ginge auch LongInt)
Enum:
1-256 Werte = Byte
257-65536 Werte = Word
65537-4294967296 Werte = LongWord
Beim ENUM kann man aber über {$MINENUMSIZE} die minimale Byte-Größe festlegen, was es beim SET leider nicht gibt.
[edit]
Nein, das Casten geht schon.
Besser das Casten benutzen, als wilde Speicheroperationen, aber wenigstens nutzt du noch SetOf und nicht irgendwelche "Konstanten".
Aber, wenn man nicht weiß wie groß der Cast sein muß, dann kann man das
Caption := IntToStr(SizeOf(r));
benutzen, um nachzusehn.