Как мне заставить Delphi оставить мой DFM один?

Используя DXE2, я написал генератор формы, который создает файлы .pas и .dfm. Я работаю над рутиной, которая позволит мне изменять различные свойства в dfm, такие как Font.Height и TabOrder.

Когда я открываю сгенерированный файл в блокноте, все выглядит точно так, как я ожидаю. Когда я открываю его в Delphi, свойства меняются! Вещь, которая так расстраивает, заключается в том, что я использую форму, первоначально разработанную в среде Delphi, как мой шаблон. Я не понимаю, почему Delphi не будет уважать мои простые изменения...

Например, исходный Font.Height - -11. Я прочитал в dfm, изменил его на -17 и сохранил. В блокноте он показывает -17. Когда я открываю его в Delphi, он отображается как -21!

Любые идеи/советы/предложения будут очень благодарны!

Ответ 1

Я предполагаю, что у вас есть несоответствие между PixelsPerInch на вашем компьютере и значением, хранящимся в файле .dfm. Когда Delphi считывает файл .dfm, он будет масштабировать любые измерения в соответствии с отношением .dfm файла PixelsPerInch и вашего машинного тока PixelsPerInch.

Типичные значения PixelsPerInch: 96dpi и 120dpi. Обратите внимание, что 17*120/96 = 21.

Теперь, что касается TabOrder, среда IDE всегда будет выписывать порядок формы в последовательных значениях. Итак, если у вас есть какие-либо значения, отсутствующие в вашем файле .dfm, тогда среда IDE выведет другую версию значений TabOrder.

Обратите внимание, что вы не можете заставить Delphi оставить ваш .dfm файл в одиночку. После того, как вы внесете какие-либо изменения в пространство дизайна и сохраните форму, Delphi вытолкнет ее в предпочтительном формате.

Это действительно неизбежное следствие того, как обрабатываются файлы .dfm. IDE никогда не редактирует файлы .dfm так же, как это делает с вашими .pas файлами. Вместо этого он считывает файл .dfm, создает компоненты, определенные в форме, и назначает их свойства. Когда необходимо снова сохранить файл .dfm, компоненты попросят выпустить себя. Таким образом, базовая модель, содержащая настройки, представляет собой экземпляр TComponent (часто это форма, например), принадлежащая среде IDE, а не файл .dfm.

Ответ 2

Что я делаю, дайте IDE внести изменения, которые он хочет, и используйте Tortoise {HG, SVN и т.д.} + KDIFF3 для просмотра (используя его функцию слияния) и только фиксируйте изменения, которые я делаю, изменяя те, которые IDE сделала то, что я не хочу держать.

Шаги:

  • Перейдите в диалог фиксации вашей системы управления версиями.

  • Для каждого DFM в списке, щелкните правой кнопкой мыши и "View Diff" или "Visual Diff" или независимо от того, какая команда view-difference в вашем приложении управления версиями вызывается.

  • Ваш инструмент diff появится. Я использую KDIFF3, но некоторые люди используют BeyondCompare. Я нажимаю "Merge → Merge Current file", а затем возвращаю все изменения, которые он делает, что я не хочу.

  • Сохранить результаты слияния. Зафиксируйте его.

Поверьте мне, сумасшествие DFM - это то, над чем вы будете поражены. Каждый раз, когда вы открываете DFM и меняете его, каждый TImageList в нем будет изменен, создавая разницу для вас в вашей системе контроля версий, и если у вас в вашей команде более одного разработчика, вы почти гарантированы "слияние конфликтов". Начните практиковать "DFM hygiene", и вы поблагодарите себя позже. Когда вы выполняете ручное слияние, как это, вы в основном решаете сохранить или вернуть, каждый "кусок" дельта, который будет передан в вашу систему контроля версий. То, что показано ниже, как "Конфликт", действительно "A или B выбор". Нажмите Ctrl + 1, чтобы выбрать A, нажмите Ctrl + 2, чтобы выбрать B, и продолжайте. Вы можете быстро пройти через огромное количество случайных изменений, сохранить только те, которые вы намеревались сделать, а затем передать свой DFM.

enter image description here