Spin.pas should be fixed as following to be compiled under XE3:
function TSpinEdit.IsValidChar(Key: Char): Boolean;
begin
{$IFNDEF TMSDOTNET}
{$IFDEF VER240}
Result := (Key in [FormatSettings.DecimalSeparator, '+', '-', '0'..'9']) or
((Key < #32) and (Key <> Chr(VK_RETURN)));
{$ELSE}
Result := (Key in [DecimalSeparator, '+', '-', '0'..'9']) or
((Key < #32) and (Key <> Chr(VK_RETURN)));
{$ENDIF}
{$ENDIF}
begin
{$IFNDEF TMSDOTNET}
{$IFDEF VER240}
Result := (Key in [FormatSettings.DecimalSeparator, '+', '-', '0'..'9']) or
((Key < #32) and (Key <> Chr(VK_RETURN)));
{$ELSE}
Result := (Key in [DecimalSeparator, '+', '-', '0'..'9']) or
((Key < #32) and (Key <> Chr(VK_RETURN)));
{$ENDIF}
{$ENDIF}
// {$IFDEF TMSDOTNET}
// Result := (Key = DecimalSeparator) or (Key in ['+', '-', '0'..'9']) or
// ((Key < #32) and (Key <> Chr(VK_RETURN)));
// {$ENDIF}
if not FEditorEnabled and Result and ((Key >= #32) or
(Key = Char(VK_BACK)) or (Key = Char(VK_DELETE))) then
Result := False;
end;
// Result := (Key = DecimalSeparator) or (Key in ['+', '-', '0'..'9']) or
// ((Key < #32) and (Key <> Chr(VK_RETURN)));
// {$ENDIF}
if not FEditorEnabled and Result and ((Key >= #32) or
(Key = Char(VK_BACK)) or (Key = Char(VK_DELETE))) then
Result := False;
end;