Cómo hacer que un TSpeedButton de Delphi permanezca presionado si es el único en el grupo
Pregunta
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 " AllowAllUp " se presiona. Tal vez un control Jedi sería suficiente, pero espero que haya alguna solución. Cualquier ayuda o anécdota son apreciadas.
Por cierto, todavía estoy usando Delphi 7, no estoy seguro de si se trata de un problema en general.
Solución
No tengo D7 aquí, pero en D2006 un Speedbutton permanece abajo si el GroupIndex tiene un valor > 0.
Si este no es el comportamiento que desea, puede configurar Down-Property manualmente en OnClick-Eventhandler (asegúrese de que el GroupIndex es 0).
Otros consejos
Acabo de intentarlo en Delphi 7 (compilación 4.453):
- crear nueva aplicación
- agregue
TSpeedButton
para formar - establecer
AllowAllUp: = true;
- establecer
GroupIndex: = 1;
- ejecutar aplicación
Al hacer clic en el botón cambia su estado hacia abajo sin ningún otro código necesario.
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
Delphi hace el trabajo por ti, así que " no escribas NINGÚN CÓDIGO " ;.
En el IDE, seleccione TODOS sus SpeedButtons que quiere operar como un grupo y luego establecer el conjunto el grupo " GroupIndex " a algo distinto de " 0 " y listo - ¡SIN NINGÚN CÓDIGO - NADA!
Hm, extraño, recuerdo haber usado esto varias veces con éxito. ¿Quizás deberías intentar jugar con la propiedad Down
del SpeedButton? No creo que cambie automáticamente cuando haces clic en él, deberías cambiar explícitamente Down
, supongo ...
[edit: reemplazó Checked
por Down
--- TSpeedButton no tiene una propiedad de Checked
, ¡lo siento!]
Para que esto funcione, no puedes simplemente cambiar la propiedad Abajo, porque siempre está abajo en el evento OnClick. Necesitas tener otro valor:
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
MyBoolProperty := not MyBoolProperty;
SpeedButton1.Down := MyBoolProperty;
end;
El truco consiste en establecer GroupIndex en un valor único y establecer AllowAllUp en true. Si olvidas lo primero, no se quedará abajo, si olvidas lo segundo, no se quedará arriba una vez que se haya caído.
Establezca AllowAllUp en True.
Establezca GroupIndex en no 0.
Para mantenerlo 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 uno de los botones del grupo puede estar activo. Todos ellos deben tener el mismo índice más alto que 0
.
AllowAllUp
permite cambiar el botón hacia abajo y hacia arriba, cuando se hace clic 2 veces seguidas.
Estaba buscando una solución para mi problema y creo que este es el mismo. Quería hacer un SpeedButton para cambiar el estado hacia arriba y hacia abajo como un interruptor, y lo conseguí configurando 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 activa el botón hacia abajo cuando se hace clic y hacia arriba 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;
....