2010-08-27 16 views
5

Bien, esto debería ser fácil, pero no encuentro la solución, al menos no en el not so good documentation .. En un TTaskDialog, tiene la opción de agregar una casilla de verificación. Puede controlar su estado inicial mediante el indicador tfVerificationFlagChecked en Flags. Pero, ¿cómo obtener el estado después del diálogo ha sido Execute d?¿Cómo verificar si la casilla de verificación está marcada en Delphi TTaskDialog?

Por supuesto, se puede usar el evento OnVerificationClicked y alternar una variable local, inicialmente igual al estado inicial de la casilla de verificación, en cada llamada. Pero uno esperaría una solución más natural.

+0

La documentación oficial, por cierto, es horrible. Toma esto como ejemplo: http://docwiki.embarcadero.com/VCL/en/Dialogs.TCustomTaskDialog.URL Ni siquiera explican * what * URL esto es. No es evidente que haya una URL asociada a cada diálogo de tarea. Y aquí (http://docwiki.embarcadero.com/VCL/en/Dialogs.TCustomTaskDialog.Execute) se olvidan de explicar qué significa el resultado (booleano) de la función. –

+1

Tiene el código fuente, ¿verdad? Busque dónde se usa la función API de diálogo. Debería llamar a TaskDialogIndirect. El cuarto parámetro es el que finalmente recibirá el valor de la casilla de verificación, entonces, ¿qué hace el código con él? –

+0

@Rob Kennedy: Sí, la API de Windows está muy bien documentada, por lo que esta es (siempre) una buena idea. Estoy buscando ahora ... –

Respuesta

9

O Dios mío, Embarcadero ha cometido un error.

Algunas pruebas mías mostraron que si la casilla de verificación inicialmente está desmarcada, pero es verificada por el usuario, se establecerá la bandera tfVerificationFlagChecked. Pero si la bandera se establece inicialmente, y el usuario desmarca la casilla, entonces tfVerificationFlagChecked no se eliminará del conjunto Flags. Y esto no es extraño El código VCL hace

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; 

en cuenta que la bandera se incluye si está marcada la casilla de verificación cuando se cierra el diálogo, pero no hay un código para quitar la bandera si la casilla está desactivada por el usuario.

Por supuesto, uno esperaría que la última parte del código de haber leído

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

Creo que voy a ir con el enfoque de cambiar de manera manual OnVerificationClicked.

+2

Mientras codifica su solución alternativa, también podría agregar un informe sobre esto en Quality Central (si aún no lo ha hecho); de lo contrario, seguramente nunca se solucionará ... –

2

¿No puede leer Flags después de cerrar el cuadro de diálogo para ver si tfVerificationFlagChecked todavía está presente?

+0

No. Intenté eso. Y la documentación también dice "Si está configurada, la casilla de verificación está ** inicialmente ** marcada". –

+0

Es cierto, pero como ya hemos establecido que la documentación no es muy buena, no podemos suponer que la parte "inicial" sea precisa. –

+0

Rob Kennedy: ¡De acuerdo en eso! :) –

0

En Delphi XE7 (posiblemente versiones anteriores, también) esto parece haberse resuelto.

choice := tfVerificationFlagChecked in tskbox.Flags; 

opción, una variable booleana, puede devolver el estado verificado.

Cuestiones relacionadas