Delphi. Панель Additional. Компонент SpeedButton.

SpeedButton представляет собой кнопку, на которой, как и на «BitBtn», может находиться и надпись, и картинка.

Основная особенность кнопки состоит в том, что она имеют возможность быть зафиксированной в утопленном состоянии.

Другая особенность кнопки, что она не имеет свойства «ModalResult» и кнопка не может автоматически закрывать модальные окна.

Чтобы кнопка «SpeedButton» могла быть зафиксирована в утопленном состоянии, для этого кнопку нужно включить в какую-либо группу аналогичных кнопок.

Это надо сделать, даже если группа будет состоять всего лишь из одной кнопки.

Чтобы назначить группу, необходимо используется свойство GroupIndex и назначить ему значение не равное нулю. 

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

При создании собственных изображений необходимо учесть, что изображения соответственно меняются при изменении состояния кнопки. Поэтому разрабатывается до 4 изображений, расположенных в горизонтальном положении в виде одного рисунка. Например:

После создания рисунка загружаем его в свойство Glyph, и подстраиваем размер кнопки к размеру нашей иконки.

Далее возможны две ситуации.

Первая — кнопка работает сама по себе, то есть как обычная кнопка.

Вторая — кнопка работает в содружестве с подобными ей кнопками. Если свойство «GroupIndex» у кнопок имеет одно и то же значение (отличное от нуля), то кнопки работают как единая группа.

Приэтом, если «AllowAllUp=true», то кнопку можно отжать повторным щелчком по кнопке. Если «AllowAllUp=false», то кнопка отожмется только при щелчке по другой кнопке.

Замечание. Достаточно поменять значение «AllowAllUp» у одной кнопки, и оно автоматически изменится у всех других кнопок группы.

Если свойству «Enabled» задать значение «false» на этапе проектирования или программно, то кнопка приобретает вид:

Свойство «Flat» при значении «true» позволяет показывать раницу кнопки при наведении указателя мыши на неё.

Свойство «NumGlyphs» показывает количество картинок изображенных на рисунке, загруженном в свойство«Glyph».

Свойство «Glyph» — свойсиво для загрузки битовой карты типа «.bmp».

Свойства«Down» является индикатором и может быть использовано для определения, находится ли кнопка в утопленом фиксированном состоянии.

При программном присваивании «Down=true» кнопка переходит в фиксированное нажатое состояние.

При проверке «Down» на равенство «true» можно заключить, находится ли кнопка в фиксированном нажатом состоянии, или нет.

Пример использования кнопки SpeedButton.

Этот пример позволяет посмотреть, как ведёт себя группа кнопок «SpeedButton» при различных значениях свойств «AllowAllUp» и «GroupIndex».

Интерфейс программы.

Интерфейс программы состоит из трёх кнопок «SpeedButton», панели «GroupBox», на которой расположены три радиокнопки и компонента «Memo».

Обработчики для радиокнопок, расположенных на панели «GroupBox».

procedure TForm1.RadioButton1Click(Sender: Tobject);
begin
self.SpeedButton1.AllowAllUp:=true;//при «AllowAllUp= true» можно анализировать текущее значение свойства «Down». При «AllowAllUp= false» значение «Down» всегда равно «false». Анализ значения свойства «Down» нам понадобится в расширенном варианте программы.

self.SpeedButton1.GroupIndex:=0;//значение «0» означает, что кнопки не образуют группу. Каждая кнопка работает индивидуально.

self.SpeedButton2.AllowAllUp:=true;
self.SpeedButton2.GroupIndex:=0;
self.SpeedButton3.AllowAllUp:=true;
self.SpeedButton3.GroupIndex:=0;
memo1.Text:=’Каждая кнопка работает индивидуально’;
end;

procedure TForm1.RadioButton2Click(Sender: Tobject);
begin
self.SpeedButton1.AllowAllUp:=true;
self.SpeedButton1.GroupIndex:=2;
self.SpeedButton2.AllowAllUp:=true;
self.SpeedButton2.GroupIndex:=2;
self.SpeedButton3.AllowAllUp:=true;
self.SpeedButton3.GroupIndex:=2;
memo1.Text:=’Кнопки работают как группа. Нажатая кнопка может быть отжата’;
end;

procedure TForm1.RadioButton3Click(Sender: Tobject);
begin
self.SpeedButton1.AllowAllUp:=false;
self.SpeedButton1.GroupIndex:=2;
self.SpeedButton2.AllowAllUp:=false;
self.SpeedButton2.GroupIndex:=2;
self.SpeedButton3.AllowAllUp:=false;
self.SpeedButton3.GroupIndex:=2;
memo1.Text:=’Кнопки работают как группа. Нажатая кнопка НЕ может быть отжата’;
end;

