delphi ttaskdialog

delphi - ¿Cómo usar el TTaskDialog?



(4)

¿Cómo se usa la clase TTaskDialog (en Delphi 2009 y posterior)? La documentación oficial no ha ayudado. De hecho, aprendes mucho más al examinar la clase usando CodeInsight o el código fuente de VCL. No hay explicaciones pedagógicas allí, pero al menos tampoco hay errores (bueno, solo unos pocos ).

Y hace poco, me pregunté cómo podría responder a los clics del hipervínculo en el cuadro de diálogo. De hecho, al establecer el indicador tfEnableHyperlinks , puede incluir hipervínculos HTML en las partes textuales del diálogo. (Bueno, el documento dice sobre la bandera: "Si está configurado, el contenido, el pie de página y el texto expandido pueden incluir hipervínculos." Naturalmente, es "obvio" que los enlaces se implementan utilizando el elemento <A HTML.) Y logré Me imagino a mí mismo que utiliza el evento OnHyperLinkClick para responder a los clics en los hipervínculos. Pero este evento es un TNotifyEvent , entonces, ¿cómo sabes en qué enlace se hizo clic? Bueno, la documentación no decía nada sobre eso, así que tuve que adivinar. Eventualmente descubrí que la propiedad pública URL del diálogo está configurada, así que podría hacer

procedure TmainFrm.TaskDialogHyperLinkClicked(Sender: TObject); begin if Sender is TTaskDialog then with Sender as TTaskDialog do ShellExecute(0, ''open'', PChar(URL), nil, nil, SW_SHOWNORMAL); end;

La documentación oficial dice, con respecto a esta propiedad:

La URL contiene la URL para el Diálogo de Tarea.

Ahora, tienes que admitir, ¡esa es una gran explicación! Pero es peor que esto: no solo falta la documentación en las explicaciones, sino que también contiene errores. Por ejemplo ,

ExpandButtonCaption: información adicional para este botón.

Eso no es muy exacto. ¿Qué botón? Si muestra la ayuda para esta propiedad en particular, dice

ExpandButtonCaption contiene texto adicional para mostrar cuando se expande el título.

No es bueno tampoco. ¿Qué subtítulo? Una explicación adecuada sería

ExpandButtonCaption es el texto que se muestra junto al botón que permite al usuario ampliar el cuadro de diálogo para que muestre más información. Por ejemplo, esta propiedad podría ser "Más detalles".

En cualquier caso, actualmente estoy intentando crear un diálogo con dos botones de enlace de comando. Sé que el sistema operativo puede mostrar estos botones con una leyenda y una explicación más larga, pero parece que no puedo hacer que funcione con TTaskButton . La documentación no es genial .

Pero en lugar de preguntar cómo lograr esta cosa particular aquí en SO, haré otra pregunta:

¿Hay alguna documentación (no oficial) para la clase TTaskDialog?


Aquí está mi breve documentación:

  1. No lo use, a menos que no desee que su aplicación funcione en XP.

  2. Sugiera mejoras en el contenido de delphi doc wiki , como hicieron otros, pero tenga en cuenta la frase "Nota: los cuadros de diálogo de tareas requieren Vista o Windows 7". ese es el código para "¡No lo use!". Básicamente, alguien tuvo la idea de soportar completamente los nuevos diálogos de Windows Vista, y la forma en que se hizo, fue escribir un código de envoltura que solo llama a las API de diálogo. Como no se le proporciona ninguna funcionalidad alternativa, no tiene suerte en XP.


Esto es algo viejo, pero lo agrego aquí para completarlo:

SynTaskDialog

TTaskDialog unidad que funciona bajo XP (con VCL), pero utiliza el sistema TaskDialog en Vista +.


Si no puede encontrar la documentación, escríbala :

El Hola Mundo de un Diálogo de Tarea

with TTaskDialog.Create(Self) do try Caption := ''My Application''; Title := ''Hello World!''; Text := ''I am a TTaskDialog, that is, a wrapper for the Task Dialog introduced '' + ''in the Microsoft Windows Vista operating system. Am I not adorable?''; CommonButtons := [tcbClose]; Execute; finally Free; end;

