Как ParentBackground работает с формами, созданными IDE?

Этот код отлично работает с формой, сгенерированной IDE, в приложении VCL Forms:

Self.ParentBackground := True;


Но почему? Ни один из предков (TForm, TCustomForm, TScrollingWinControl) не публикует защищенное ParentBackground свойство TWinControl. Объявление типа для формы (например, «TForm1») в верхней части модуля также не имеет значения. Действительно, как и ожидалось, это

TForm(Self).ParentBackground := True;

не компилируется ("Не удается получить доступ к защищенному символу TWinControl.ParentBackground"). То же самое с любой формой, созданной во время выполнения.


Примечание. Вопрос не в том, как установить это свойство (кстати, есть и другие, например "Bevel[xxx]"), я бы хотелось бы знать, как это работает.


person Sertac Akyuz    schedule 22.08.2012    source источник


Ответы (2)


Self.ParentBackground := True;

компилируется, потому что класс может получить доступ к своим защищенным членам.

person David Heffernan    schedule 22.08.2012

Но TForm1(Self).ParentBackground работает. Разница в том, что класс TForm1 (к которому принадлежит Self) объявлен в том же модуле; тогда вы действительно можете получить доступ к защищенным членам.

person Andreas Rejbrand    schedule 22.08.2012
comment
Нет, это не так. Дело не в том, в какой единице объявлен код. По крайней мере, не причина, по которой Self.XXX компилируется. - person David Heffernan; 22.08.2012
comment
Что ж, @David, это действительно имеет значение. Но в данном случае вы правы. - person Andreas Rejbrand; 22.08.2012
comment
Да, это важно для TForm1(...).XXX, но я думаю, что это немного не в тему вопроса Сертака, когда я его читал. - person David Heffernan; 22.08.2012
comment
Попробуйте initialization Form1.ParentBackground := true; в Unit1 и Unit2. Скомпилируется только в первом случае (конечно рухнет, но все же). - person Andreas Rejbrand; 22.08.2012
comment
Ты прав. Тем не менее, я думаю, что оставлю свой ответ здесь, потому что возникает естественный дополнительный вопрос: в каких еще случаях вы можете получить доступ к защищенным членам класса? - person Andreas Rejbrand; 22.08.2012
comment
Хорошо, хороший момент. Это нюанс, о котором я не знал. Мне это кажется немного странным. Интересно, в чем причина. - person David Heffernan; 22.08.2012
comment
Я предполагаю, что защищенный не означает доступный для класса и его потомков. Это означает доступность в единицах, которые объявляют класс и его потомков. - person David Heffernan; 22.08.2012
comment
Спасибо за ответ, Андреас, я думаю, что ответ Дэвида касается моего вопроса немного более прямо. - person Sertac Akyuz; 23.08.2012
comment
В документации говорится: Защищенный член виден в любом месте модуля, где объявлен его класс, и из любого класса-потомка, независимо от модуля, в котором появляется класс-потомок. Я думаю, что это заблуждение. Следует читать: Защищенный член виден в любом месте модуля, где объявлен его класс, и в любом месте любого модуля, в котором объявлен класс-потомок. - person David Heffernan; 23.08.2012