Переключая радиокнопки, получим их функционирование в разных режимах.

Интерфейс усложнённой программы

Расширим интерфейс программы и функциональность компонент.

На форму добавлен компонент «RadioGroup» , два компонента «Edit», кнопка «BitBtn», компоненты «Label» и «Panel».

Компонент «RadioGroup» нужен, чтобы продемонстрировать неактивное состояние кнопки «SpeedButton1».

В компоненте «Label» будет отображаться номер кнопки, над которым в данный момент находится указатель мыши.

В компоненте «Edit» около кнопки «АКТИВНА» будет отображаться количество щелчков по этой кнопке.

В компоненте «Edit» около метки с текстом «кнопка 1» будет отображаться состояние кнопки «SpeedButton», над которой находится курсор или по которой осуществлён щелчок.

Код усложнённой программы.

Панель нужна для отображения срабатывания обработчика нажатия кнопки мыши по первой кнопке (панель меняет цвет при нажатии и отпускании кнопки мыши).

Клик по SpeedButton

procedure TForm1.SpeedButton1Click(Sender: Tobject);
begin
if self.SpeedButton1.GroupIndex=0 then//если кнопка не состоит в группе
if self.BitBtn3.Enabled=true then//и если кнопка активна, то:
begin
self.BitBtn3.Enabled:=false;//делаем кнопку не активной
self.BitBtn3.Font.Style:=[];//стиль шрифта надписи на кнопке делаем «по умолчанию»
self.BitBtn3.Caption:=’не активна’;//изменяем заголовок кнопки
self.SpeedButton1.Caption:=’нельзя’;//изменяем заголовок быстрой кнопки
exit;//выходим из процедуры
end
else//иначе
begin
self.BitBtn3.Enabled:=true;
self.BitBtn3.Font.Style:=[fsBold];//назначаем стиль шрифта для вывода надписи на кнопку «жирный»
self.BitBtn3.Caption:=’АКТИВНА’;
self.SpeedButton1.Caption:=’можно’;
exit;
end ;

if self.SpeedButton1.Down then// «Down=true» если кнопка зафиксирована
begin
self.SpeedButton1.Caption:=’нельзя’;
self.BitBtn3.Enabled:=false;
self.BitBtn3.Font.Style:=[];
self.BitBtn3.Caption:=’не активна’;
self.Edit2.Text:=’зафиксирована’;//меняем текст в «Edit», так как после щелчка зафиксированная кнопка вернётся в исходное положение
end
else//иначе
begin
self.SpeedButton1.Caption:=’можно’;
self.BitBtn3.Enabled:=true;
self.BitBtn3.Font.Style:=[fsBold];
self.BitBtn3.Caption:=’АКТИВНА’;
self.Edit2.Text:=’не фиксирована’;
end ;
end;

procedure TForm1.SpeedButton2Click(Sender: Tobject);
begin
self.SpeedButton1.Caption:=’можно’;
self.BitBtn3.Caption:=’АКТИВНА’;
self.BitBtn3.Enabled:=true;
self.BitBtn3.Font.Style:=[fsBold];

if self.SpeedButton2.Down then
self.Edit2.Text:=’зафиксирована’
else
self.Edit2.Text:=’не фиксирована’;
end;

procedure TForm1.SpeedButton3Click(Sender: TObject);
begin
self.SpeedButton1.Caption:=’можно’;
self.BitBtn3.Caption:=’АКТИВНА’;
self.BitBtn3.Enabled:=true;
self.BitBtn3.Font.Style:=[fsBold];

if self.SpeedButton3.Down then
self.Edit2.Text:=’зафиксирована’
else
self.Edit2.Text:=’не фиксирована’;
end;

Перемещение курсора над SpeedButton

procedure TForm1.SpeedButton1MouseMove(Sender: TObject; Shift: TshiftState;
X, Y: Integer);
begin
self.Label1.Caption:=’кнопка 1′;
if self.SpeedButton1.Down then//проверяем, зафиксирована ли кнопка
self.Edit2.Text:=’зафиксирована’
else
self.Edit2.Text:=’не фиксирована’;
end;

procedure TForm1.SpeedButton2MouseMove(Sender: TObject; Shift: TshiftState;
X, Y: Integer);
begin
self.Label1.Caption:=’ кнопка 2′;
if self.SpeedButton2.Down then
self.Edit2.Text:=’зафиксирована’
else
self.Edit2.Text:=’не фиксирована’;
end;

procedure TForm1.SpeedButton3MouseMove(Sender: TObject; Shift: TshiftState;
X, Y: Integer);
begin
self.Label1.Caption:=’ кнопка 3′;
if self.SpeedButton3.Down then
self.Edit2.Text:=’зафиксирована’
else
self.Edit2.Text:=’не фиксирована’;
end;

