-
Здравствуйте! При вводе дробных чисел через точку, разумеется выдается ошибка. Как можно заставить программу воспринимать .=, Если таковая возможность есть. Можно ли ее объявить на глобальном уровне. А не пописывать отдельно для каждого Edit. Если же таковой возможности нет. То как можно ограничить ввод дробного числа только через запятую. Чтобы у пользователя не было возможности вводить в Edit точку и как следствие нарываться на ошибку. Заранее благодарен.
-
Это зависит от настроек локализации системы. По-умолчанию в русской WIN десятичный разделитель ",". Но если явно надо указать формат в каком-то случае можно сделать так
FormatSettings:=TFormatSettings.Create('en-US');
FormatSettings.ShortDateFormat:='yyyy/MM/dd';
FormatSettings.LongDateFormat:='yyyy/MM/dd hh:mm:ss';
FormatSettings.DecimalSeparator:=',';
try
.......
finally
GetFormatSettings;
end;
-
Упс, не внимательно читал.
1. Можно написать своего наследника от TEdit.
2. Прописать реакцию на OnKeyPress для одного а потом это событие назначить остальным. Edit2.OnKeyPress:=Edit1KeyPress.
-
В качестве костыля можно примерно так:
...
var CurrDecimalSeparator: Char;
...
procedure TForm1.FormCreate(Sender: TObject);
begin
Case DecimalSeparator of
',':;
else
begin
CurrDecimalSeparator:= DecimalSeparator;
DecimalSeparator:= ',';
end;
end;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
DecimalSeparator:= CurrDecimalSeparator;
end;
-
> Костыль (27.12.16 12:55) [3]
Не понятно (мне), почему это костыль?
Да и зачем восстанавливать при закрытии приложения?
Достаточно
procedure TForm1.FormCreate(Sender: TObject);
begin
DecimalSeparator:= '.';
end;
-
> Badrussian55 (27.12.16 12:08)
> Как можно заставить программу воспринимать
> .=, Если таковая возможность есть.
В вашем вопросе есть некоторая неоднозначность.
Его можно трактовать одним из двух вариантов:
1) В Edit точка (и только точка) должна интерпретироваться как разделитель целой и дробной части
2) В Edit точка или запятая должна интерпретироваться как разделитель целой и дробной части
Какой вариант для вас верен?
От ответа сильно зависит реализация.
-
KSergey, мне необходимо чтобы и точка и запятая интерпретировались как разделитель дробной части.
-
KSergey © (27.12.16 15:14) [4]
Мне казалось, чтобы программы таких как Badruss-ы не имели бы возможность менять Windows-кие установки, в угоду своим гениальным программам :)
-
Достаточно
procedure TForm1.FormCreate(Sender: TObject);
begin
DecimalSeparator:= '.';
end;
недостаточно.
программу запустили, она сменила сепаратор.
юзер не закрывая программу идет в панель управления и меняет сепаратор
все приложения при этом получают мессадж и перечитывают значение системного сепаратора.
-
Мне казалось, чтобы программы таких как Badruss-ы не имели бы возможность менять Windows-кие установки, в угоду своим гениальным программам :)
бадрусс и не меняет сепаратор уиндовс.
он меняет значение сепаратора в своем процессе.
на системный сепаратор это никак не влияет
-
> iop © (27.12.16 16:50) [9]
Возможно, не проверял, но страхуюсь ...
-
Спасибо за отклик и за советы. Пока не за компьютером с Delphi вечером буду пробовать добиться реазльтата
-
> iop © (27.12.16 16:50) [9]
бадрусс и не меняет сепаратор уиндовс
в некоторых свои программах я меняю принтер по умолчанию, так вот при завершении моей проги, в виндах остается выбранный мой принтер по умолчанию
возможно, что это не связанные вещи, тем не менее я предпочитаю "перестраховываться"...
-
А я посоветую ничего не менять, пользователь не должен переучиваться под каждую программу и видение её разработчика. Есть стандартное поведение Виндоус, вот пусть будет. Да - неудобно местами, например на цифровой клавиатуре точка или запятая вводится в зависимости от текущей раскладки клавиатуры, но зато одинаково везде, если кто-то локально или, не дай бог, глобально не поменял вдруг на свой вкус и цвет.
Другое дело, когда там из файла/в файл надо в разных форматах вводить/выводить но и на эти случаи с какой-то версии есть
TFormatSettings
и функции с дополнительным параметром этого класса, чтобы даже и локально ничего не менять. Например вот эта самая
function StrToFloat(const S: string; const AFormatSettings: TFormatSettings): Extended;
Но это после Д7 появилось ведь.(?)
-
> Inovet © (27.12.16 17:50) [13]
Мои, возможно не самые корректные рекомендации, никоим образом не связаны с версиями Delphi (Д7), но в определенной степени решают проблемы "топик стартера юзера" :)
-
Большое спасибо за внимание и ответы. Решил оставить как есть. Того не стоит. Предложенное в качестве костыля у меня не получилось..... Но это я просто криворукий. Еще раз прошу прощение за беспокойство. Так или иначе было познавательно. Спасибо.
-
> Badrussian55 (27.12.16 23:32) [15]
> Решил оставить как есть
И правильно. Юзер поставил себе те системные настройки, которые ему нравятся. Их и нужно использовать. То есть, ничего делать не надо, программа все сделает сама.
-
Костыль (27.12.16 16:40) [7]
Особенно хорошо системные настройки в виде запятой проявляются при использовании пакета M.Office: то не читаются csv файлы в Ёкселе, то начинает глючить Word. Так что гениальность программиста не причём. Даже у весьма средних разработчиков возникают проблемы. Поэтому десятичным разделителем всегда должна точка, и точка.
-
> [0]
> Как можно заставить программу воспринимать .=,
А найти первую попавшуюся точку (или запятую) и заменить на DecimalSeparator - не вариант?
-
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if not (key in['0'..'9',DecimalSeparator,#8]) then
key:=#0;
end;