我在表单上有两个编辑框,一个用于最小值,另一个用于用户需要输入的最大值.我希望在用户输入值时捕获可能的错误.一个可能的错误是最大值小于最小值.如果发生这种情况,我会提示错误消息.但是,即使用户想要在最小框中输入5并且在最大框中输入100,如果用户在最大框中输入100的"1",它也会显示错误消息在min框中输入了5.如何在出现错误消息之前允许用户输入整个值?
这是我的代码(我也捕获其他错误,但只有max <min错误似乎受到影响):
procedure TfrmAnalysisOptions.lbleConstraintsMaxChange(Sender: TObject);
var
I: integer;
Val, ValidEntry: string;
Chr: char;
RangeMin, RangeMax: Double;
const Allowed = ['0'..'9', '.'];
begin
Val := lbleConstraintsMax.Text;
//initialize values
ValidEntry := '';
ConstraintsMaxChange := '';
//value can contain only numerals, and "."
for I := 1 to Length(Val) do
begin
Chr := Val[I];
if not (Chr in Allowed) then
begin
MessageDlgPos('The value entered for the max value of the ' +
'constraint must contain only a numeral, a decimal ' +
'point or a negative sign.',
mtError, [mbOK], 0, 300, 300);
Exit;
end
else ValidEntry := 'OK'; //validity check for this part
end;
//max value cannot be zero or less than the min value
if not TryStrToFloat(Val, RangeMax) then Exit
else if RangeMax = 0 then
begin
MessageDlg('Max value cannot be zero.', mtError, [mbOK], 0);
Exit;
end
else if not TryStrToFloat(lbleConstraintsMin.Text, RangeMin) then Exit
else if RangeMax < RangeMin then
begin
MessageDlgPos('Max value cannot be less than Min value.',
mtError, [mbOK], 0, 300, 300);
Exit;
end
else if (RangeMax < 0) then
begin
MessageDlgPos('A constraint cannot be negative.',
mtError, [mbOK], 0, 300, 300);
Exit;
end
//final validity check
else if ValidEntry = 'OK' then ConstraintsMaxChange := 'OK'
else MessageDlgPos('There was an unexpected problem with the ' +
'value entered in the max constraints box.',
mtError, [mbOK], 0, 300, 300);
end;
Run Code Online (Sandbox Code Playgroud)
OnChange每次修改编辑控件的内容时都会触发该事件.虽然这是过滤掉无效字符的合适位置,但它不是验证数值的合适位置.有没有办法来预测用户想要输入的内容数量,是否5,50,500,5,000,其中每个那些可能会或可能不会被接受.
解决方案1:在填写完这些编辑控件并且用户尝试进入下一步(保存,继续,加载,启动等)后执行此检查.
解决方案2:在保持相同逻辑的同时,您可以在这些控件旁边显示"无效条目"旁边的标签,而不是显示消息框.这样,用户将不会遇到许多消息框.
解决方案3:使用OnExit事件代替OnChange.请注意,这不会完全解决您的问题,但会将其最小化.当焦点离开控件时会触发此事件.
解决方案4与解决方案2类似,使用OnChange和OnExit控制Enabled按钮的属性,用户可能会按下该按钮.
解决方案5与解决方案4类似,使用操作并更改该Enabled特定操作的属性.然后,不能点击用户可以按下的任何按钮.
在旁注中,当您过滤掉无效字符时,忽略这些字符并且不首先让它们进入控件而不是弹出消息会更优雅一些.您可以通过使用OnKeyPress事件或使用a 来完成此操作TMaskEdit.