2013-10-08 86 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