Странные числа в файлах Delphi DFM - происхождение и необходимость?

33

Мне нужно изменить большое количество компонентов Delphi, определенных в одном пакете, на аналогичные в другом пакете. Большую часть работы grunt можно выполнить, заменив текст (типы компонентов и свойства) в файлах DFM - сохраненный как текст, конечно.

Я искал Stackoverflow и Google и теперь адаптирую парсер Felix Colibri DFM от http://www.felix-colibri.com/papers/colibri_utilities/dfm_parser/dfm_parser.html

Я сталкиваюсь с "функцией" в файлах DFM, которые парсер задыхается: [число] после спецификаций типа:

inherited DialoogEditAgenda: TDialoogEditAgenda
  ActiveControl = PlanCalendar
  Caption = 'Agenda'
  [snip]
  inherited PanelButtons: TRzPanel
    Top = 537
    [snip]
    inherited ButtonCancel: TRzBitBtn [0]  <== *here*
      Left = 852
      [snip]
    end
    object CheckBoxBeschikbaarheid: TRzCheckBox [1]  <== *here*
      Left = 8
      [snip]
    end
    inherited ButtonOK: TRzBitBtn [2]  <== *here*
      Left = 900
      [snip]
    end
  end
  inherited PageControl: TRzPageControl
    Left = 444
    [snip]
  end
  object PanelBeschikbaarheid: TRzSizePanel [2]  <== *here*
    Left = 967
    [snip]
  end
  object PanelScheduler: TRzPanel [3]  <== *here*
    Left = 23
    Top = 22
    [...]

Многие из этих DFM сильно унаследованы (мне пришлось адаптировать код Колибри для этого уже), но небольшое тестовое приложение с наследованием не смогло получить [число] в DFM.

Мой вопрос, прежде чем расширять код парсера: кто-нибудь знает, откуда взялись эти [число], и, возможно, я могу удалить их перед разбором файлов DFM?

Спасибо

Jan

  • 1
    Порядок создания определяется порядком появления в файле dfm, поэтому в процессе исключения они должны указывать z-порядок
  • 0
    Я сделал короткое видео на YouTube, в котором, как я надеюсь, и вопрос, и ответ на этот вопрос действительно ясны, единственное, что он действительно добавляет к ответу hvd, - это то, что он также применим к фреймам и формам.
Теги:
rename
dfm

1 ответ

33
Лучший ответ

Эти цифры не совсем бесполезны. Скажем, у вас есть классы TA, TB и TC, а TB и TC - оба из TA. DFM выглядят так:

object A: TA
  object X: TX
  end
end

inherited B: TB
  object Y: TY
  end
end

inherited C: TC
  object Y: TY [0]
  end
  inherited X: TX [1]
  end
end

B и C отличаются тем, что порядок их подкомпонентов X и Y отменен. Точное значение порядка подкомпонентов зависит от компонентов (см. Ниже), но, прежде всего, если они являются потомками TWinControl или они являются потомками TControl, которые не являются результатом TWinControl, это означает, что они отличаются отображается ли X над Y или Y над X.

Удаление этих чисел может изменить формы, поэтому вы не должны слепо делать это. Однако, в зависимости от вашей цели, вы можете модифицировать синтаксический анализатор (кажется, доступен исходный код), чтобы просто пропустить цифры.

Относительный порядок компонентов обычно не имеет большого значения, но есть несколько исключений. Чтобы объяснить более подробно:

Для нормальных элементов управления подкомпоненты начинаются с (1) TControl потомков, которые не выводятся из TWinControl, тогда (2) TWinControl потомки, наконец (3) любые компоненты не TControl. В каждом из них относительный порядок компонентов регулируется: для элементов управления "Приведение вперед" и "Отправлять назад" перемещайте элемент управления, насколько это возможно, с ограничением того, что нельзя TWinControl после a TWinControl. Для неконтролируемых элементов параметр "Заказ на создание" (слегка ошибочный) позволяет вам изменить порядок. Итак, предположим, что у вас есть две метки (A и B), два элемента управления редактированием (C и D) и набор данных и источник данных (E и F), вы можете получить заказ, например, ABCDEF, BACDEF, ABDCFE, но не ACBDEF.

Этот порядок сохраняется при сохранении в файле DFM: когда визуальное наследование не используется, компоненты просто сохраняются и перезагружаются по порядку. Когда вы используете наследование, файлы DFM получают обработанную базу до производной, поэтому в приведенном выше случае, когда TC создается, член X всегда создается перед его членом Y. [0] и [1] необходимы, чтобы сообщить Delphi RTL о том, чтобы зафиксировать заказ позже, в тех случаях, когда имеет значение порядок компонентов.

Фактический порядок компонентов зависит от типа компонента. Как указывают названия "Привести вперед" / "Отправить назад", элементы управления используют порядок компонентов, чтобы указать порядок Z. Для других типов компонентов это означает, что компонент хочет, чтобы это означало. Например, меню могут использовать порядок компонентов, чтобы указать порядок их пунктов меню (сверху вниз). Элементы панели инструментов могут использовать порядок компонентов, чтобы указать порядок кнопок на панели инструментов, даже если эти кнопки панели инструментов сами не контролируют. Наборы данных используют порядок компонентов для указания порядка полей и, следовательно, также порядок столбцов по умолчанию в TDBGrid.

  • 6
    +1. Я никогда не видел этот синтаксис в файлах DFM, интересно читать и вопрос, и ответ.
  • 0
    Благодарю. Тогда мне придется обновить парсер (увы). Я попытался удалить номера из DFM , но они автоматически вновь появились после перезагрузки приложения в среде IDE. Они отличались друг от друга, а также порядком компонентов в файлах DFM.
Показать ещё 7 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню