I think I figured it out this morning, it was making me crazy. The weird behavior started after I switched on LCL scaling, everything worked fine before.
I have methods to set and get preferences, which include the Form position, size, column widths, etc.
I was calling GetPrefs in FormHide, which saved the settings perfectly in
display coordinates.
But I was calling SetPrefs in FormCreate, this read the preferences fine, but interpreted them as
design coordinates, which were rescaled before showing the form.
The solution, probably obvious in retrospect, was to move SetPrefs from FormCreate to FormShow,
after the Form has been rescaled to display coordinates. It seems to be working.
I think you (wp) may be right about the 96 vs 72 on the Mac, and maybe that is why the (shrinking) scaling was occurring. However, the form design scaling is the same on Mac and Linux (e.g., anchor spacings are the same), but is rescaled on Windows. Actually, I may have found an answer to that (my second question). There is a "Force DPI scaling in design time" option, I'll try turning that off to see if I can design in 96 DPI on all platforms.
EDIT: This means I do
not need to call:
sw := Self.ScaleFormTo96(Self.Width);
Self.Width := Self.Scale96ToForm(sw);
that was a red herring.