Caption título es el texto que se muestra en la barra de título de la ventana, el Title es el encabezado y el Text es el cuerpo del diálogo. No hace falta decir que Execute muestra el diálogo de la tarea y el resultado se muestra a continuación. (Volveremos a la propiedad CommonButtons en una o dos secciones).

Ser un ciudadano bien educado

Por supuesto, el diálogo de tareas bloqueará el programa si se ejecuta en Windows XP, donde no hay API de diálogo de tareas. Tampoco funcionará si los temas visuales están deshabilitados. En cualquiera de estos casos, debemos apegarnos al MessageBox pasado de moda. Por lo tanto, en una aplicación real, tendríamos que hacer

if (Win32MajorVersion >= 6) and ThemeServices.ThemesEnabled then with TTaskDialog.Create(Self) do try Caption := ''My Application''; Title := ''Hello World!''; Text := ''I am a TTaskDialog, that is, a wrapper for the Task Dialog introduced '' + ''in the Microsoft Windows Vista operating system. Am I not adorable?''; CommonButtons := [tcbClose]; Execute; finally Free; end else MessageBox(Handle, ''I am an ordinary MessageBox conveying the same message in order to support'' + ''older versions of the Microsoft Windows operating system (XP and below).'', ''My Application'', MB_ICONINFORMATION or MB_OK);

En el resto de este artículo, supondremos que se está pagando la tax de compatibilidad con versiones anteriores y, en su lugar, solo nos concentraremos en el diálogo de tareas.

Tipos de cuadros de diálogo Resultados modales

La propiedad CommonButtons es del tipo TTaskDialogCommonButtons , definida como

TTaskDialogCommonButton = (tcbOk, tcbYes, tcbNo, tcbCancel, tcbRetry, tcbClose); TTaskDialogCommonButtons = set of TTaskDialogCommonButton;

Esta propiedad determina los botones que se muestran en el cuadro de diálogo (si no se agregan botones manualmente, como lo haremos más adelante). Si el usuario hace clic en cualquiera de estos botones, el valor de TModalResult correspondiente se almacenará en la propiedad ModalResult en cuanto Execute haya regresado. La propiedad MainIcon determina el icono que se muestra en el cuadro de diálogo y, por supuesto, debe reflejar la naturaleza del cuadro de diálogo, al igual que el conjunto de botones. Formalmente un entero, MainIcon se puede establecer en cualquiera de los valores tdiNone , tdiWarning , tdiError , tdiInformation y tdiShield .

with TTaskDialog.Create(Self) do try Caption := ''My Application''; Title := ''The Process''; Text := ''Do you want to continue even though [...]?''; CommonButtons := [tcbYes, tcbNo]; MainIcon := tdiNone; // There is no tdiQuestion if Execute then if ModalResult = mrYes then beep; finally Free; end;

A continuación se muestran ejemplos de los tipos de iconos restantes (escudo, advertencia y error, respectivamente):

Finalmente, debe saber que puede usar la propiedad DefaultButton para establecer el botón predeterminado en el cuadro de diálogo.

with TTaskDialog.Create(Self) do try Caption := ''My Application''; Title := ''The Process''; Text := ''Do you want to continue even though [...]?''; CommonButtons := [tcbYes, tcbNo]; DefaultButton := tcbNo; MainIcon := tdiNone; if Execute then if ModalResult = mrYes then beep; finally Free; end;

Botones personalizados

Puede agregar botones personalizados a un diálogo de tareas. De hecho, puede establecer la propiedad CommonButtons en el conjunto vacío y depender completamente de botones personalizados (y un número ilimitado de dichos botones también). El siguiente ejemplo del mundo real muestra un cuadro de diálogo de este tipo:

with TTaskDialog.Create(self) do try Title := ''Confirm Removal''; Caption := ''Rejbrand BookBase''; Text := Format(''Are you sure that you want to remove the book file named "%s"?'', [FNameOfBook]); CommonButtons := []; with TTaskDialogButtonItem(Buttons.Add) do begin Caption := ''Remove''; ModalResult := mrYes; end; with TTaskDialogButtonItem(Buttons.Add) do begin Caption := ''Keep''; ModalResult := mrNo; end; MainIcon := tdiNone; if Execute then if ModalResult = mrYes then DoDelete; finally Free; end

