Версия для печати


VCL.TCustomDockForm.Неправильное положение окна-носителя (Float формы)
http://www.delphikingdom.com/asp/viewitem.asp?catalogID=1211

Cepгей 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) необходимо, чтобы его координаты определялись программно.




Типовые решения
  1. Создать потомка TCustomDockForm, в конструкторе которого присвоить свойству Position значение poDesigned. Затем для каждого присоединяемого органа управления указать этот класс окна-носителя.
    Panel2.FloatingDockSiteClass := TDockFormEx;
    
  2. Изменить исходный код модуля 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) Д. Ван Тассел