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

Несколько групп кнопок с зависимым



Рисунок 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.

 



Содержание раздела