Enlaces de comando

En lugar de botones clásicos, los botones del diálogo de tarea pueden ser enlaces de comando. Esto se logra estableciendo el indicador tfUseCommandLinks (en Flags ). Ahora también puede establecer la propiedad CommandLinkHint (por botón):

with TTaskDialog.Create(self) do try Title := ''Confirm Removal''; Caption := ''Rejbrand BookBase''; Text := Format(''Are you sure that you want to remove the book file named "%s"?'', [FNameOfBook]); CommonButtons := []; with TTaskDialogButtonItem(Buttons.Add) do begin Caption := ''Remove''; CommandLinkHint := ''Remove the book from the catalogue.''; ModalResult := mrYes; end; with TTaskDialogButtonItem(Buttons.Add) do begin Caption := ''Keep''; CommandLinkHint := ''Keep the book in the catalogue.''; ModalResult := mrNo; end; Flags := [tfUseCommandLinks]; MainIcon := tdiNone; if Execute then if ModalResult = mrYes then DoDelete; finally Free; end

El indicador tfAllowDialogCancellation restaurará el elemento de menú de cierre del sistema (y el botón de la barra de título; de hecho, restaurará todo el menú del sistema).

No arroje detalles técnicos al usuario final

Puede usar las propiedades ExpandedText y ExpandedButtonCaption para agregar un fragmento de texto (el primero) que solo se muestra después de que el usuario haga clic en un botón (a la izquierda del texto en la última propiedad) para solicitarlo.

with TTaskDialog.Create(self) do try Title := ''Confirm Removal''; Caption := ''Rejbrand BookBase''; Text := Format(''Are you sure that you want to remove the book file named "%s"?'', [FNameOfBook]); CommonButtons := []; with TTaskDialogButtonItem(Buttons.Add) do begin Caption := ''Remove''; CommandLinkHint := ''Remove the book from the catalogue.''; ModalResult := mrYes; end; with TTaskDialogButtonItem(Buttons.Add) do begin Caption := ''Keep''; CommandLinkHint := ''Keep the book in the catalogue.''; ModalResult := mrNo; end; Flags := [tfUseCommandLinks, tfAllowDialogCancellation]; ExpandButtonCaption := ''Technical information''; ExpandedText := ''If you remove the book item from the catalogue, the corresponding *.book file will be removed from the file system.''; MainIcon := tdiNone; if Execute then if ModalResult = mrYes then DoDelete; finally Free; end

La imagen a continuación muestra el diálogo después de que el usuario ha hecho clic en el botón para revelar los detalles adicionales.

Si agrega el indicador tfExpandFooterArea , el texto adicional se mostrará en su lugar en el pie de página:

En cualquier caso, puede permitir que el cuadro de diálogo se abra con los detalles ya expandidos agregando el indicador tfExpandedByDefault .

Iconos personalizados

Puede utilizar cualquier icono personalizado en un cuadro de diálogo de tareas, utilizando el indicador tfUseHiconMain y especificando el TIcon para usar en la propiedad CustomMainIcon .

with TTaskDialog.Create(self) do try Caption := ''About Rejbrand BookBase''; Title := ''Rejbrand BookBase''; CommonButtons := [tcbClose]; Text := ''File Version: '' + GetFileVer(Application.ExeName) + #13#10#13#10''Copyright © 2011 Andreas Rejbrand''#13#10#13#10''http://english.rejbrand.se''; Flags := [tfUseHiconMain, tfAllowDialogCancellation]; CustomMainIcon := Application.Icon; Execute; finally Free; end

Hipervínculos

Incluso puede usar hipervínculos tipo HTML en el cuadro de diálogo (en Text , Footer, y Text ExpandedText ), si solo agrega el indicador tfEnableHyperlinks :

