Перемещаемые панели и меню в стиле MS (Docking)

 Для демонстрации понадобилась кнопка, по нажатии которой будет выводиться положение TToolBar. Для события, связанного с нажатием кнопки, пишем код, пред­ставленный в листинге:

 

procedure TForml.ButtonlClick(Sender: TObj ect); var

r:TRect; begin

if ToolBarl.HostDockSiteoControlBarl then

begin

GetWindowRect(ToolBar1.Handle, R);

Application.MessageBox(PChar(IntToStr(r.Left) +' -- '+IntToStr(r.Top)),

'MM' ,IDOK) ;

end;

end;

В первой строке происходит проверка, лежит ли TooiBari на controlBar1 с помощью конструкции:

ToolBar1.HostDockSiteoControlBar1

Если лежит, то получить положение TooiBar1 очень просто. Для этого нужно узнать всего ЛИШЬ ToolBar1.Left И ToolBar1.Top.

Если TooiBari не лежит на компоненте controiBari (TooiBari выглядит как от­дельное окно), то задача усложняется. Вам придется вызывать GetwindowRect, что­бы получить реальное положение TooiBari на экране. В качестве первого парамет­ра вы должны передать указатель на TooiBari, а второй — это переменная типа TRect, в которую запишется реальное положение окна. Для удобства мы выводим ЭТИ значения В окне сообщения Application.MessageBox.

 

Все это делается для наглядности. Теперь можно запустить программу и пере­местить ToolBar1 на экране. Каждый раз, когда вы будете нажимать кнопку, про­грамма будет выводить окно сообщения и показывать вам реальное положение ToolBar1.

Для события onshow напишите:

 

procedure TForm1.ForraShow(Sender: TObj ect);

begin

TooiBar1.ManualDock(nil,nil,alNone);

TooiBar1.ManualFloat(Bounds(100, 500, ToolBar1.UndockWidth, ToolBarl.UndockHeight));

end;

 

Строка TooiBari.ManualDock заставляет переместить TooiBari на новый компо­нент. В качестве первого параметра указывается указатель на компонент или окно, к которому мы хотим прикрепить TooiBari. Пусть требуется, чтобы после загрузки TooiBari превратился в отдельное окно, поэтому для первого параметра указывает­ся nil. Значение второго параметра можно оставить nil. Он означает компонент внутри компонента, указанного в качестве первого параметра, на который мы хо­тим поместить TooiBari. Третий параметр — выравнивание.

 

С помощью TooiBari.ManualFloat двигается TooiBari внутри нового компо­нента. Новый компонент nil, т. е. окно, поэтому двигается TooiBari по окну. Мо­жет, не совсем понятно? Попробуйте запустить пример и поработать с ним, тогда все встанет на свои места.

 

И еще ToolBar l.UndockWidth И TooiBari .UndockHeight возвращают размер компонента TooiBari, когда он выглядит как окно, а не лежит на ControiBari.

Когда вы будете использовать это в своей программе, для сохранения положе­ния TooiBari вам надо будет написать для события Onciose следующий код:

 

var r:TRect;

begin

if TooiBar1 .HostDockSiteoControlBarl then begin

GetwindowRect(TooiBari.Handle, R);

Здесь надо сохранить в реестре R.Left и R.Top.

А также признак, что TooiBari не лежит на ControiBari

end else begin

Здесь надо сохранить в реестре ToolBarl.Left и ToolBar1.Top.

А также признак, что ToolBarl лежит на ControlBarl end; end;

На запуск программы (по событию onshow) вы должны написать код:

procedure TFormi.FormShow(Sender: TObj ect);

begin

Прочитать положение ToolBarl. ControlBarl то Begin

ToolBarl.Left:Сохраненная левая позиция

ToolBarl.Topt:Сохраненная верхняя позиция End; Иначе begin

ToolBarl.ManualDock(nil,nil,alNone);

ToolBarl.ManualFloat(Bounds(Сохраненная левая позиция,Сохраненная правая позиция, ToolBarl.UndockWidth,ToolBar1.UndockHeight)); 

End; end;

Как видите, подводные камни есть. Но все же ничего очень сложного нет. Теперь мы сделаем меню в стиле MS. Для этого есть два способа, и сейчас рас­смотрим самый простой из Перемещаемые панели и меню в стиле MS (Docking)них. Поместите на форму еще один ToolBar и устано­вите его свойство showcaption в true. Соз­дадим на нем две кнопки и назовем их File и Edit. Теперь установим компонент MainMenu и сделаем его таким, как показано на рис. 11.44. Пункт меню Not visible сделаем невидимым (СВОЙСТВО Visible = false). В этом случае все меню будет подключено к форме, но будет невидимо. Для чего это делается, ведь можно было использовать PopupMenu? А потому что при использова­нии PopupMenu приходится мучиться с кла­вишами быстрого вызова, а в этом способе они подключаются автоматически вместе с главным меню.

 

Чтобы создать подменю для меню File, нужно щелкнуть по нему правой кноп­кой мыши и выбрать Create Submenu или нажать клавиши <Ctrl>+<—?>.

Теперь кнопке File в свойстве Menuitem ставим Filei (имя пункта меню), а кнопке Edit ставим Editl. И последнее, обеим кнопкам нужно установить свойство Grouped В true.

У каждой кнопки панели инструментов надо установить в свойстве Grouped зна­чение true, чтобы переход между ними был упрощенным. Если этого не сделать, то, открыв меню File, вы сможете перейти в другое меню только по щелчку мыши.

 

Но это не единственный способ создания меню. Можно создать полноценное главное меню. Потом просто убрать его из свойства главной формы Menu и указать у созданной вами пустой панели (без всяких кнопок) в таком же свойстве Menu. С одной стороны, это проще, но будет тяжело контролировать такое меню, когда у вас большой проект. Когда у вас указано меню для главной формы, то горячие клавиши автоматически начинают работать. Если свойство Menu главной формы очистить, то горячие клавиши придется устанавливать вручную.

������� ������ ��� dle ������� ��������� ������

Помоги проекту! Расскажи друзьям об этом сайте: