Delphi设置编辑蒙版,没有固定长度的字符

时间:2016-12-01 14:21:18

标签: validation delphi input

我有一个TValueListEditor类型的对象,它包含Key列中某个函数的某些参数,以及一个用于测试该函数的相应值列的输入。我已根据参数的数据类型向值输入添加了编辑掩码。例如,参数Num1的类型为int,因此输入必须只是数字,但由于我事先并不知道确切的位数,有没有办法指定EditMask而没有固定长度的字符?

如果您查看下面的代码,如果我需要float类型的值,我必须有一个点,但我不希望该点在该确切位置预定义。

    if parser.sParams.Values[parser.sParams.Names[i]]='float' then
    begin
    lstValParamValues.ItemProps[parser.sParams.Names[i]].EditMask:='#########.#';
    end

也许我应该在EditMask上实现像regex这样的东西?或者是否有另一种方法来实现值输入的验证?

1 个答案:

答案 0 :(得分:5)

根据TItemProp.EditMask documentation

  

使用EditMask属性进行验证是在逐个字符的基础上执行

所以你只能使用固定宽度的面具。这意味着你必须指定小数点的位置,以及接受多少前导和尾随数字。

请考虑使用TValueListEditor.OnValidate事件:

  

当焦点从值列表编辑器中的单元格移开时发生。

     

编写一个OnValidate事件处理程序,以验证用户在焦点离开之前在单元格中输入的任何编辑。 OnValidate使应用程序有机会提供比相应TItemProp对象可以提供的EditMask属性更多的验证

     

仅当用户编辑了即将失去焦点的单元格的值时,才会出现OnValidate。 OnValidate事件处理程序可以验证用户提供的值,如果不可接受,则引发异常。

例如:

uses
  SysConsts;

procedure TMyForm.lstValParamValuesValidate(Sender: TObject; ACol, ARow: Integer; const KeyName: String; const KeyValue: String);
var
  ValueType: string;
  sIgnored: Single;
  dIgnored: Double;
begin
  if KeyValue = '' then Exit;

  ValueType := parser.sParams.Values[KeyName];

  if ValueType = 'int' then
    StrToInt(KeyValue)

  else if ValueType = 'float' then
  begin
    if not TryStrToFloat(KeyValue, sIgnored) then
      raise EConvertError.CreateFmt(SInvalidFloat, [KeyValue]);
  end

  else if ValueType = 'double' then
  begin
    if not TryStrToFloat(KeyValue, dIgnored) then
      raise EConvertError.CreateFmt(SInvalidFloat, [KeyValue]);
  end

  // etc...
end;