
08.09.2010, 18:24
|
Активный
|
|
Регистрация: 12.09.2008
Сообщения: 391
Репутация: 6078
|
|
Нашел ответ в книге "Delphi 6 и Kylix. Библиотека программиста", Автор: Сергей Бобровский. Глава: Панели и декоративные элементы. Механизмы перетаскивания и стыковки.
Есть три параметра у форм и панелей: DockSite, DragMode, DragKid. Если всё выставить в автомат, то будет как в этом примере для D2010.
Можно все эти вещи контролировать. В общем ниже глава из книги:
Цитата:
Механизм стыковкиВ ряде современных настольных приложений реализован новый подход к перемещению отдельных объектов и их групп. Элементы управления объединяются в стыкуемые палитры (Dock), которые способны свободно "плавать" внутри заданной области. Палитры могут пристыковываться друг к другу, подстраивая размеры, а расположенные на них элементы управления можно перетаскивать между палитрами. Так, в частности, реализованы некоторые окна в самой системе Delphi 6. Например, Менеджер проектов и Инспектор объектов можно объединить вместе. Для этого в их контекстных меню имеется пункт Dockable (Стыкуемый). Если этот пункт включен (помечен галочкой), то он позволяет данному окну пристыковываться к другим окнам среды. Для рассмотрения механизма стыковки (drag-and-dock) создадим новый проект. В проектировщике форм появиться новая форма Form1, являющаяся главной формой нового проекта. На ней необходимо разместить две панели: Panel1 и Panel2. На первую панель следует поместить две кнопки: Button1 и Button 2. Обеспечить работу механизма стыковки можно и без программирования. Для этого сначала надо указать объекты, которые выступают в роли стыкуемых палитр: Panel1 и Panel2. Их свойство DockSite определяют, могут ли объекты выполнять функции палитры. Значения свойств надо установить равными true. Чтобы автоматически поддерживать режимы стыковки, не обращаясь программно к методам палитр, необходимо для свойства DragMode (Режим перетаскивания) задать значение dmAutomatic. Кроме того, значения свойств DragKid (Вид перетаскивания) необходимо изменить с dkDrag (Свободное перетаскивание) на dkDock (Стыковка). Кнопки не могут служить полноценными палитрами (свойства DockSite у них нет), поэтому для кнопок настраиваются только свойства DragMode (значение dmAutomatic) и DragKid (значение dkDock). Созданную программу можно откомпилировать и запустить. Теперь любую панель можно таскать по форме, помещать внутрь другой панели и перетаскивать кнопки, стыкуя друг с другом самым причудливым образом. В ходе перемещения кнопок и панелей для них автоматически создается небольшое охватывающее окно, позволяющее перетаскивать эти объекты как в пределах формы, так и за ее границами. При этом стыковать объекты можно только друг с другом. Вернуть их на форму не удается, что естественно: ведь она сама что не является стыкуемой палитрой. Чтобы позволить и кнопкам и панелям «приземляться» на форме, надо закрыть программу-пример и в Инспекторе объектов изменить для формы Form1 значение DockSite на true, а значение свойства DragKind установить равным dkDock. Теперь и кнопки и панели в процессе их перемещения можно устанавливать в любом месте формы. Программная поддержка процесса стыковки похожа на обработку процесса перетаскивания. Однако стыкуемой палитре необходимо предварительно обработать новое событие OnGetSiteInfo. С его помощью передается информация об объекте, который хочет пристыковаться к данной палитре и его размер (прямоугольник, хранящийся в параметре InfluenceRect). Аргумент CanDock, передаваемый по ссылке, должен получить значение true, если разрешение на стыковку дается. При этом можно изменить область, отводимую для стыковки (прямоугольник InfluenceRect, который тоже передается по ссылке), например запретить панели Panel2 принимать кнопки:
Код:
Procedure TForm1.Panel2GetSiteInfo(Sender: TObject; DockClient: TControl;
Var InfluenceRect: TRect; MousePos: TPoint; var CanDock: Boolean);
Begin
CanDock := not (DockClient is TButton)
End;
Через параметр DockClient передается элемент управления (класс TControl), который собирается пристыковаться к панели. Перемещая кнопки по форме, их всё же можно расположить на панели Panel2. Но процесс автоподстройки их положения и размера под панель выполняться не будет. Объект Panel по прежнему сможет пристыковаться к палитре Panel2. Два события: OnDockOver (При попытке стыковки), генерируемое при перемещении объекта над палитрой. И OnDockDrop (При завершении стыковки) – аналогичны событиям OnDragOver и OnDragDrop. Еще одно новое событие OnUnDock посылается палитре при попытке вытаскивания объекта с неё. Обрабатывая это событие, можно, например, запретить перемещать с палитры (панели Panel1) определенные элементы управления (кнопки):
Код:
Procedure TForm1.Panel1UnDock(Sender: TObject; Client: TControl;
NewTarget: TWinControl; var Allow: Boolean);
Begin
Allow := not (Client is TButton);
End;
Параметр Client описывает элемент управления, который пользователь пытается забрать с палитры. Параметр Allow должен получить значение True, если разрешается забрать этот элемент, и false в противном случае.
|
Устал набирать.
P.S. Так то Bars1992 в чем то был прав:
Цитата:
НАрод что вы изобритаете велосипед? Борланд уже давно его изобрела))
|
|