Как использовать TTaskDialog?

Как использовать класс TTaskDialog (в Delphi 2009 и новее)? Официальная документация не помогла. Фактически, вы узнаете гораздо больше, изучив класс с помощью CodeInsight или исходного кода VCL. Там нет педагогических объяснений, но, по крайней мере, нет и ошибок (ну, всего несколько ).

И совсем недавно я подумал, как можно реагировать на щелчки по гиперссылкам в диалоговом окне. Действительно, установив флаг tfEnableHyperlinks , вы можете включать гиперссылки HTML в текстовые части диалогового окна. (Ну, в документе говорится о флаге: «Если установлено, содержимое, нижний колонтитул и развернутый текст могут включать гиперссылки». Естественно, «очевидно», что ссылки реализованы с использованием HTML-элемента . ) И мне удалось выяснить, что вы используете событие OnHyperLinkClick для ответа на щелчки по гиперссылкам. Но это событие TNotifyEvent , так как же узнать, какая ссылка была нажата? Что ж, в документации об этом ничего не сказано, так что я должен был предположить. В конце концов я обнаружил, что публичное свойство URL диалогового окна установлено, поэтому я мог бы сделать

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;

В официальной документации говорится об этом свойстве:

URL-адрес содержит URL-адрес задачи Диалог.

Согласитесь, отличное объяснение! Но это еще хуже: в документации не только отсутствуют пояснения, но и есть ошибки. Например, ,

ExpandButtonCaption: дополнительная информация об этой кнопке.

Это не очень точно. Какая кнопка? Если вы покажете справку для этого конкретного свойства, будет сказано, что

ExpandButtonCaption содержит дополнительный текст, который будет отображаться при раскрытии заголовка.

Это тоже не хорошо. Какая надпись? Правильное объяснение:

ExpandButtonCaption - это текст, показанный рядом с кнопкой, которая позволяет пользователю развернуть диалоговое окно, чтобы в нем отображалась дополнительная информация. Например, это свойство может быть «Подробнее».

Во всяком случае, в настоящее время я пытаюсь создать диалог с двумя кнопками командной ссылки. Я знаю, что операционная система может отображать эти кнопки как с подписью, так и с более подробным объяснением, но мне кажется, что я не могу заставить их работать с помощью TTaskButton . Документация невелика .

Но вместо того, чтобы спрашивать, как добиться именно этого здесь, в SO, я задам другой вопрос:

Есть ли (неофициальная) документация для класса TTaskDialog ?

26
задан Bernd Ott 8 August 2019 в 06:50
поделиться

2 ответа

Если вы не можете найти документацию, то напишите ее :

Диалог Hello World of Task

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 - это текст показанный в заголовке окна, Title - заголовок, а Text - основная часть диалога. Излишне говорить, что Execute отображает диалоговое окно задачи, а результат показан ниже. (Мы вернемся к свойству CommonButtons в одном или двух разделах.)

Sample of a TTaskDialog

Быть хорошим гражданином

Конечно, диалоговое окно задачи приведет к сбою программы, если она работает под Windows XP, где отсутствует API диалогового окна задачи. Это также не будет работать, если визуальные темы отключены. В любом таком случае нам нужно придерживаться старомодного MessageBox. Следовательно, в реальном приложении нам нужно будет сделать

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);

. В оставшейся части этой статьи мы будем предполагать, что налог обратной совместимости выплачивается, и вместо этого сосредоточиться только в диалоговом окне задачи.

Типы диалогов. Модальные результаты

Свойство CommonButtons имеет тип TTaskDialogCommonButtons, определенный как

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

Это свойство определяет кнопки, отображаемые в диалоговом окне (если кнопки не добавляются вручную, как мы сделаю позже). Если пользователь нажимает любую из этих кнопок, соответствующее значение TModalResult будет сохранено в свойстве ModalResult, как только вернется Execute. Свойство MainIcon определяет значок, отображаемый в диалоге, и должно, конечно, отражать характер диалога, как и набор кнопок. Формально целое число MainIcon может быть установлено на любое из значений tdiNone, tdiWarning, tdiError, tdiInformation и 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;

Sample of a TTaskDialog

Ниже приведены примеры оставшихся типов значков (щит, предупреждение и ошибка соответственно):

Sample of a TTaskDialog

Sample of a TTaskDialog

Sample of a TTaskDialog

Наконец, вы должны знать, что вы можете использовать свойство DefaultButton для установки кнопки по умолчанию в диалоговое окно.

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;

Sample of a TTaskDialog

Пользовательские кнопки

