Delphi设置编辑掩码,没有固定长度的字符

e.l*_*.o. 5 delphi validation 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
Run Code Online (Sandbox Code Playgroud)

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

Rem*_*eau 5

根据TItemProp.EditMask文件:

使用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;
Run Code Online (Sandbox Code Playgroud)