Come fare in modo che un Delphi TSpeedButton rimanga premuto se è l'unico nel gruppo

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

  •  03-07-2019
  •  | 
  •  

Domanda

Non sono sicuro del motivo per cui TSpeedButton abbia questa proprietà ma quando TSpeedButton è l'unico pulsante di un determinato indice di gruppo, non rimane premuto, indipendentemente dal fatto che " AllowAllUp " è premuto. Forse un controllo Jedi sarebbe sufficiente, ma speriamo che ci sia qualche soluzione. Qualsiasi aiuto o aneddoto è apprezzato.

A proposito, sto (ancora) usando Delphi 7, non sono sicuro che si tratti di un enigma generalizzato.

È stato utile?

Soluzione

Non ho D7 qui, ma in D2006 un Speedbutton rimane inattivo se GroupIndex ha un valore > 0.

Se questo non è il comportamento desiderato, è possibile impostare manualmente la proprietà Down in OnClick-Eventhandler (assicurarsi che GroupIndex sia 0).

Altri suggerimenti

L'ho appena provato in Delphi 7 (Build 4.453):

  • crea una nuova applicazione
  • aggiungi TSpeedButton al modulo
  • imposta AllowAllUp: = true;
  • imposta GroupIndex: = 1;
  • esegui applicazione

Quando si fa clic sul pulsante, lo stato viene disattivato senza che sia necessario alcun altro codice.

knight_killer è corretto. posso dirti che funzionerà in qualsiasi versione di delphi:

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

Delphi fa il lavoro per te, quindi "non scrivere QUALSIASI CODICE".

Nell'IDE seleziona TUTTI i tuoi SpeedButton che desideri desidera operare come gruppo e quindi impostare il tutto gruppo "GroupIndex" a qualcosa di diverso da " 0 " e il gioco è fatto - SENZA CODICE - NADA !!

Hm, strano, ricordo di averlo usato parecchie volte con successo. Forse dovresti provare a giocare con la proprietà Down di SpeedButton? Non credo che si commuta automaticamente quando fai clic su di esso --- dovresti esplicitamente attivare Giù , immagino ...

[modifica: sostituito Controllato con Giù --- TSpeedButton non ha una proprietà Controllato , scusa!]

Per farlo funzionare, non puoi semplicemente attivare o disattivare la proprietà Down, perché è sempre inattiva nell'evento OnClick. Devi avere un altro valore:

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

Il trucco è impostare GroupIndex su un valore univoco e impostare AllowAllUp su true. Se dimentichi il primo, non rimarrà giù, se dimentichi il secondo, non rimarrà su, una volta che è stato giù.

Imposta AllowAllUp su True.

Imposta GroupIndex su non 0.

Per mantenere tutto in OnClick, prova

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

GroupIndex raggruppa i pulsanti. È possibile che sia attivo solo un pulsante nel gruppo. Tutti devono avere lo stesso indice superiore a 0 .

AllowAllUp consente di cambiare il pulsante verso il basso e verso l'alto, quando si fa clic 2 volte di seguito.

Stavo cercando una soluzione per il mio problema e penso che sia la stessa. Volevo fare uno SpeedButton per commutare lo stato su e giù come un interruttore, e ci sono riuscito impostando le proprietà:

AllowAllUp := True; 
GroupIndex := 1;

Quindi nell'evento OnClick del pulsante che ho scritto:

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;

Questo attiva o disattiva il pulsante quando viene cliccato e su quando viene cliccato di nuovo.

Spero che possa esserti di aiuto

Imposta AllowAllup su true e Down su false.

Quindi nell'evento OnClick :

....
btn.AllowAllUp := not btn.AllowAllUp;
btn.Down       := not btn.Down;
....
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top