Для демонстрации понадобилась кнопка, по нажатии которой будет выводиться положение 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 с помощью конструкции:
Если лежит, то получить положение 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. Для этого есть два способа, и сейчас рассмотрим самый простой из них. Поместите на форму еще один 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 главной формы очистить, то горячие клавиши придется устанавливать вручную.