如何在Delphi TTaskDialog中验证复选框是否被选中?

5

好的,这应该很简单,但我没有找到解决方案,至少在不太好的文档中没有。在 TTaskDialog 中,您可以选择添加一个复选框。您可以通过 Flags 中的 tfVerificationFlagChecked 标志来控制其初始状态。但是,如何在对话框 Execute 后获取其状态呢?

当然,你可以使用 OnVerificationClicked 事件并在每个调用时切换一个本地变量(最初等于复选框的初始状态)。但是人们会期望有一个更自然的解决方案。


顺便提一句,官方文档很糟糕。以此为例:http://docwiki.embarcadero.com/VCL/en/Dialogs.TCustomTaskDialog.URL 他们甚至没有解释这是什么URL。并不是自证明的每个任务对话框都有一个关联的URL。还有,在这里(http://docwiki.embarcadero.com/VCL/en/Dialogs.TCustomTaskDialog.Execute)他们忘记了解释函数的(boolean)结果意味着什么! - Andreas Rejbrand
1
你有源代码,对吧?找到对话框 API 函数的使用位置。它应该调用 TaskDialogIndirect。第四个参数最终会接收复选框的值,那么代码会对其进行什么操作呢? - Rob Kennedy
@Rob Kennedy:是的,Windows API文档非常完善,所以这总是一个好主意。我现在正在寻找... - Andreas Rejbrand
4个回答

9

哦,我的天啊,Embarcadero 犯了一个错误。

我的几个测试表明,如果复选框最初未被选中,但是用户选择了它,则会设置 tfVerificationFlagChecked 标志。但是,如果标志最初已经被设置,并且用户取消选中该框,则 Flags 集合中的 tfVerificationFlagChecked 不会被移除。这并不奇怪。VCL 代码如此。

Result := TaskDialogIndirect(LTaskDialog, {$IFNDEF CLR}@{$ENDIF}LModalResult,
  {$IFNDEF CLR}@{$ENDIF}LRadioButton, {$IFNDEF CLR}@{$ENDIF}LVerificationChecked) = S_OK;
FModalResult := LModalResult;
if Result then
begin
  FButton := TTaskDialogButtonItem(FButtons.FindButton(FModalResult));
  FRadioButton := TTaskDialogRadioButtonItem(FRadioButtons.FindButton(LRadioButton));
  if LVerificationChecked then
    Include(FFlags, tfVerificationFlagChecked);
end;

请注意,如果对话框关闭时复选框被选中,则标志将被包括在内,但是没有代码来删除标志,如果用户取消选中该框。当然,人们会期望代码的后半部分应该是这样的。
  if LVerificationChecked then
    Include(FFlags, tfVerificationFlagChecked)
  else
    Exclude(FFlags, tfVerificationFlagChecked)

我想我会选择手动切换的 OnVerificationClicked 方法。

2
当你编写解决方法时,是否可以在Quality Central上添加一份报告(如果你还没有这样做),否则它肯定永远不会被修复... - Marjan Venema

2
在Delphi XE7(可能也包括早期版本)中,这个问题似乎已经得到解决。
choice := tfVerificationFlagChecked in tskbox.Flags;

choice是一个布尔变量,可以返回选中状态。


2

在对话框关闭后,您无法读取Flags以查看tfVerificationFlagChecked是否仍然存在吗?


不行,已经尝试过了。而且文档也说:“如果设置,则验证复选框最初被选中。” - Andreas Rejbrand
是的,但既然我们已经确定文档不是很好,我们不能假设“最初”的部分是准确的。 - Rob Kennedy
Rob Kennedy: 同意这一点!:) - Andreas Rejbrand

0
似乎在Delphi 10.4中可以工作。属性FlagstfVerificationFlagChecked现在是一个可靠的指示,即使用户多次更改值也是如此。
if dlg.Execute then
  begin
    wasChecked:=tfVerificationFlagChecked in dlg.Flags;
    // do something
  end;

这并没有回答问题。一旦你拥有足够的声望,你就可以评论任何帖子;相反,提供不需要提问者澄清的答案。- 来自审核 - dcolazin
我不同意不回答问题,但是却加了一个不必要的例子。 - user18775460

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接