Мы заметили, что при проверке обновлений в наши файлы .DFM добавлены свойства ExplicitWidth и ExplicitHeight, но мы не знаем почему.

Мои вопросы:

  • Для чего нужны эти свойства?
  • Почему они автоматически добавляются Delphi?

Ниже приведен пример добавленного свойства ExplicitWidth:

object Splitter2: TcxSplitter
    Left = 0
    Top = 292
    Width = 566
    Height = 8
    Cursor = crVSplit
    HotZoneClassName = 'TcxXPTaskBarStyle'
    AlignSplitter = salBottom
    Control = BottomPanel
    Color = clBtnFace
    ExplicitWidth = 8
end
39
Pauk 19 Мар 2010 в 14:07
Что говорится в документации Delphi? :П
 – 
mjn
19 Мар 2010 в 14:52
14
Вы серьезно предлагаете мне RTFM? А где в этом самое интересное? И я должен добавить, что использую Delphi 2007, поэтому я все еще жду загрузки Help . Я подумал, что будет быстрее спросить о переполнении стека!
 – 
Pauk
19 Мар 2010 в 14:59
2
@Mjustin, в справке говорится следующее: ExplicitWidth - это свойство только для чтения, используемое внутри Delphi. Используйте ширину в приложениях, тем самым разрешая доступ для чтения и записи. docwiki. embarcadero.com/VCL/en/Controls.TControl.ExplicitWidth
 – 
Rob Kennedy
19 Мар 2010 в 21:54
3
Так получилось, что я сделал RTFM. Все, что я получил, было следующее: «Это ExplicitWidth, член класса TControl». Так что спасибо, Роб. :)
 – 
Disillusioned
14 Авг 2013 в 18:50
2
Слишком часто RTFM - это упражнение по расшифровке расплывчатого, плохо написанного руководства. Крупные компании отправляют это в Китай, поэтому часто бывает, что китаец, который очень плохо знает английский, печатает эти руководства. Я пришел сюда в поисках той же проблемы. Я использую C ++ Builder в офисе и дома, и когда я копирую код туда и обратно, это происходит и со мной. Я не меняю ахоров. Одна IDE вставляет их, а другая вынимает.
 – 
Eric
19 Июл 2014 в 00:21

3 ответа

Лучший ответ

Из Google ....

Оригинальную статью можно найти здесь.

Явные свойства запоминают предыдущие границы элемента управления до того, как свойства Align или Anchor будут изменены по сравнению с их значениями по умолчанию.

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

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

29
James Barrass 19 Мар 2010 в 15:06
2
Это размеры, которые вы им явно дали, в отличие от размеров, которые они получили неявно в результате выравнивания или привязки. Это не обязательно исходные размеры, которые вы могли изменить между временем создания элемента управления и временем его выравнивания.
 – 
Rob Kennedy
19 Мар 2010 в 17:46
12
Это звучит правдоподобно, но на самом деле это не так: по моему опыту, IDE Delphi переключается между сохранением одних и тех же значений в Left / Right / Width / Height и их эквивалентами ExplicitXxx каждый раз, когда форма записывается в .dfm. То же самое относится к свойству ItemHeight объекта TComboBox, которое постоянно изменяется от 0 до 13 и обратно. Это очень раздражает, когда мой исходный элемент постоянно хочет публиковать изменения в .dfm, когда на самом деле ничего не изменилось.
 – 
dummzeuch
19 Мар 2010 в 21:55
4
Многие версии Delphi демонстрируют поведение, о котором вы упомянули. Это раздражает, так как загромождает различия в истории контроля версий.
 – 
Jeroen Wiert Pluimers
29 Янв 2015 в 15:01
Да, новые свойства Explicit * записываются автоматически независимо от того, изменил ли я свойство Align или Anchor. Он содержит Explict * = 0, а история контроля версий теперь показывает бессмысленные изменения. Это именно то, что делает использование Embarcadero раздражающим.
 – 
Bizmarck
5 Янв 2016 в 22:53

С помощью DDevExtensions вы можете отключить сохранение этих свойств в dfm:
http://andy.jgknet.de/blog/?page_id=10

Добавляет средство удаления явного * свойства, чтобы файлы DFM были совместимы со старыми версиями Delphi.

35
André 19 Мар 2010 в 15:12
9
+1. Я не использую его по соображениям совместимости, а просто для того, чтобы мои DFM были меньше, а исходный элемент управления не перегружался.
 – 
Uli Gerhardt
19 Мар 2010 в 15:25
3
Мне это нравится, так как, как и Ульрих, он избавляет нас от ошибок при обновлении исходного кода. Хотел бы я разделить ответ между этим и ответом JamesB!
 – 
Pauk
19 Мар 2010 в 18:45
Дело в том, что если у всех, кто будет редактировать ваш dfm, тоже не будет установлен DDevExtensions и не будет включена эта опция, у вас будет больше различий каждый раз, когда они сохранят файл.
 – 
SoftDeveloper
30 Апр 2015 в 14:23

Delphi добавляет значение опубликованных свойств в файл DFM только в том случае, если его значение отличается от значения по умолчанию.

Например:

property ExplicitWidth: Integer read FExplicitWidth write FExplicitWidth default 1;

Если значение ExplicitWidth не равно 1, оно будет записано в DFM. Если значение «по умолчанию» не определено, в DFM будет записано любое значение.

TcxSplitter не является стандартным компонентом Delphi, вам лучше спросить его автора о назначении свойств.

0
Dmytro 19 Мар 2010 в 14:35
5
Я просто перечислил TcxSplitter в качестве примера, который мне пришлось передать. Чаще всего это происходит с TForm.
 – 
Pauk
19 Мар 2010 в 14:39