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

StackOverflow https://stackoverflow.com/questions/202702

  •  03-07-2019
  •  | 
  •  

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.

¿Fue útil?

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;
....
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top