Как сделать так, чтобы кнопка Delphi TSpeedButton оставалась нажатой, если она единственная в группе
Вопрос
Я не уверен, почему TSpeedButton обладает этим свойством, но когда TSpeedButton является единственной кнопкой данного groupindex, она не остается нажатой, независимо от того, нажат "AllowAllUp" или нет.Возможно, джедайского контроля было бы достаточно, но, надеюсь, это можно как-то исправить.Любая помощь или анекдоты приветствуются.
Кстати, я (все еще) использую Delphi 7, не уверен, что это универсальная головоломка.
Решение
У меня здесь нет D7, но в D2006 кнопка Speedbutton остается нажатой, если groupIndex имеет значение > 0.
Если это не то поведение, которое вы хотите, вы можете установить свойство Down вручную в OnClick-Eventhandler (убедитесь, что groupIndex равен 0).
Другие советы
Я только что попробовал это в Delphi 7 (сборка 4.453):
- создать новое приложение
- Добавить
TSpeedButton
для формирования - установленный
AllowAllUp := true;
- установленный
GroupIndex := 1;
- запустить приложение
При нажатии на кнопку он переключает свое выключенное состояние без необходимости какого-либо другого кода.
knight_killer прав.я могу сказать вам, что это будет работать в любой версии delphi:
object SpeedButton1: TSpeedButton
Left = 152
Top = 384
Width = 23
Height = 22
AllowAllUp = True
GroupIndex = 99
end
Delphi делает всю работу за вас, поэтому "не пишите НИКАКОГО КОДА".
В среде IDE выберите ВСЕ ваши кнопки быстрого доступа, которыми вы хотите управлять как группой, а затем установите для всей "groupIndex" группы значение, отличное от "0" и вы закончили - без КОДА - НАДА!!
Хм, странно, я помню, что довольно успешно использовал это несколько раз.Возможно, вам стоит попробовать поиграть с кнопкой SpeedButton Down
собственность?Я не думаю, что он переключается автоматически, когда вы нажимаете на него - вы должны явно переключать Down
, Я думаю...
[править:замененный Checked
с Down
--- У TSpeedButton нет кнопки Checked
собственность, извините!]
Чтобы заставить это работать, вы не можете просто переключить свойство Down, потому что оно всегда отключено в событии OnClick.Вам нужно иметь другое значение:
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
MyBoolProperty := not MyBoolProperty;
SpeedButton1.Down := MyBoolProperty;
end;
Хитрость заключается в том, чтобы присвоить groupIndex уникальное значение и присвоить AllowAllUp значение true.Если вы забудете первое, оно не останется внизу, если вы забудете второе, оно не останется наверху, после того как было опущено.
Установите для AllowAllUp значение True.
Установите для groupIndex значение, отличное от 0.
Чтобы сохранить все это в OnClick, попробуйте
with Speedbutton1 do
begin
if tag = 1 then tag := 0 else tag := 1;
down := (tag = 1);
end;
GroupIndex
группирует кнопки.Только одна кнопка в группе может быть активной.Все они должны иметь одинаковый индекс, превышающий 0
.
AllowAllUp
позволяет переключать кнопку вниз и вверх при нажатии на нее 2 раза подряд.
Я искал решение своей проблемы, и я думаю, что это примерно то же самое.Я хотел заставить SpeedButton переключать состояние вверх и вниз точно так же, как переключатель, и я справился с этим, установив свойства:
AllowAllUp := True;
GroupIndex := 1;
Затем в OnClick
событие кнопки, которую я написал:
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
if( SpeedButton1.AllowAllUp ) then
begin
SpeedButton1.AllowAllUp := False;
SpeedButton1.Down := True;
end else
begin
SpeedButton1.AllowAllUp := True;
SpeedButton1.Down := False;
end;
end;
Это переключает кнопку вниз при нажатии и вверх при повторном нажатии.
Надеюсь, это чем-нибудь поможет
Установите для AllowAllup значение true, а для Down - значение false.
Затем в OnClick
событие:
....
btn.AllowAllUp := not btn.AllowAllUp;
btn.Down := not btn.Down;
....