Comment faire en sorte qu'un TSpeedButton de Delphi reste enfoncé s'il est le seul du groupe
Question
Je ne suis pas sûr de savoir pourquoi TSpeedButton a cette propriété, mais lorsqu'un TSpeedButton est le seul bouton d'un index de groupe donné, il ne reste pas enfoncé, qu'il soit ou non "AllowAllUp". est pressé. Peut-être qu'un contrôle Jedi suffirait, mais j'espère qu'il y a une solution. Toute aide ou anecdote est appréciée.
BTW, j'utilise (toujours) Delphi 7, je ne suis pas sûr qu'il s'agisse d'une énigme générale.
La solution
Je n'ai pas de D7 ici, mais dans D2006, un bouton Speed ??reste inactif si GroupIndex a une valeur > 0.
Si ce n'est pas le comportement que vous souhaitez, vous pouvez définir manuellement la propriété Down dans OnClick-Eventhandler (assurez-vous que GroupIndex est 0).
Autres conseils
Je viens d'essayer cela dans Delphi 7 (version 4.453):
- créer une nouvelle application
- ajoutez
TSpeedButton
pour former - définir
AllowAllUp: = true;
- set
GroupIndex: = 1;
- exécuter l'application
Lorsque vous cliquez sur le bouton, il passe en mode veille sans qu'aucun autre code ne soit nécessaire.
knight_killer est correct. Je peux vous dire que cela fonctionnera dans n'importe quelle version de Delphi:
object SpeedButton1: TSpeedButton
Left = 152
Top = 384
Width = 23
Height = 22
AllowAllUp = True
GroupIndex = 99
end
Delphi fait le travail pour vous, donc "n'écrivez AUCUN CODE".
Dans l’EDI, sélectionnez TOUS vos boutons Speed ??que vous vouloir fonctionner en tant que groupe, puis définir l'ensemble " GroupIndex & group; vers quelque chose d'autre que " 0 " et vous avez terminé - sans code - NADA !!
Down
du SpeedButton? Je ne pense pas que cela bascule automatiquement lorsque vous cliquez dessus - vous devriez explicitement basculer Bas
, je suppose ...
[modifier: coché
remplacé par bas
--- TSpeedButton n'a pas de propriété Coché
, désolé!]
Pour que cela fonctionne, vous ne pouvez pas simplement basculer la propriété Down, car elle est toujours en panne dans l'événement OnClick. Vous devez avoir une autre valeur:
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
MyBoolProperty := not MyBoolProperty;
SpeedButton1.Down := MyBoolProperty;
end;
L'astuce consiste à définir GroupIndex sur une valeur unique et à définir AllowAllUp sur true. Si vous oubliez le premier, il ne restera pas en bas, si vous oubliez le second, il ne restera pas en place une fois qu'il est tombé.
Définissez AllowAllUp sur True.
Définissez GroupIndex sur une valeur autre que 0.
Pour tout conserver dans OnClick, essayez
with Speedbutton1 do
begin
if tag = 1 then tag := 0 else tag := 1;
down := (tag = 1);
end;
GroupIndex
regroupe les boutons. Un seul bouton du groupe peut être actif. Tous doivent avoir le même index supérieur à 0
.
AllowAllUp
permet de basculer le bouton vers le haut et le bas lorsque l'utilisateur clique dessus 2 fois de suite.
Je cherchais une solution à mon problème et je pense que c'est un peu la même chose. Je voulais faire en sorte qu'un SpeedButton permute les états haut et bas comme un commutateur, et j'ai réussi en définissant les propriétés:
AllowAllUp := True;
GroupIndex := 1;
Ensuite, dans l'événement OnClick
du bouton que j'ai écrit:
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;
Ceci fait basculer le bouton vers le bas quand il est cliqué et vers le haut quand il est cliqué à nouveau.
J'espère que ça vous sera utile
Définissez AllowAllup sur true et Down sur false.
Puis dans l'événement OnClick
:
....
btn.AllowAllUp := not btn.AllowAllUp;
btn.Down := not btn.Down;
....