In Delhi this would have been handled by the IDE, using the built-in persistence models. This was sometimes a real nuisance if you did not want the data to be persistent! However, I don't think I ever used a CheckListBox for real, so it's behaviour may have been different.
Do I assume that the default Lazarus behaviour is different?
And if so, why not just use the equivalent of SaveComponent/LoadComponent?
The actual methods are :-
TStream.WriteComponent( Instance: TComponent);
Description
WriteComponent writes the published properties of Instance to the stream, so they can later be read with TStream.ReadComponent. This method is intended to be used by an IDE, to preserve the state of a form or datamodule as designed in the IDE.
WriteComponent simply calls WriteDescendant with Nil ancestor.
AND
TStream.ReadComponent Reads component data from a stream