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的东西?或者是否有另一种方法来实现值输入的验证?
使用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)