Come fare in modo che un Delphi TSpeedButton rimanga premuto se è l'unico nel gruppo
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.
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;
....