Как заставить Delphi TSpeedButton оставаться нажатой, если она единственная в группе

Я не уверен, почему TSpeedButton имеет это свойство, но когда TSpeedButton является единственной кнопкой данного groupindex, она не остается нажатой, нажата ли "AllowAllUp". Может быть, джедайский контроль был бы достаточным, но, надеюсь, есть какое-то исправление. Любая помощь или анекдоты приветствуются.

кстати, я (все еще) использую Delphi 7, не уверен, что это сквозная головоломка.

11 ответов


У меня здесь нет D7, но в D2006 кнопка Speed остается вниз, если GroupIndex имеет значение > 0.

Если это не то поведение, которое вы хотите, вы можете установить Down-свойство вручную в OnClick-Eventhandler (убедитесь, что GroupIndex равен 0).


Я только что попробовал это в Delphi 7 (Build 4.453):

  • создать новое приложение
  • добавить TSpeedButton в форме
  • set AllowAllUp := true;
  • set GroupIndex := 1;
  • запустить приложение

при нажатии кнопки он переключает его вниз состояние без какого-либо другого кода, необходимого.


knight_killer является правильным. я могу сказать вам, что он будет работать в любой версии delphi:

object SpeedButton1: TSpeedButton
  Left = 152
  Top = 384
  Width = 23
  Height = 22
  AllowAllUp = True
  GroupIndex = 99
end

Delphi делает работу за вас, поэтому "не пишите никакого кода".

в IDE выберите все ваши кнопки SpeedButtons, которые вы хотите работать как группа, а затем все "GroupIndex группы" на что-то другое, чем "0" и вы закончили - без кода - нада!!


Хм, странно, я помню, что использовал это несколько раз с успехом. Возможно, вы должны попробовать играть с SpeedButton в Down собственность? Я не думаю, что он автоматически переключается при нажатии на него - - - вы должны явно переключать Down, Я думаю...

[edit: replaced 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;
....