-
Ответьте без подглядывания на следующие 2 вопроса.
Дана форма, на ней три панели.
Устанавливаем свойства таким образом:
Panel1.Align = alTop;
Panel2.Align = alRight;
Panel3.Align = alClient;
Вопрос какая из нижеприведенных конфигураций получится? Гарантировано ли такое поведение?
a)
=========================
.........Panel1..........
=========================
...............|.........
...............|.........
....Panel3.....|.Panel2..
...............|.........
...............|.........
...............|.........
б)
===============|.........
....Panel1.....|.........
===============|.........
...............|.........
...............|.Panel2..
....Panel3.....|.........
...............|.........
...............|.........
...............|.........
в) С пересечением:
===============+=========
........Panel1.|..........
===============+=========
...............|.........
...............|.Panel2..
....Panel3.....|.........
...............|.........
...............|.........
...............|.........
-
Зависит от порядка создания панелей.
-
от порядка присвоения значений алайна.
-
A
-
Я когда-то серьезно копал исходники.
И вроде как вариант А гарантируется.
"Практика - критерий истины" (с) Игорь Шевченко.
-
> MsGuns © (10.08.16 00:29) [3]
>
> A
>
> Тимохов Дима © (10.08.16 01:09) [4]
>
> Я когда-то серьезно копал исходники.
> И вроде как вариант А гарантируется.
>
Кем гарантируется и в каких случаях?
-
гарантия обеспечивается брингом на фронт или бак.
-
> Kilkennycat © (10.08.16 01:56) [6]
>
> гарантия обеспечивается брингом на фронт или бак.
Брингом на фронт или бак чего?
-
> Германн © (10.08.16 02:10) [7]
панелей, разумеется.
-
Если уж говорить точнее, то конфигурация зависит от ZOrder панелей
-
> Если уж говорить точнее, то конфигурация зависит от ZOrder
> панелей
зуб не дам, конечно, но, когда изучал, пришел к выводу, что
топ всегда сверху
боттом всегда снизу
лефт, клиент, райт - уже живут между ними.
ЗЫ. Не проверял. Автор же предлагал без подглядывания ответить.
-
> Тимохов Дима © (10.08.16 02:16) [10]
вполне возможно, что мы оба правы. уже не помню.
по крайней мере, два одинаковых дока точно определяются ордером
-
> Kilkennycat © (10.08.16 02:11) [8]
>
>
> > Германн © (10.08.16 02:10) [7]
>
> панелей, разумеется.
>
Ну не проверял реакцию Align на BringtoFront/SendToBack. Возможно ты и прав. Только при чем тут гарантии?
-
> по крайней мере, два одинаковых дока точно определяются
> ордером
Имхо, на вопрос отвечает код метода TWinControl.AlignControls.
В частности, код вложенной процедуры DoAlign.
Сначала топ, потом боттом, а потом все остальные.
ЗЫ. Может, тут и ордер работает. Не знаю.
ЗЗЫ. Опираюсь на исходники от Delphi2007.
-
> Германн © (10.08.16 02:35) [12]
> ... Только при чем тут гарантии?
У Delphi традиционно слабая справка - явно не написано.
Но код указанного мною выше метода говорит, что гарантии есть.
-
> Тимохов Дима © (10.08.16 02:37) [13]
> Может, тут и ордер работает. Не знаю.
возьмем два топа. какой будет первый? получается, только ордер тут определит.
-
> возьмем два топа. какой будет первый? получается, только
> ордер тут определит.
Ну ясен пень)))
Исходно вопрос автора был о взаимодействии топа, райта и киента.
Я до недавнего времени считал, что будет бардак в этом случае. Но потом код поизучал, оказало, что ребята из Дельфи тут все продумали)))
-
ну вот в C# WinForms по-другому продумали. Там только Z и работает, в результате можно хоть по спирали задоковать (заалигнить).
-
Если устанавливаются алигны именно в указанной последовательности - то А
-
только не понятно где это можно подглядеть.
-
> Kilkennycat © (10.08.16 02:13) [9]
> Если уж говорить точнее, то конфигурация зависит от ZOrder панелей
Нет. Если панели имеют одного родителя - то зависит только от прядка присвоения алигнов.
Во всяком случае я с вариантом зависимости от чего-ибо другого не встречался никогда.
-
Удивительно, что несколько лет посвятив Delphi я никогда не задавался этим вопросом. Я делал сначала две формы top и client, а потом внутри второй делал client и right.
Причем я помню точно, что на взаимное положение двух панелей alRight влияет их свойство left. Если мышкой переместить более правую панель влево, то он встанет слева.
Front, Back не влияют.
-
А, значит, я это откуда-то из другой среды почерпнул, да в голове перемешалось...
-
Вроде бы всегда считал, что будет вариант А.
Но я так не делаю. Делаю две панели - первую топ вторую клиент, на вторую ещё две - райт и клиент. Просто потом так с этим удобнее работать, сплитеры там добавить проще, ну и не только 3 их может быть, может и сложнее что-то, и ещё какие-то соображения были, сходу не вспомню.
-
Коллеги, предлагаю все же включить дельфи и применить принцип Игоря Шевченко, а именно - практика критерий истины.
В результате вы увидите, что:
1. Порядок присвоения Align не важен. Всегда будет вариант А.
2. А потом надо залезть в метод, обозначенный мною выше, и сделать вывод, что всегда будет А.
ЗЫ. Я тоже всегда считал, что в Align все как-то тухло - не поймешь, как оно будет. И тоже всегда для Panel2 и Panel3 делал родителя с alClient. Полез неск. лет назад изучать исходники VCL. Оказалось, что в дельфи клевые программисты и избавили меня от родителя для Panel2 и Panel3.
-
> Тимохов Дима © (11.08.16 00:36) [24]
Вопрос о том, обладает ли человеческое мышление предметной истинностью,— вовсе не вопрос теории, а практический вопрос. В практике должен доказать человек истинность, т. е. действительность и мощь, посюсторонность своего мышления. Спор о действительности или недействительности мышления, изолирующегося от практики, есть чисто схоластический вопрос.
Карл, ты слышишь, Карл)
-
> Тимохов Дима © (11.08.16 00:36) [24]
>
> Коллеги, предлагаю все же включить дельфи и применить принцип
> Игоря Шевченко, а именно - практика критерий истины.
>
> В результате вы увидите, что:
Действительно увидел.
Но я как и Inovet © (10.08.16 19:12) [23]
всегда использовал дополнительные панели.
-
> Sha © (11.08.16 00:56) [25]
Чот я не готов воспринимать философию так глубоко)))
Лично мне приятно, что на вопрос автора у меня получилось дать правильный ответ без запуска Delphi, причем аргументированный (со ссылкой на исх. код VCL).
ЗЫ Расстраивает слабость справки к Дельфи(((
-
> ЗЫ Расстраивает слабость справки к Дельфи(((
>
Да ладно тебе, Дим. Вполне терпимая справка.
-
> Германн © (11.08.16 01:52) [28]
>
> > ЗЫ Расстраивает слабость справки к Дельфи(((
> >
>
> Да ладно тебе, Дим. Вполне терпимая справка.
Я не фанат МС, но могу сказать (уверенно), что формат MSDN: about, using, reference - идеален. Вернее, БЫЛ идеален. Сейчас (через internet) не могу найти, как справка была в MSDN раньше. Но именно раньше было круче всего - about, using, reference.
-
> всегда использовал дополнительные панели.
как-то раз я их такую кучу наиспользовал, что форма нехило так тормозить начала :)
-
> Kilkennycat © (11.08.16 03:34) [30]
>
> > всегда использовал дополнительные панели.
>
> как-то раз я их такую кучу наиспользовал, что форма нехило
> так тормозить начала :)
у меня вообще надстройка (фреймворк некий свой) над VCL.
так он тааак тормозит из-за этих доп. панелей.
рекомендация простая - купи машинку побыстрее.
был недавно у заказчика поразился, почему они не ропщут - десктопы как сервера, да еще и мониторы в метр шириной)))
сам то сижу на чем-то допотопном...
"бабло побеждает зло" (с) Умные люди.
-
> Тимохов Дима © (11.08.16 03:45) [31]
ну, требуй у них такой же себе, скажи, что не можешь нормально делать для них прогу, так как твой комп круче на порядок, и ты боишься, что программа у них будет тормозить :)
-
> Kilkennycat © (11.08.16 03:55) [32]
>
> > Тимохов Дима © (11.08.16 03:45) [31]
>
> ну, требуй у них такой же себе, скажи, что не можешь нормально
> делать для них прогу, так как твой комп круче на порядок,
> и ты боишься, что программа у них будет тормозить :)
Мой принцип простой - комп разработчика д.б. хуже, чем у заказчика.
тогда, если немного хоть пооптимизируешь у себя, то у заказчика летать будет.
-
А вот если несколько контролов алигнятся к одному краю и важен их порядок, то, по крайней мере в семерке-классике имел значение не зет-ордер, и даже не порядок назначения проперти "алигн", а одна из координат контрола в момент назначения ему алигна к краю (например, для верхнего края - свойство "топ").
То есть, если по координате верха он выше каких-то контролов, уже приалигненых к верху и ниже других, то встрянет между первыми и вторыми.
(поди-ка догадайся об этом без подсматривания в исходник)
-
> Тимохов Дима © (11.08.16 01:34) [27]
> Чот я не готов воспринимать философию так глубоко)))
На самом деле и я тоже.
Но цитата в свое время была одной из популярнейших.
-
> KSergey © (10.08.16 14:22) [20]
> ...от прядка присвоения алигнов.
> Во всяком случае я с вариантом зависимости от чего-ибо другого
> не встречался никогда.
Это потому, что при присвоении контролу алигна, скажем, к топу, его топ-координата обычно становится меньше топ-координаты того, который приалигнят следующим. Но если этого не произойдет - следующий контрол после приалигнивания таки окажется ближе к краю родителя.
Присвойте свойству топ контрола число меньше нуля перед приалигниванием - и он гарантированно окажется в самом верху. (Проверить можно и в дизайнтайме.)
-
Кстати, еще вопрос: что такое alCustom? Кто-нибудь этим пользовался и как?
-
В случае alCustom используются функции WinControl
function CustomAlignInsertBefore(C1, C2: TControl): Boolean; virtual;
procedure CustomAlignPosition(Control: TControl; var NewLeft, NewTop, NewWidth,
NewHeight: Integer; var AlignRect: TRect; AlignInfo: TAlignInfo); virtual;
и, соответственно, события
FOnAlignInsertBefore
FOnAlignPosition
Поэтому и custom, что можно перекрывать методы и устанавливать пользовательские (custom) обработчики событий
Это на вопрос: "что такое".
Пользоваться не пользовался, нужды не было, хватало стандратного Align
-
Спасибо за ответ! Умеете удивлять!