Ответ 1
Если вы не можете найти документацию, напишите write it:
Привет Мир Задачи Диалога
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
в разделе или двух.)
Быть хорошо воспитанным гражданином
Конечно, диалоговое окно задач приведет к сбою программы, если она работает под 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;
Ниже приведены примеры оставшихся типов значков (щит, предупреждение и ошибка соответственно):
Наконец, вы должны знать, что вы можете использовать свойство 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;
Пользовательские кнопки
Вы можете добавить пользовательские кнопки в диалог задач. Фактически, вы можете установить свойство 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
Командные ссылки
Вместо классических кнопок кнопки диалога задач могут быть командными ссылками. Это достигается установкой флага tfUseCommandLinks
(в Flags
). Теперь вы также можете установить свойство 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
Флаг tfAllowDialogCancellation
восстановит пункт закрытия системного меню (и кнопку заголовка заголовка - фактически, он восстановит все системное меню).
Не бросайте технические детали конечному пользователю
Вы можете использовать свойства 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
На изображении ниже показано диалоговое окно после того, как пользователь нажал кнопку, чтобы раскрыть дополнительную информацию.
Если вы добавите флаг tfExpandFooterArea
, дополнительный текст будет показан в нижнем колонтитуле:
В любом случае вы можете открыть диалоговое окно с уже раскрытыми деталями, добавив флаг 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
Гиперссылки
Вы даже можете использовать 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
Однако обратите внимание, что при нажатии на ссылку ничего не происходит. Действие ссылки должно быть реализовано вручную, что, конечно, хорошо. Для этого ответьте на событие 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
Используя флаг tfUseHiconFooter
и свойство CustomFooterIcon
, вы можете использовать любой пользовательский значок в нижнем колонтитуле так же, как вы можете выбрать свой собственный главный значок.
Флажок
Используя строковое свойство VerificationText
, вы можете добавить флажок в нижний колонтитул диалогового окна задачи. Надпись флажка является собственностью.
с TTaskDialog.Create (самостоятельно) сделать пытаться Подпись: = "Моя заявка"; Заголовок: = "Вопрос"; Текст: = 'Это действительно сложный вопрос...'; CommonButtons: = [tcbYes, tcbNo]; MainIcon: = tdiNone; VerificationText: = 'Запомнить мой выбор'; Выполнить; наконец-то Свободно; конец
Вы можете сделать флажок изначально установленным, указав флаг 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