with TTaskDialog.Create(self) do try Caption := ''About Rejbrand BookBase''; Title := ''Rejbrand BookBase''; CommonButtons := [tcbClose]; Text := ''File Version: '' + GetFileVer(Application.ExeName) + #13#10#13#10''Copyright © 2011 Andreas Rejbrand''#13#10#13#10''<a href="http://english.rejbrand.se">http://english.rejbrand.se</a>''; Flags := [tfUseHiconMain, tfAllowDialogCancellation, tfEnableHyperlinks]; CustomMainIcon := Application.Icon; Execute; finally Free; end

Sin embargo, tenga en cuenta que no ocurre nada cuando hace clic en el enlace. La acción del enlace debe implementarse manualmente, lo cual, por supuesto, es algo bueno. Para hacer esto, responda al evento OnHyperlinkClicked , que es un TNotifyEvent . La URL del enlace (el href del elemento a, es decir) se almacena en la propiedad pública URL de TTaskDialog :

procedure TForm1.TaskDialogHyperLinkClicked(Sender: TObject); begin if Sender is TTaskDialog then with Sender as TTaskDialog do ShellExecute(0, ''open'', PChar(URL), nil, nil, SW_SHOWNORMAL); end; procedure TForm1.FormCreate(Sender: TObject); begin with TTaskDialog.Create(self) do try Caption := ''About Rejbrand BookBase''; Title := ''Rejbrand BookBase''; CommonButtons := [tcbClose]; Text := ''File Version: '' + GetFileVer(Application.ExeName) + #13#10#13#10''Copyright © 2011 Andreas Rejbrand''#13#10#13#10''<a href="http://english.rejbrand.se">http://english.rejbrand.se</a>''; Flags := [tfUseHiconMain, tfAllowDialogCancellation, tfEnableHyperlinks]; OnHyperlinkClicked := TaskDialogHyperlinkClicked; CustomMainIcon := Application.Icon; Execute; finally Free; end end;

El pie de página

Puede usar las propiedades Footer y FooterIcon para crear un pie de página. La propiedad del icon acepta los mismos valores que la propiedad MainIcon .

with TTaskDialog.Create(self) do try Caption := ''My Application''; Title := ''A Question''; Text := ''This is a really tough one...''; CommonButtons := [tcbYes, tcbNo]; MainIcon := tdiNone; FooterText := ''If you do this, then ...''; FooterIcon := tdiWarning; Execute; finally Free; end

Con el tfUseHiconFooter y la propiedad CustomFooterIcon , puede usar cualquier ícono personalizado en el pie de página, del mismo modo que puede elegir su propio ícono principal.

Una casilla de verificación

Con la propiedad de cadena VerificationText , puede agregar una casilla de verificación al pie de página del cuadro de diálogo de la tarea. El título de la casilla de verificación es propiedad.

con TTaskDialog.Create (self) try Caption: = ''My Application''; Título: = ''Una pregunta''; Texto: = ''Esto es realmente difícil ...''; CommonButtons: = [tcbYes, tcbNo]; MainIcon: = tdiNone; VerificationText: = ''Recordar mi elección''; Ejecutar; finalmente libre; fin

Puede marcar inicialmente la casilla de verificación especificando el indicador tfVerificationFlagChecked . Desafortunadamente, debido a un error (?) En la implementación de VCL del TTaskDialog , la inclusión de este indicador cuando Execute ha regresado no refleja el estado final de la casilla de verificación. Para realizar un seguimiento de la casilla de verificación, la aplicación necesita recordar el estado inicial y alternar un indicador interno como respuesta a cada evento OnVerificationClicked , que se activa cada vez que se cambia el estado de la casilla de verificación durante la modalidad del cuadro de diálogo.

Botones de radio

Los botones de radio se pueden implementar de forma similar a cómo agrega botones personalizados (o botones de enlace de comando):

with TTaskDialog.Create(self) do try Caption := ''My Application''; Title := ''A Question''; Text := ''This is a really tough one...''; CommonButtons := [tcbOk, tcbCancel]; MainIcon := tdiNone; with RadioButtons.Add do Caption := ''This is one option''; with RadioButtons.Add do Caption := ''This is another option''; with RadioButtons.Add do Caption := ''This is a third option''; if Execute then if ModalResult = mrOk then ShowMessage(Format(''You chose %d.'', [RadioButton.Index])); finally Free; end