Быстрый способ изменить свойство во многих формах в проекте Delphi?

Я думал, что в GExperts есть что-то для этого, но я не вижу, если оно есть.

Мне нужно изменить свойство SCALED (со значения по умолчанию TRUE на FALSE) в каждой форме в проекте, который содержит около 100 различных форм. Поскольку значение SCALED по умолчанию равно TRUE, оно фактически не отображается в виде строки в файле .DFM (при просмотре в виде текста), поэтому я ничего не могу «получить» с помощью GREP (и т. д.).

Может ли кто-нибудь предложить быстрый способ установки этого свойства во всех этих формах? Формы являются подклассами разных классов, и я действительно не хочу делать какого-то промежуточного потомка TForm, который переопределяет свойство SCALED - отчасти потому, что я пытался (кратко) сделать это и обнаружил, что установка свойства SCALED на false после унаследованного создания не имело значения для формы, и установка его до унаследованного создания вызывала исключение. :-)

У кого-нибудь есть предложения? Я действительно хочу избежать открытия всех этих форм одну за другой, если я могу помочь, хотя бы потому, что я обязательно пропущу одну!


person robsoft    schedule 13.01.2009    source источник


Ответы (3)


При условии, что все ваши файлы DFM не двоичные, а текстовые (что является хорошей идеей, если только вам не требуется совместимость с Delphi 4 или более ранней), вы, конечно, можете использовать grep / sed / awk. Формат DFM не является фиксированным, и вместо

  OldCreateOrder = False
  Scaled = False

он также может содержать

  OldCreateOrder = False Scaled = False

Таким образом, вы можете выполнить grep для еще одного свойства, которое есть только у TForm, для которого во всех ваших формах установлено значение, хранящееся в DFM (OldCreateOrder может быть кандидатом), и заменить строки другой строкой, содержащей два свойства.

Формат будет исправлен при следующем сохранении этой формы в среде IDE.

Изменить:

Если ваши формы двоичные, используйте инструмент convert.exe в каталоге bin Delphi (используйте полный путь, так как в Windows есть еще один convert.exe), чтобы преобразовать DFM в текст, затем добавьте отсутствующее свойство, затем (необязательно) преобразуйте DFM обратно в бинарный. А если вас не устраивает странный формат - конвертируйте DFM из текстового в бинарный и обратно в текстовый, это даст вам правильно отформатированный текстовый файл DFM. Все это легко расшифровывается.

person mghie    schedule 14.01.2009
comment
Спасибо, мги. Формы являются текстовыми, и именно такой подход я пытался реализовать. Однако, поскольку свойство SCALED по умолчанию имеет значение true, его изначально нет в файле .DFM. Это тот случай, когда было бы полезно, чтобы свойства, оставленные по умолчанию, сохранялись в потоке! - person robsoft; 14.01.2009
comment
Я только что понял, к чему ты на самом деле клонишь! Я могу сделать трюк с двумя строками, чтобы ДОБАВИТЬ это назначение во все формы, даже если свойство в настоящее время отсутствует. Я ДОБАВЛЯЮ строку, а не ищу/заменяю существующее свойство. Великолепно! Я попробую это сейчас. - person robsoft; 14.01.2009
comment
Я думаю, вы не поняли. Я знаю, что Scaled там нет, но можно программно заменить OldCreateOrder=False на OldCreateOrder=False Scaled=False и тогда он есть. Может быть, я недостаточно ясно выразился, как я могу улучшить свой ответ? - person mghie; 14.01.2009
comment
Это сработало, используя GExperts. Спасибо, мгхи, ты звезда! - person robsoft; 14.01.2009
comment
Не нужно улучшать свой ответ, мгхи, я был тупым! Еще раз спасибо, ваше предложение сработало отлично. - person robsoft; 14.01.2009

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

Как правило, я предпочитаю всегда использовать пользовательский класс-потомок вместо стандартного, который я буду использовать часто по этой конкретной причине.

person Jim McKeeth    schedule 14.01.2009
comment
Это хороший совет для новых проектов, но он может быть излишним в качестве изменений в зрелом проекте. - person mghie; 14.01.2009
comment
Спасибо, Джим. Это, вероятно, правильное решение в долгосрочной перспективе, но очевидно, что в краткосрочной перспективе это будет болезненно! :-) - person robsoft; 14.01.2009
comment
Вы можете сделать это в зрелом проекте, используя глобальный поиск и замену. Дивиденды большие. - person Jim McKeeth; 16.01.2009

Да, GExpert включает в себя эксперта «Установить свойства компонента». У него есть режим «симуляции», чтобы увидеть, что он будет делать. Этот инструмент полезен для деактивации наборов данных или соединений с базами данных перед компиляцией приложений.

person mjn    schedule 01.04.2009