Несколько групп кнопок с зависимым
Рисунок 5.1. Несколько групп кнопок с зависимым нажатием на панели инструментов
Если в какой-то ситуации одна или несколько кнопок должны стать недоступными, для этого можно установить свойство Enabled в значение False. Но у кнопок в группе есть еще и третье состояние — неопределенное:
property Indeterminate: Boolean;
Такие кнопки выделяются серым цветом, чтобы показать пользователю, что их выбирать не следует. Переход в состояние indeterminate=True все еще позволяет кнопке обрабатывать событие onclick, но при этом она переходит в отжатое состояние (Down=False). Но — только до следующего нажатия. После него кнопка выходит из состояния Indeterminate.
Свойство
property Marked: Boolean;
отображает поверхность кнопки синим цветом (точнее, цветом clHighlight), как у выделенных объектов. В отличие от предыдущего случая с indeterminate кнопка остается в состоянии Marked независимо от нажатий вплоть до присвоения этому свойству значения False.
Ниже приведен фрагмент программы, с помощью которого можно выделить кнопки на панели при помощи мыши. Приведенные ниже обработчики событий нужно присвоить всем кнопкам панели и самой панели TToolBar:
var StartingPoint : TPoint;
Selecting : boolean;
procedure TForml.ToolBarlMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
StartingPoint := (Sender as TControl).ClientToScreen(Point(X,Y));
Selecting := True;
end;
procedure TForml.ToolBarlMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var i: Integer;r,r0 : TRect;
begin
if Selecting then
begin
r.TopLeft := StartingPoint;
r.BottomRight := (Sender as TControl).ClientToScreen(Point(X,Y));
with ToolBarl do for i := 0 to ButtonCount-1 do
begin
r0 :=Buttons[i].ClientRect;
OffsetRect(r0,Buttons[i].
ClientOrigin.X,Buttons[i]. ClientOrigin.Y);
if IntersectRect(r0,r,r0) then
Buttons[i].Marked := True;
end;
end;
Selecting := False;
end;
Наличие обработчиков событий onMouseDown/onMouseUp не мешает нажатию кнопок — нажатие все равно вызывает событие onclick.
Компонент TToolBar может стать полноценной заменой главного меню (взгляните хотя бы на приложения из состава MS Office 97 или 2000). К каждой из кнопок можно присоединить меню — и не одно, а целых два:
property DropdownMenu: TPopupMenu;
property PopupMenu: TPopupMenu;
Для того чтобы по нажатии левой кнопки мыши выпадало меню DropdownMenu, нужно установить один из стилей кнопок — tbsButton или tbsDropdown. В первом случае меню появится при нажатии в любой части кнопки. При этом событие onclick не возникает; кнопка из-за этого становится "неполноценной" — она пригодна только для показа меню. Второй случай — стиль tbsDropdown — специально предназначен для удобства работы с выпадающими меню. Меню появляется при щелчке на специальной области с изображением треугольника в правой части кнопки. А вот щелчок на остальной части кнопки, как обычно, вызовет событие onclick.