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:
No lo use, a menos que no desee que su aplicación funcione en XP.
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:
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
TMS tiene un buen envoltorio, y también emula el nuevo comportamiento cuando se ejecuta en XP. Es un complemento para el drop-in. Sin embargo, no es gratis, y realmente no responde su pregunta de "cómo hacerlo".
http://www.tmssoftware.com/site/vtd.asp
También tienen algunos artículos donde hablan sobre el diálogo, y hay algún código fuente que puede serle útil si quiere crear su propio contenedor.