如何关闭MessageDlg而不关闭Delphi中的表单?

时间:2013-10-08 03:06:38

标签: delphi

我有一个表格,我有一个有三个值的组合框:90,95和99.我希望用户只选择这三个,如果输入另一个值则引发错误。所以我编写了以下代码来显示警告用户错误的消息。问题是当messageDlg出现并且用户点击" OK"时,整个表单关闭。我希望用户在关闭MessageDlg后能够做出正确的选择。

        if not ((cbPILimits.Text = '90') or
                     (cbPILimits.Text = '95') or
                     (cbPILimits.Text = '99')) then
        begin
          MessageDlg('The PI limit levels can only be 90%, ' +
                     '95% or 99%.  Please choose among these three.',
                     mtError, [mbOK], 0);
          if not (TryStrToFloat(cbPILimits.Text, PIPercent)) then exit;
        end;

        Close;

2 个答案:

答案 0 :(得分:4)

您的表单会关闭,因为您在示例代码的末尾有Close;,无论是否MessageDlg()执行,都会执行该代码。

我假设您只想在用户选择有效值时关闭表单,否则显示消息而不关闭表单。你需要有这样的东西:

    if (not cbPILimits.Text = '90') or
       (not cbPILimits.Text = '95') or
       (not cbPILimits.Text = '99') then
    begin
      MessageDlg('The PI limit levels can only be 90%, ' +
                 '95% or 99%.  Please choose among these three.',
                 mtError, [mbOK], 0);

      // whats the point of line below? seems like obsolete
      if (not TryStrToFloat(cbPILimits.Text, PIPercent)) then Exit;
    end
    else
      Close;

此外,如果您不想允许用户在TComboBox中手动输入值,您可以将TComboBox.Style属性设置为csDropDownList以禁用编辑值。

答案 1 :(得分:1)

如果您只有三个不同的值,那么最好使用radiobuttons而不是组合框 - 用户被限制为这些值。然后,您不需要关于消息框的可疑代码。

我不会以这种方式处理错误检查。如果对话框中有“确定”按钮,则将错误检查添加到OKBtnOnPress事件中;如果有问题,则将modalresult设置为0.这意味着即使按下OK btn,对话框也不会关闭。

您可以在状态栏上显示错误消息。