2010-08-27 11 views
5

OK, questo dovrebbe essere facile, ma non trovo la soluzione, almeno non nel not so good documentation .. In un TTaskDialog, hai la possibilità di aggiungere un check-box. È possibile controllare il suo stato iniziale tramite il flag tfVerificationFlagChecked in Flags. Ma come ottenere lo stato dopo che la finestra di dialogo è stata Execute d?Come verificare se la casella di controllo è spuntata in un Delphi TTaskDialog?

Ovviamente è possibile utilizzare l'evento OnVerificationClicked e alternare una variabile locale, inizialmente uguale allo stato iniziale della casella di controllo, su ogni chiamata. Ma ci si aspetterebbe una soluzione più naturale.

+0

La documentazione ufficiale, a proposito, è pessima. Prendi questo ad esempio: http://docwiki.embarcadero.com/VCL/en/Dialogs.TCustomTaskDialog.URL Non spiegano nemmeno * cosa * URL questo è. Non è ovvio che ci sia un URL associato a ogni finestra di dialogo delle attività. E qui (http://docwiki.embarcadero.com/VCL/en/Dialogs.TCustomTaskDialog.Execute) si dimenticano di spiegare cosa significa il risultato (booleano) della funzione! –

+1

Hai il codice sorgente, giusto? Cerca dove viene utilizzata la funzione API di dialogo. Dovrebbe chiamare TaskDialogIndirect. Il quarto parametro è ciò che alla fine riceverà il valore della casella di controllo, quindi cosa fa il codice? –

+0

@Rob Kennedy: Sì, l'API di Windows è molto ben documentata, quindi questa è (sempre) una buona idea. Sto cercando ora ... –

risposta

9

O mio Dio, Embarcadero ha commesso un errore.

Alcuni test hanno dimostrato che se la casella di controllo inizialmente non è selezionata, ma viene controllata dall'utente, verrà impostato il flag tfVerificationFlagChecked. Ma se il flag è impostato inizialmente e l'utente deseleziona la casella, allora tfVerificationFlagChecked non verrà rimosso dal set Flags. E questo non è strano. Il codice VCL fa

Result := TaskDialogIndirect(LTaskDialog, {$IFNDEF CLR}@{$ENDIF}LModalResult, 
    {$IFNDEF CLR}@{$ENDIF}LRadioButton, {$IFNDEF CLR}@{$ENDIF}LVerificationChecked) = S_OK; 
FModalResult := LModalResult; 
if Result then 
begin 
    FButton := TTaskDialogButtonItem(FButtons.FindButton(FModalResult)); 
    FRadioButton := TTaskDialogRadioButtonItem(FRadioButtons.FindButton(LRadioButton)); 
    if LVerificationChecked then 
    Include(FFlags, tfVerificationFlagChecked); 
end; 

Si noti che la bandiera è incluso se la casella è selezionata quando la finestra si chiude, ma non v'è alcun codice per rimuovere la bandiera se la casella è selezionata dall'utente.

Naturalmente, ci si aspetterebbe l'ultima parte del codice di aver letto

if LVerificationChecked then 
    Include(FFlags, tfVerificationFlagChecked) 
    else 
    Exclude(FFlags, tfVerificationFlagChecked) 

penso che andrò con l'approccio commutazione manuale OnVerificationClicked.

+2

Mentre codifichi il tuo work-around, ti piacerebbe anche aggiungere un rapporto su questo su Quality Central (se non lo hai già fatto) altrimenti sicuramente non sarà mai risolto ... –

2

Non riesci a leggere Flags dopo aver chiuso la finestra di dialogo per vedere se tfVerificationFlagChecked è ancora presente?

+0

No. Ho provato. E la documentazione dice anche "Se impostato, la casella di controllo di verifica è ** inizialmente ** controllata". –

+0

È vero, ma poiché abbiamo già stabilito che la documentazione non è molto buona, non possiamo supporre che la parte "iniziale" sia accurata. –

+0

Rob Kennedy: D'accordo su quello! :) –

0

In Delphi XE7 (probabilmente anche nelle versioni precedenti) questo sembra essere stato risolto.

choice := tfVerificationFlagChecked in tskbox.Flags; 

scelta, una variabile booleana, può restituire lo stato selezionato.

Problemi correlati