delphi vcl button

Cómo hacer que un Delphi TSpeedButton se mantenga presionado si es el único en el grupo



vcl (11)

No estoy seguro de por qué el TSpeedButton tiene esta propiedad, pero cuando un TSpeedButton es el único botón de un índice de grupo dado, no se mantiene presionado, ya sea que se presione o no "AllowAllUp". Tal vez un control Jedi sería suficiente, pero con suerte hay una solución. Cualquier ayuda o anécdota es apreciada.

Por cierto, estoy (todavía) usando Delphi 7, no estoy seguro si esto es un enigma general.


Hm, extraño, recuerdo haberlo usado bastantes veces con éxito. Tal vez deberías intentar jugar con la propiedad de Down del SpeedButton. No creo que se alterne automáticamente cuando haces clic en él --- debes alternar explícitamente Down , supongo ...

[edit: reemplazado Checked with Down --- TSpeedButton no tiene una propiedad Checked , lo siento!]


No tengo D7 aquí, pero en D2006, un botón Speed ​​se mantiene abajo si GroupIndex tiene un valor> 0.

Si este no es el comportamiento que desea, puede establecer la propiedad Abajo manualmente en OnClick-Eventhandler (asegúrese de que GroupIndex sea 0).


knight_killer es correcto. Puedo decirte que funcionará en cualquier versión de Delphi:

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


El truco es establecer GroupIndex en un valor único y establecer AllowAllUp en verdadero. Si te olvidas del primero, no se quedará abajo, si te olvidas del segundo, no se mantendrá en alto, una vez que haya caído.


Delphi hace el trabajo por usted para "no escribir CUALQUIER CÓDIGO".

En el IDE seleccione TODOS los SpeedButtons que desea operar como un grupo y luego configure "GroupIndex" de todo el grupo en algo que no sea "0" y habrá terminado - ¡SIN NINGÚN CÓDIGO - NADA!


Para que esto funcione, no puede simplemente alternar la propiedad Abajo, porque siempre está inactiva en el evento OnClick. Necesitas tener otro valor:

procedure TForm1.SpeedButton1Click(Sender: TObject); begin MyBoolProperty := not MyBoolProperty; SpeedButton1.Down := MyBoolProperty; end;


Establezca AllowAllUp en True.

Establezca GroupIndex a no 0.

Para mantener todo en OnClick, intente

with Speedbutton1 do begin if tag = 1 then tag := 0 else tag := 1; down := (tag = 1); end;


GroupIndex agrupa los botones. Solo un botón en el grupo puede estar activo. Todos ellos necesitan tener el mismo índice superior a 0 .

AllowAllUp permite cambiar el botón hacia arriba y hacia arriba, cuando se hace clic 2 veces seguidas.


Estaba buscando una solución para mi problema y creo que esta es la misma. Quería hacer un SpeedButton alternar el estado arriba y abajo como un interruptor, y lo logré estableciendo las propiedades:

AllowAllUp := True; GroupIndex := 1;

Luego, en el evento OnClick del botón que escribí:

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;

Esto alterna el botón cuando se hace clic y sube cuando se vuelve a hacer clic.

Espero que sea de alguna ayuda


Establezca AllowAllup en true y Down en false.

Luego, en el evento OnClick :

.... btn.AllowAllUp := not btn.AllowAllUp; btn.Down := not btn.Down; ....


Lo intenté en Delphi 7 (compilación 4.453):

  • crear nueva aplicación
  • agregar TSpeedButton para formar
  • establecer AllowAllUp := true;
  • establecer GroupIndex := 1;
  • ejecutar la aplicación

Al hacer clic en el botón, cambia su estado inactivo sin necesidad de ningún otro código.