На intuit в курсе "Программирование на Lazarus" приводится функция для проверки ввода вещественных чисел. Я только заменил в ней DecimalSeaparator на DefaultFormatSettings.DecimalSeparator.
Цифры, знак, bechspace, десятичный разделитель - разрешаются, остальные символы - подавляются. При вводе разделителя ',' или '.' производится замена на разделитель DecimalSeaparator.
- Код: Выделить всё
{проверка правильности символа в вещественном числе}
function TrueFloatKeys(key:char; str:string): char;
begin
//сначала укажем, что возвращается тот же символ, что ввел пользователь:
Result:= key;
//далее делаем проверку на правильность символа. если символ не правильный,
//мы его запретим:
case key of
//все числа разрешаем:
'0'..'9': ;
//backspace разрешаем:
#8: ;
//если разделителя еще нет - выводим правильный разделитель,
//иначе ничего не выводим
'.' , ',' : if Pos(DefaultFormatSettings.DecimalSeparator, str)= 0 then
Result:=DefaultFormatSettings.DecimalSeparator
else Result := #0;
//разрешаем минус при условии, что минус - первый символ в строке:
'-': if Length(str) = 0 then Result:= key
else Result:= #0; //если минус не первый, запрещаем
//все остальные символы запрещаем:
else Result:= #0;
end; //case
end;
Проблема в том, что не выполняется эта замена. Если скомпилировать проект под Виндовз - все работает нормально, а под linux mint Rosa x64 - не работает.
- Код: Выделить всё
'.' , ',' : if Pos(DefaultFormatSettings.DecimalSeparator, str)= 0 then
Result:=DefaultFormatSettings.DecimalSeparator
else Result := #0;
Если ввести вначале '.' , то else Result := #0; выполняется. Но, если вначале ввести ',' , то Result:=DefaultFormatSettings.DecimalSeparator не выполняет замены на '.' . В результате в TEdit (функция вставляется в OnKeyPress) получается ввести строку, состоящую из множества запятых ',,,,,,,,,,'
В чем причина такого поведения?