Стоп, не надо путать помидоры с яйцами
В Debug набираю:
? Screen.TwipsPerPixelX
получаю: 15
ИМЕННО:TwipsPerPixelX заметь, не Twip а TwipsPerPixelX. Количество твип осталось прежним. Изменяется количество пикселей с 800 до 640 и заодно TwipsPerPixelX. А если сделаешь Debug.Print Me.Width, то оно будет одинаковым, независимо от разрешения экрана. Грубый пример: Если взять лист бумаги А4, то его ширина 210 мм. Если ты будешь его рассматривать в лупу, то естественно он уйдет за пределы видимости окуляра, но тем не менее, его ширина останется 210 мм. Так же и с формой (или любым контролом). Изменяя разрешение экрана с 800 до 640, ты смотришь на форму как-будто через лупу. И чтобы вернуть форме привычный глазу размер (при том, что фактические размеры формы остались прежними), приходится масштабировать, т.е. удалять объект от окуляра.
Теперь, по поводу FontSize и Font.Size
Совершенно разные понятия, хотя и пишется почти одинаково. Когда у меня была такая же проблема, сначала попробовал FontSize. Но ничего хорошего не вышло. Потом попробовал Font.Size и всё стало на место. В чём разница, я так и не понял, возможно это как-то связано с понятием TextHeight - не знаю. Просто опытным путём нашёл нужное решение и пользуюсь им.
Кстати, TextHeight тоже проблему не решает. И например, когда при смене размера системного шрифта с 96 на 120 точек у меня всё вылезало за пределы текстовых полей и кнопок, то с коррекцией Font.Size размеры совершенно одинаковы. Хотя TwipsPerPixelX изменился с 15 до 12.
В общем пользуюсь такой же функцией по ресайзу контролов, как ты написал, только дополненой ресайзом шрифтов. Единственный контрол, который почему-то не хочет слушаться - это комбобокс. Приходится устанавливать его позиции отдельно, вне цикла, и привязывать к каким-либо ориентирам на форме (другие контролы, край формы и т.д.)
А компилированый файл всё равно будет зависеть от TwipsPerPixelX, и чтобы сохранять размеры, приходится масштабировать, либо не пользоваться лупой

))