【问题标题】:How to verify if the checkbox is checked in a Delphi TTaskDialog?如何验证复选框是否在 Delphi TTaskDialog 中被选中?
【发布时间】:2011-04-04 21:25:30
【问题描述】:

好的,这应该很容易,但我没有找到解决方案,至少在not so good documentation 中没有。在TTaskDialog 中,您可以选择添加一个复选框。您可以通过Flags 中的tfVerificationFlagChecked 标志来控制其初始状态。但是对话框已经Executed之后如何获取状态呢?

当然可以使用OnVerificationClicked 事件并在每次调用时切换一个局部变量,最初等于复选框的初始状态。但人们会期待一种更自然的解决方案。

【问题讨论】:

  • 官方文档,顺便说一句,太棒了。以此为例:docwiki.embarcadero.com/VCL/en/Dialogs.TCustomTaskDialog.URL 他们甚至没有解释 what URL 这是。每个任务对话框都有一个关联的 URL 并不是不言而喻的。在这里(docwiki.embarcadero.com/VCL/en/…)他们忘记解释函数的(布尔)结果是什么意思!
  • 你有源代码吧?查找使用对话框 API 函数的位置。它应该调用TaskDialogIndirect。第四个参数是最终会收到复选框的值,那么代码用它做什么呢?
  • @Rob Kennedy:是的,Windows API 有很好的文档记录,所以这(总是)是个好主意。我现在正在寻找...
  • @NGLN:谢谢你指点我。

标签: delphi tcheckbox ttaskdialog


【解决方案1】:

我的上帝,Embarcadero 犯了一个错误。

我的一些测试表明,如果复选框最初未被选中,但被用户选中,那么tfVerificationFlagChecked 标志将被设置。但是如果最初设置了标志,并且用户取消选中该框,那么tfVerificationFlagChecked 将不会从Flags 集中删除。这并不奇怪。 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 手动切换方法。

【讨论】:

  • 在您编写解决方法时,您是否还请在 Quality Central 上添加有关此问题的报告(如果您还没有这样做),否则它肯定永远不会被修复...
【解决方案2】:

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

【讨论】:

  • 没有。试过了。并且文档还说“如果设置,则验证复选框最初被选中。”
  • 没错,但由于我们已经确定文档不是很好,我们不能假设“最初”部分是准确的。
  • Rob Kennedy:同意那个! :)
【解决方案3】:

在 Delphi XE7(也可能是更早的版本)中,这似乎已得到解决。

choice := tfVerificationFlagChecked in tskbox.Flags;

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-07
    • 2019-03-05
    • 2017-06-24
    • 2019-03-16
    • 2018-09-24
    • 2018-03-23
    • 2017-04-05
    • 2013-01-25
    相关资源
    最近更新 更多