I am not clear what you are missing.
The LCL already provides built-in code for published enumerated properties.
Something such as
unit MyComponent;
{$mode objfpc}{$H+}
interface
uses
Classes;
type
TMonthType = (January, February, March, April,May, June, July, August, September, October, November, December);
TMyComponent = class(TComponent)
private
FMyEnum: TMonthType;
published
property MyEnum: TMonthType read FMyEnum write FMyEnum stored True;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('MyComps',[TMyComponent]);
end;
end.
gives a component with an enumerable property that works, for instance, in the object inspector without the need to further override TReader/TWriter methods.