Вы можете добавить пользовательские кнопки в диалог задач. Фактически вы можете установить для свойства CommonButtons пустое множество и полностью полагаться на пользовательские кнопки (и неограниченное количество таких кнопок). В следующем реальном примере показано такое диалоговое окно:

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

Sample of a TTaskDialog

Командные ссылки

Вместо классических кнопок, диалоговые кнопки задачи могут быть командные ссылки. Это достигается установкой флага tfUseCommandLinksFlags). Теперь вы также можете установить свойство CommandLinkHint (для каждой кнопки):

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

Sample of a TTaskDialog

Флаг tfAllowDialogCancellation восстановит пункт меню закрытия системы ( и кнопка заголовка - фактически она восстановит все системное меню).

Sample of a TTaskDialog

Не бросайте технические детали конечному пользователю

Вы можете использовать свойства ExpandedText и ExpandedButtonCaption, чтобы добавить фрагмент текста ( первый), который отображается только после того, как пользователь нажимает кнопку (слева от текста в последнем свойстве), чтобы запросить его.

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

На рисунке ниже показано диалоговое окно после того, как пользователь нажал кнопку, чтобы раскрыть дополнительные детали.

Sample of a TTaskDialog

Если вы добавите флаг tfExpandFooterArea, в нижнем колонтитуле будет показан дополнительный текст:

Sample of a TTaskDialog

В любом случае вы можете открыть диалоговое окно с уже раскрытыми деталями, добавив флаг tfExpandedByDefault.

Пользовательские значки

Вы можете использовать любой пользовательский значок в диалоге задачи, используя флаг tfUseHiconMain и указав TIcon для использования в свойстве 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

Sample of a TTaskDialog

Гиперссылки

Вы даже можете использовать HTML-подобные гиперссылки в диалоге (в Text, Footer, и ExpandedText) , если вы добавите только флаг 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

Sample of a TTaskDialog

Обратите внимание, что при нажатии на ссылку ничего не происходит. Действие ссылки должно быть реализовано вручную, что, конечно, хорошо. Для этого ответьте на событие OnHyperlinkClicked, которое является TNotifyEvent. URL-адрес ссылки (т.е. ссылка на элемент a) хранится в публичном свойстве URL объекта 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;

Нижний колонтитул

Вы можете используйте свойства Footer и FooterIcon для создания нижнего колонтитула. Свойство icon принимает те же значения, что и свойство 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

Sample of a TTaskDialog

Используя флаг tfUseHiconFooter и свойство CustomFooterIcon, вы можете использовать любой пользовательский значок в нижнем колонтитуле, так же, как вы можете выбрать собственный главный значок.

A-флажок

Используя свойство строки VerificationText, вы можете добавить флажок в нижний колонтитул диалогового окна задачи. Заголовок флажка является собственностью.

с TTaskDialog.Create (self), попробуйте Caption: = 'My Application'; Заголовок: = «Вопрос»; Текст: = 'Это действительно сложный вопрос ...'; CommonButtons: = [tcbYes, tcbNo]; MainIcon: = tdiNone; VerificationText: = 'Запомнить мой выбор'; Выполнить; наконец, свободным; end

Sample of a TTaskDialog

Вы можете изначально установить флажок, указав флаг tfVerificationFlagChecked. К сожалению, из-за ошибки (?) В реализации VCL TTaskDialog, включение этого флага после возвращения Execute не отражает окончательное состояние флажка. Чтобы отслеживать флажок, приложению, таким образом, необходимо запомнить начальное состояние и переключить внутренний флаг в качестве ответа на каждое событие OnVerificationClicked, которое срабатывает каждый раз, когда состояние флажка изменяется во время модальности диалога.

Радиокнопки

Радиокнопки могут быть реализованы способом, похожим на то, как вы добавляете пользовательские кнопки (или кнопки ссылки на команду):

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

Sample of a TTaskDialog

61
ответ дан 28 November 2019 в 06:24
поделиться

TMS имеет приятную оболочку, и она также эмулирует новое поведение при запуске на XP. Это очень просто. Это не бесплатно, и на самом деле не отвечает на ваш вопрос «как».

http://www.tmssoftware.com/site/vtd.asp

У них также есть несколько статей, где они обсуждают диалог, и есть некоторый исходный код, который может быть полезен вам, если вы хотите сделать свою собственную обертку.

http://www.tmssoftware.com/site/atbdev5.asp

http://www.tmssoftware.com/site/atbdev7.asp

5
ответ дан 28 November 2019 в 06:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: