How to make a Delphi TSpeedButton stay pressed if it's the only one in the group
Asked Answered
S

11

14

I'm not sure why the TSpeedButton has this property but when a TSpeedButton is the only button of a given groupindex, it doesn't stay pressed, whether or not "AllowAllUp" is pressed. Maybe a Jedi control would suffice, but hopefully there's some fix. Any help or anecdotes are appreciated.

BTW, I'm (still) using Delphi 7, not sure if this is an across the board conundrum.

Simon answered 14/10, 2008 at 20:40 Comment(0)
Z
19

I have no D7 here, but in D2006 a Speedbutton stays down if the GroupIndex has a value > 0.

If this is not the behaviour you wish, you can set the Down-Property manually in the OnClick-Eventhandler (make sure, that the GroupIndex is 0).

Zygotene answered 14/10, 2008 at 20:47 Comment(0)
S
15

I just tried that in Delphi 7 (Build 4.453):

  • create new application
  • add TSpeedButton to form
  • set AllowAllUp := true;
  • set GroupIndex := 1;
  • run application

When clicking the button it toggles its down state without any other code needed.

Slily answered 15/10, 2008 at 15:46 Comment(2)
Like a perfect answer should be. Developers are very lazy these days.Aleenaleetha
If you read the Delphi documentation and any number of books on the subject, this is how it's done. Has been since Delphi 1. (Except the GroupIndex can be any value that's NOT used by any other button GroupIndex value; that button needs a unique number.)Muna
P
2

knight_killer is correct. i can tell you it'll work in any version of delphi:

object SpeedButton1: TSpeedButton
  Left = 152
  Top = 384
  Width = 23
  Height = 22
  AllowAllUp = True
  GroupIndex = 99
end
Polyhistor answered 14/10, 2008 at 21:48 Comment(1)
yes, use any GroupIndex you want. But it have to be greater then zeroZygotene
B
2

Delphi does the work for you so "don't write ANY CODE".

In the IDE select ALL of your SpeedButtons that you want to operate as a group and then set the whole group's "GroupIndex" to something other than "0" and you are done -- with NO CODE -- NADA!!

Bloomsbury answered 1/6, 2011 at 15:45 Comment(0)
C
1

Hm, strange, I remember using this quite a few times with success. Perhaps you should try playing with the SpeedButton's Down property? I don't think it toggles automatically when you click it --- you should explicitly toggle Down, I guess...

[edit: replaced Checked with Down --- TSpeedButton doesn't have a Checked property, sorry!]

Cursed answered 14/10, 2008 at 20:45 Comment(0)
R
1

The trick is to set the GroupIndex to a unique value and set AllowAllUp to true. If you forget the first, it will not stay down, if you forget the second, it will not stay up, once it has been down.

Richart answered 30/10, 2008 at 7:17 Comment(0)
B
1

GroupIndex groups the buttons. Only one buttons in the group may be active. All of them needs to have the same index higher than 0.

AllowAllUp allows to switch button down and up, when it is clicked 2 times in a row.

Blubber answered 20/10, 2017 at 11:57 Comment(0)
W
0

Set AllowAllup to true, and Down to false.

Then in OnClick event:

....
btn.AllowAllUp := not btn.AllowAllUp;
btn.Down       := not btn.Down;
....
Wrestling answered 4/3, 2013 at 23:5 Comment(0)
B
0

To get this to work, you can't just toggle the Down property, because it is always down in the OnClick event. You need to have another value:

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
  MyBoolProperty := not MyBoolProperty;
  SpeedButton1.Down := MyBoolProperty;
end;
Bordelon answered 10/3, 2014 at 6:14 Comment(0)
A
-1

I was searching for a solution for my problem and I think this is kind of the same one. I wanted to make a SpeedButton toggle the up and down state just like a switch, and I managed this by setting the properties:

AllowAllUp := True; 
GroupIndex := 1;

Then in the OnClick event of the button I wrote:

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;

This toggles the button down when it's clicked and up when it's clicked again.

Hope it'll be of any help

Adlay answered 29/10, 2008 at 16:36 Comment(0)
H
-1

Set AllowAllUp to True.

Set GroupIndex to non 0.

To keep it all in the OnClick, try

 with Speedbutton1 do
 begin
      if tag = 1 then tag := 0 else tag := 1;
      down := (tag = 1);
 end;
Hippolytus answered 3/4, 2015 at 14:55 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.