Try attached demo to see that it is working.
You, sir, have the luck of the Devil :-)
Change your code to look like
procedure TForm1.ReadFromIni;
...
PairSplitter1.Position := ini.ReadInteger('PairSplitter', 'Position', PairSplitter1.Width div 2);
and it won't work any more.
What appears to be happening is that manually dragging the PairSplitter doesn't update its Position property until the UpdatePosition method is called. In addition, the first thing that happens when Position is written is that the existing and new values are compared, and if they match the method exits.
Your ini.ReadInteger() was reading Position to get a default, and this was invisibly calling UpdatePosition to set FPosition to the actual position. If you don't do that then Position still has the value from the last time the property was read, and trying to set it will do nothing. Or words to that effect :-)
MarkMLl