Нажать и отпустить клавишу мыши над SpeedButton1

procedure TForm1.SpeedButton1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
self.Panel1.Color:=clRed;
end;

procedure TForm1.SpeedButton1MouseUp(Sender: TObject; Button: TmouseButton;
Shift: TShiftState; X, Y: Integer);
begin
self.Panel1.Color:=clGreen;
end;

Обработка радиогруппы

procedure TForm1.RadioGroup1Click(Sender: TObject);
begin
Case RadioGroup1.ItemIndex of
0: begin
self.SpeedButton1.Enabled:=true;
self.SpeedButton1.Caption:=’можно’;
end;
1: begin
self.SpeedButton1.Enabled:=false;
self.SpeedButton1.Caption:=’не активна’;
end;
end;
end;

Обработка кликов по радиокнопкам

В кликах устанавливаются необходимые значения для «AllowAllUp» и «GroupIndex».

Если кнопка не находится в групповом режимк, то «SpeedButton1.Down» всегда «false».

Но если кнопка «SpeedButton…» находилась в групповом режиме и была зафиксирована, то в момент клика по радиокнопке «RadioButton1» значение «SpeedButton….Down» будет «true».

procedure TForm1.RadioButton1Click(Sender: TObject);
begin

self.SpeedButton1.AllowAllUp:=true;
self.SpeedButton1.GroupIndex:=0;//разрушаем группу, если она была создана
self.SpeedButton2.AllowAllUp:=true;
self.SpeedButton2.GroupIndex:=0;
self.SpeedButton3.AllowAllUp:=true;
self.SpeedButton3.GroupIndex:=0;
memo1.Text:=’Каждая кнопка работает индивидуально;

if SpeedButton1.Down then//первая радиокнопка должна отжать все нажатые кнопки. Это делается в конце процедуры. Здесь же подготавливаются значения для компонент, характерные для отжатой кнопки.
begin
self.Edit2.Text:=’не фиксирована’;
self.BitBtn3.Enabled:=true;
self.BitBtn3.Font.Style:=[fsBold];
self.BitBtn3.Caption:=’АКТИВНА’;
self.SpeedButton1.Caption:=’можно’;

end;

if self.SpeedButton2.Down then
self.Edit2.Text:=’не фиксирована’;

if SpeedButton3.Down then
self.Edit2.Text:=’не фиксирована’;

self.SpeedButton1.Down:=false;//отжимаем кнопку
self.SpeedButton2.Down:=false;
self.SpeedButton3.Down:=false;
end;

procedure TForm1.RadioButton2Click(Sender: TObject);
begin
self.SpeedButton1.AllowAllUp:=true;
self.SpeedButton1.GroupIndex:=2;//создаём группу
self.SpeedButton2.AllowAllUp:=true;
self.SpeedButton2.GroupIndex:=2;
self.SpeedButton3.AllowAllUp:=true;
self.SpeedButton3.GroupIndex:=2;
self.memo1.Text:=’Кнопки работают как группа. Нажатая кнопка может быть
отжата.’;
if self.SpeedButton2.Down then
self.Edit2.Text:=’зафиксирована’
else
self.Edit2.Text:=’не фиксирована’;
end;

procedure TForm1.RadioButton3Click(Sender: TObject);
begin
self.SpeedButton1.AllowAllUp:=false;
self.SpeedButton1.GroupIndex:=2;
self.SpeedButton2.AllowAllUp:=false;
self.SpeedButton2.GroupIndex:=2;
self.SpeedButton3.AllowAllUp:=false;
self.SpeedButton3.GroupIndex:=2;
self.memo1.Text:=’Кнопки работают как группа. Нажатая кнопка НЕ может быть
отжата.’;
if self.SpeedButton2.Down then
self.Edit2.Text:=’зафиксирована’
else
self.Edit2.Text:=’не фиксирована’;
end;

procedure TForm1.BitBtn3Click(Sender: TObject);
var i:integer;
begin
i:=strtoint(self.Edit3.Text);
inc(i);
self.Edit3.Text:= inttostr(i);
end;

Замечание. В приведённом коде прописаны полные пути доступа к свойству компонента: «ссылка_на_форму».«ссылка_на_компонент_принадлежащий_форме».«свойство_компонента».
Например: Form1.Edit1.Text
Но каждый компонент при своём создании содержит внутри класса ссылку на самог’о себя, поэтому «Form1.Edit1.Text» можно заменить на «self.Edit1.Text».
В то же время ссылка «self» добавляется к тексту оператора автоматически, поэтому записи «self.Edit1.Text» и «Edit1.Text» эквивалентны. Однако непосредственное использование «self»предоставляет некоторые удобства при вводе текста программы.

* * *

Обновлено: 05.08.2021 — 17:29

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *