Версия для печати
VCL.TCustomDockForm.Неправильное положение окна-носителя (Float формы)
http://www.delphikingdom.com/asp/viewitem.asp?catalogID=1211Cepгей Poщин
дата публикации 22-03-2006 16:01
КАТЕГОРИЯ БИБЛИОТЕКА.VCL.TCustomDockForm.Неправильное положение окна-носителя (Float формы) ПРОДУКТ BDS 2005,2006 ПЛАТФОРМА Windows Если любой орган управления со свойством DragKind=dkDock, попытаться отсоединить от родительского компонента и бросить в свободную область экрана, то он займет не то положение, которое ему указывалось пользователем, а то, которое ему указала система. Это проявляется в Delphi 2005 и BDS 2006 (SP1).
Такое поведение связано с тем, что в Delphi до версии 7 включительно по-умолчанию свойство Position равнялось poDesigned (для всех форм). В более поздних версиях это свойство стало равняться poDefaultPosOnly, т.е. положение формы определяется системой. Для окна-носителя (TCustomDockForm) необходимо, чтобы его координаты определялись программно.
Типовые решения
- Создать потомка TCustomDockForm, в конструкторе которого присвоить свойству Position значение poDesigned. Затем для каждого присоединяемого органа управления указать этот класс окна-носителя.
Panel2.FloatingDockSiteClass := TDockFormEx;- Изменить исходный код модуля Forms:
constructor TCustomDockForm.Create(AOwner: TComponent); begin CreateNew(AOwner); AutoScroll := False; BorderStyle := bsSizeToolWin; DockSite := True; FormStyle := fsStayOnTop; Position := poDesigned; //Эта строка добавлена end;
Дополнительные ссылки и прилагаемые файлы
Скачать тест StoneTest_96.zip (5k)
КомментарийЭффект имеет место быть. Проверить в D7 удалось, поставив Position := poDefaultPosOnly в коде примера вместо poDesigned.
Может быть, у Борланда были уважительные причины изменить положение формы по-умолчанию, но до проверки, как это повлияет на все специальные случаи, руки не дошли.
«Большие программы подобны спагетти на тарелке: тянешь с одной стороны — что-то движется с другой.» (c) Д. Ван Тассел