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.