Как я могу заставить Delphi оставить свой DFM в покое? - PullRequest
12 голосов
/ 29 марта 2012

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

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

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

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

Ответы [ 2 ]

16 голосов
/ 29 марта 2012

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

* 1005 вашего компьютера. Типичные значения PixelsPerInch - 96 точек на дюйм и 120 точек на дюйм.Обратите внимание, что 17*120/96 = 21.

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

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

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

3 голосов
/ 29 марта 2012

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

Шаги:

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

  2. Для каждого DFM в списке щелкните правой кнопкой мыши и «View Diff» или «Visual Diff», или как там будет вызываться команда view-разниц в вашем приложении для управления версиями.

  3. Ваш инструмент сравнения появится. Я использую KDIFF3, но некоторые люди используют BeyondCompare. Я нажимаю «Объединить -> Объединить текущий файл» и затем отменяю все внесенные изменения, которые мне не нужны.

  4. Сохранить результаты слияния. Передайте это.

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

enter image description here

...