Java для реальных настольных приложений (в Eclipse) и Python для быстрых-и-грязных вещей. И это находится на Ubuntu Heron. Я предпочитаю использовать Среды выполнения Java Sun (Eclipse идет со своим собственным компилятором).
Если вы не можете найти документацию, то напишите ее :
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 (self), попробуйте Caption: = 'My Application'; Заголовок: = «Вопрос»; Текст: = 'Это действительно сложный вопрос ...'; CommonButtons: = [tcbYes, tcbNo]; MainIcon: = tdiNone; VerificationText: = 'Запомнить мой выбор'; Выполнить; наконец, свободным; end
Вы можете изначально установить флажок, указав флаг 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
TMS имеет приятную оболочку, и она также эмулирует новое поведение при запуске на XP. Это очень просто. Это не бесплатно, и на самом деле не отвечает на ваш вопрос «как».
http://www.tmssoftware.com/site/vtd.asp
У них также есть несколько статей, где они обсуждают диалог, и есть некоторый исходный код, который может быть полезен вам, если вы хотите сделать свою собственную обертку.