КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Технология Drag and Dock
End. Type Interface uses Windows, Messages, SysUtils, Variants, Classes,Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, Buttons; TForm1 = class(TForm) Edit1: TEdit; Edit2: TEdit; Panel1: TPanel; Panel2: TPanel; Button1: TButton; BitBtnl: TBitBtn; procedure Edit1MouseDown (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure Edit2DragOver (Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); procedure Edit2DragDrop (Sender, Source:TObject; X,Y:Integer); procedure Edit1EndDrag (Sender, Target: TObject; X, Y: Integer); procedure FonnDragOver (Sender, Source: TObject; X, Y: Integer;State: TDragState; var Accept: Boolean) procedure FormDragDrop (Sender, Source: TObject; X, Y: Integer); procedure Panel1DragOver (Sender, Source: TObject; X, Y: Integer; State: TDragState; var'Accept: Boolean); procedure Panel1DragDrop (Sender, Source: TObject; X, Y: Integers-end; var Form1: TForm1; implementation {$R *.dfm) procedure TForm1.Edit1MouseDown (Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer); begin if Button=mbLeft then TEdit(Sender).BeginDrag(true); end; procedure TForm1.Edit2DragOver (Sender,Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); begin if Source is TEdit then Accept:=true else Accept:=false; end; procedure TForm1.Edit2DragDrop (Sender,Source: TObject; X, Y: Integer); begin TEdit(Sender).Text:=TEdit(Source).Text; TEdit(Sender).SetFocus; TEdit(Sender).SelectAll; end; procedure TForm1.Edit1EndDrag (Sender, Target: TObject; X, Y: Integer); 181
begin if Assigned(Target) then TEdit(Sender).Text:= 'Текст перенесен в '+TEdit(Target).Name; end; procedure TForm1.FormDragOvar (Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); begin if (Source.ClassName='TPanel') or (Source.ClassName= 'TButton1) then Accept:=true else Accept:=false;, end; procedure TForm1.FormDragDrop (Sender, Source: TObject; X, Y: Integer); begin TControl(Source).Left:=x; TControl(Source).Top:=y; end; procedure TForm1.Panel1DragOver (Sender,Source:TObject; X, Y: Integer'; State: TDragState; var Accept: Boolean); begin if Source is TButton then Accept:=true else Accept:=false; end; procedure TForm1.Panel1DragDrop (Sender, Source: TObject; X, Y: Integer); begin if Source is TButton then begin TButton(Source).Left:=(Sender as TPanel).Left+x; TButton(Source).Top:=(Sender as TPanel).Top+y; if Source is TBitBtn then begin TBitBtn(Source).Width:=147; TBitBtn(Source).Caption:='Ha форму нельзя'; if Application.MessageBox(PChar('Выход'), PCharfВыбор варианта'),MB_DEFBUTTON1 + MBICONEXCLAMATION + MB_OKCANCEL) = IDOK then close; end; end; end; В обработчике Panel1DragDrop как и в Panel1DragOver учитывается, что TBitBtn является вариантом TButton. Если рассматривать форму, то все представленные на ней элементы являются наследниками класса TControl, поэтому в обработчике FormDragDrop не конкретизируются разрешенные к перемещению компоненты. При преобразовании типов объектов использовались две конструкции, например, TButton (Source) или Source as Tbutton, что по результату означает одно и то же. Для элементов Edit1, Edit2 и Panel 1 ("приемник") установлено значение DragMbde = dmManual, для остальных элементов DragMode = dmAutomatic. На рис. 51 представлена форма данного примера. Вариант выполнения переноса Drag and Drop представлен на рис 52. Рис. 52 Можно выделить изменение "поведения" кнопки BitBtnl. Она потеряла заданную функцию Close. Для выхода из программы (если не пользоваться стандартным способом закрытия окна) предусмотрен специальный диалог, вызываемый при перемещении данной кнопки. Данная технология реализует динамическое перетаскивание мышью и прицепление одного объекта к другому. В данном механизме участвуют два элемента: один - док (docking site) - может принимать объекты, другой - клиент (dockable control) - присоединяемый компонент. Delphi наделяет данной технологией потомков классов TWinControl и TControl. Класс объекта, играющий роль дока, должен быть производным от класса TWinControl, а класс стыкуемого объекта - от Tcontrol (или TWinControl). Если рассматривать свойства компонентов, то доком может быть любой объект, обладающий свойством DockSite типа Boolean. Объекты-доки должны быть способны выступать по отношению к другим объектам в качестве контейнеров. Что касается стыкуемых элементов, то подходящие для них компоненты должны иметь два свойства DragKind и DragMode. Как и в случае с технологией перетаскивания Drag and Drop возможны два варианта реализации механизма Drag and Dock, задаваемые в свойстве DragMode: dmManual и dniAuromatie, В свойстве DragKind необходимо задать dkDock. Иногда в данной технологии бывает полезным свойство AutoSize. Когда оба свойства дока DockSite и AutoSize имеют значение true, док (если это не форма) во время выполнения программы не виден до тех пор, пока к нему не будет пристыкован хотя бы один клиент. Таким поведением часто наделяются компоненты TPanel, которые в этом случае имеют нулевое значение для одного из измерений (высоты или ширины). Программист для управления данной технологией может воспользоваться рядом обработчиков событий. Реакцию клиента на события, возникающие в моменты начала и конца переноса, можно задавать в обработчиках Оп- StartDock и OnEndDock. Во время переноса можно управлять процессом с помощью следующего ряда подключаемых к доку обработчиков: OnGet-Sitelnfo, OnDockOver, OnDockDrop, OnUnDock. Событие OnGetSitelnfo используется для некоторых компонентов, например для TPanel. Данное событие в самом начале процесса перетаскивания рассылает сообщения и параметры клиента всем потенциальным докам (у которых свойство Dock-Site установлено в true) В ответ док должен сообщить решение о приеме клиента и предоставить прямоугольник приема в случае положительного варианта. Два события OnDockOver и OnDockDrop в точности соответствуют своим аналогам из технологии Drag and Drop. В обработчике OnUnDock можно запрограммировать некоторые действия в момент покидания дока и "приземления" клиента в другом месте. Следует отметить, что реализация технологии Drag and Dock намного сложнее, чем реализация Drag and Drop. В частности, перед стыковкой необходимо вычислять возможный прямоугольник приема. В модуле uDockForm приводится такая функция (ComputeDockingRect). Кроме того, в некоторых сложных вариантах при установке у дока свойства UseDockManager в true возможно использование менеджера контроля докинга (свойство Dock Manager), с помощью которого определяется прямоугольник BoundsRect как быстрый способ получения контроля клиента на доке. Данный менеджер реализует интерфейс IDockManager, имеющий множество возможностей настройки поведения дока. Пристыкованный элемент может быть перемещен в другую позицию при помощи методов ManualDock, ManualFloat, Dock или можно воспользоваться (для некоторых типов клиентов) свойством FloatingDockSiteCIass, устанавливая его значение в CustomDockForm. ПРИМЕР ПРИЛОЖЕНИЯ 24
Данный пример демонстрирует некоторые возможности технологии перетаскивания элементов или форм на другие формы или элементы. На рис. 53 представлен общий интерфейс примера и основная форма с пристыкованными к ней двумя формами-клиентами. Эти формы пристыкованы не непосредственно на основную форму, а при помощи двух компонентов TPanel. Программа состоит из четырех модулей. Основной модуль (uMain) содержит форму основного дока, которая строится в процессе запуска приложения. Модуль (uDockForm) содержит объявление формы-клиента, на которой расположен один компонент ТМешо. При желании можно ввести некоторый текст в этом редакторе. Формы-клиенты строятся при создании основной формы. Предусмотрено построение сразу семи форм, отличающихся цветом. Первоначально все эти семь форм невидимы. Остальные два модуля, как и основная форма, содержат объявления форм-доков: В модуле uConjoinHost объявляется простая форма, а в uTab- Host - форма, содержащая компонент TpageControl, т.е. форма в виде записной книжки, состоящей первоначально из одной страницы. Все формы имеют соответствующие заголовки для простоты их распознавания. Вначале рассмотрим простой вариант данного примера без применения модулей uConjoinHost и uTabHost и соответствующих дополнительных форм. Ниже приводится программный код основного модуля. unit uMain; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Menus, StdCtrls, ComCtrls, ActnList, ToolWin, ExtCtrls, uDockForm; type TMainForm = class(TForm) CoolBar1: TCoolBar; ToolBar1: TToolBar; ToolBar2: TToolBar; ToolButton1: TToolButton; ToolButton2: TToolButton; ToolButton3: TToolButton; ToolButton4: TToolButton; ToolButton5: TToolButton; ToolButton6: TToolButton; ToolButton7: TToolButton; btnToolBar1: TToolButton; btnToolBar2: TToolButton; ActionList1: TActionList; ViewToolBar1: TAction; ViewToolBar2: TAction; ExitAction: TAction; ViewYellowWindow: TAction; ViewBlueWindow: TAction; ViewGreenWindOw: TAction; ViewRedWindow: TAction; ViewTealWindow: TAction; ViewPurpleWindow: TAction; ViewLimeWindow: TAction; LeftDockPanel: TPanel; BottomDockPanel: TPanel; VSplitter: TSplitter; HSplitter: TSplitter; MainMenu1: TMainMenu; File2: TMenuItem; Exit2: TMenuItem; View2: TMenuItem; ToolBar21: TMenuItem; ToolBar1l: TMenuItem; Yellowl: TMenuItem; Bluel: TMenuItem; Greenl: TMenuItem; Limel: TMenuItem; Purplel: TMenuItem; Redl: TMenuItem; Teall: TMenuItem; procedure FormCreate (Sender: TObject); procedure ViewToolBar1Execute (Sender: TObject); procedure ViewToolBar2Execute (Sender: TObject); procedure ExitActionExecute (Sender: TObject); procedure ViewClxentWindowExecute (Sender: TObject); procedure CoolBar1DockOver (Sender: TObject; Source: TDragDockObject; X, Y: Integer; State: TDragState; var Accept: Boolean); procedure LeftDockPanelDockOver (Sender:TObject; Source: TDragDockObject; X, Y: Integer; State: TDragState; var Accept: Boolean); procedure LeftDockPanelDockDrop (Sender: TObject; Source: TDragDockObject; X, Y: Integer); procedure LeftDockPanelDnDock (Sender: TObject; Client: TControl; NewTarget: TWinControl; var Allow: Boolean); procedure LeftDockPanelGetSitelnfо (Sender: TObject; DockClient: TControl; var InfluenceRect: TRect; MousePos: TPoint; var CanDock: Boolean); procedure BottoxnDockPanelDockOver (Sender: TObject; Source: TDragDockObject; X, Y: Integer; State: TDragState; var Accept: Boolean); public procedure ShowDockPanel (APanel: TPanel; MakeVisible: Boolean; Client: TControl); var MainForm: TMainForm; implementation {uses uTabHost, uConjoinHost;} {$R *.dfm}
Дата добавления: 2014-12-29; Просмотров: 636; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |