2013-10-08 54 views
1

我有一个窗体,我有一个组合框有三个值:90,95和99.我希望用户只从这三个选项中进行选择,并在输入另一个值时引发错误。所以我写了下面的代码来显示提醒用户错误的消息。问题在于当messageDlg出现并且用户点击“OK”时,整个表单关闭。我希望用户在关闭MessageDlg后能够做出正确的选择。如何关闭MessageDlg而不关闭Delphi中的表单?

 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; 

回答

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禁用编辑值。

+0

这个过程中的代码还有很多,所以我不能编码“关闭”你显示的方式。不过,您的第二个选择对我而言更合适。我不知道csDropDownList。那样做了。谢谢。 – Serge

+1

没问题。如果解决了您的问题,请接受答案。 –

+0

最后一行是将cbPILimits中的文本与错误检查一起读取到PIPercent。但我想你是对的 - 如果用户仅限于列表中的三个值,那么在那里进行错误检查似乎是多余的。 – Serge

1

如果你只有三个不同的值,那么最好是使用比单选按钮的组合框 - 用户被限制为这些值。那么你不需要关于消息框的可疑代码。

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

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

+0

我不知道我明白。如果即使OK按钮被按下,messageDlg框也没有关闭,那么这怎么处理我的问题呢?此外,虽然使用单选按钮也可以解决限制用户的问题,但我的表单上已经有太多对象,并且不想将其过多地混淆。 – Serge

+0

@ user1505202:不要使用messagedlg来显示警告消息。您的对话框(包含组合框和其他控件)有一个OK按钮 - 检查'onPress'事件中的所有值都可以。如果有错误的值,请不要关闭对话框。 –

+0

我有一个窗体有一些对象,包括有问题的组合框。我不确定你指的是哪个对话框,因为它不是messageDlg。当Save(保存表单上的选项,即按钮)按钮被点击时,我正在进行验证。但是,它正在关闭表单而不允许用户修改该值。我想我明白你的建议,但我认为我已经在做 - 通过保存按钮的onClick事件。不过,它正在关闭表格。因此我的问题。谢谢。 – Serge