我有一个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这样的东西?或者是否有另一种方法来实现值输入的验证?
答案 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;