Как только пользователь нажал кнопку мыши над переносимым компонентом и начал сдвигать его с места, всем потенциальным докам (компонентам, свойство которых Docksite установлено в True) рассылается событие OnGetsiteinfo. С ним передаются параметры: кто хочет "приземлиться" (параметр DockClient) и где (MousePos). В ответ док должен сообщить решение, принимает он компонент (параметр CanDock) и предоставляемый прямоугольник (influenceRect) или нет. При помощи этого события можно принимать только определенные элементы управления, как показано в примере:

procedure TForml.PanellGetSitelnfo(Senderi TObject;
DockClient: TControl;
var influenceRect: TRect;
MousePos: TPoint;
var CanDock: Boolean);
begin
if DockClient is TBitBtn then CanDock := False;
end;

Два последующих события в точности соответствуют своим аналогам из механизма переноса Drag-and-Drop). Событие onDockOver происходит при перемещении перетаскиваемого компонента над доком, OnDockDrop - в момент его отпускания. Наконец, onUnDock сигнализирует об уходе компонента с дока и происходит в момент его "приземления" в другом месте.

Между доком и содержащимися на нем элементами управления есть двусторонняя связь. Все "припаркованные" элементы управления содержатся в векторном свойстве DockClients, а их количество можно узнать из свойства

DockClientCount:

s : = "
;
for i := 0 to Panel1.DockClientCount-1 do AppendStr(s, Panell.DockClients[i].Name+#$D#$A);
ShowMessage(s);

С другой стороны, если элемент управления находится на доке, то ссылка на док располагается в свойстве HostDockSite. С ее помощью можно установить, где находится элемент, и даже поменять свойства дока:

procedure TMyForm.ButtonlEndDock(Sender, Target: TObject;
X, Y: Integer);
begin
(Sender as TControl).HostDockSite.SetTextBuf(pChar((Sender as TControl).Name));
end;

Компоненты можно не только переносить с одного дока на другой, но и отпускать в любом месте. Хотя сам по себе компонент TControl и его потомки не являются окнами Windows, но специально для этого случая создается окно-носитель. Свойство FloatingDockSiteClass как раз и определяет класс создаваемого окна. По умолчанию для большинства компонентов значение этого свойства равно TCustomDockForm. Это - форма, которая обладает свойствами дока и создается в момент отпускания элемента управления вне других доков. Внешне она ничем не отличается от обычной стандартной формы. Если вы хотите, чтобы ваша плавающая панель инструментов выглядела по-особенному, нужно породить потомка от класса TCustomDockForm И связать (Ж>ЙС1Ю FioatingDockSiteCiass С ЭТИМ порожденным классом:

TMyCustomFloatingForm = class(TCustomDockForm)

public

constructor Create(AOwner: TComponent);
override;
end;
constructor TMyCustomFloatingForm.Create(AOwner: TComponent);
begin
inherited Create (AOwner) ;
BorderStyle := bsNone;
end;
procedure TForml.FormCreate(Sender: TObject);
begin
ToolBarl.FloatingDockSiteClass := TMyCustomFloatingForm;
end;

В этом примере решена типовая задача - сделать так, чтобы несущее окно плавающей панели инструментов не содержало заголовка. Внешний вид таких панелей приведен на рис. 27.3.


⇐ Предыдущая страница| |Следующая страница ⇒

Программирование в Delphi 7



Новости за месяц

  • Август
    2017
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс