Конференция "Начинающим" » Как сделать чтобы при вводе данных точка читалась как запятая. [D7]
 
  • Badrussian55 (27.12.16 12:08) [0]
    Здравствуйте!  При вводе дробных чисел через точку, разумеется выдается ошибка. Как можно заставить программу воспринимать .=,   Если таковая возможность есть. Можно ли ее объявить на глобальном уровне. А не пописывать отдельно для каждого Edit. Если же таковой возможности нет. То как можно ограничить ввод дробного числа только через запятую. Чтобы у пользователя не было возможности вводить в Edit точку и как следствие нарываться на ошибку. Заранее благодарен.
  • Token (27.12.16 12:28) [1]
    Это зависит от настроек локализации системы. По-умолчанию  в русской 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;

  • Token (27.12.16 12:33) [2]
    Упс, не внимательно читал.
    1. Можно написать своего наследника от TEdit.
    2. Прописать реакцию на OnKeyPress для одного а потом это событие назначить остальным.  Edit2.OnKeyPress:=Edit1KeyPress.
  • Костыль (27.12.16 12:55) [3]
    В качестве костыля можно примерно так:
    ...
    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;

  • KSergey © (27.12.16 15:14) [4]
    > Костыль   (27.12.16 12:55) [3]

    Не понятно (мне), почему это костыль?
    Да и зачем восстанавливать при закрытии приложения?

    Достаточно

    procedure TForm1.FormCreate(Sender: TObject);
    begin
      DecimalSeparator:= '.';
    end;
  • KSergey © (27.12.16 15:16) [5]
    > Badrussian55   (27.12.16 12:08) 
    > Как можно заставить программу воспринимать
    > .=,   Если таковая возможность есть.

    В вашем вопросе есть некоторая неоднозначность.
    Его можно трактовать одним из двух вариантов:

    1) В Edit точка (и только точка) должна интерпретироваться как разделитель целой и дробной части

    2) В Edit точка или запятая должна интерпретироваться как разделитель целой и дробной части

    Какой вариант для вас верен?
    От ответа сильно зависит реализация.
  • Badrussian55 (27.12.16 15:37) [6]
    KSergey,  мне необходимо чтобы  и точка и запятая  интерпретировались как разделитель дробной части.
  • Костыль (27.12.16 16:40) [7]
    KSergey ©   (27.12.16 15:14) [4]
    Мне казалось, чтобы программы таких как Badruss-ы не имели бы возможность менять Windows-кие установки, в угоду своим гениальным программам :)
  • iop © (27.12.16 16:44) [8]
    Достаточно

    procedure TForm1.FormCreate(Sender: TObject);
    begin
     DecimalSeparator:= '.';
    end;


    недостаточно.
    программу запустили, она сменила сепаратор.
    юзер не закрывая программу идет в панель управления и меняет сепаратор
    все приложения при этом получают мессадж и перечитывают значение системного сепаратора.
  • iop © (27.12.16 16:50) [9]
    Мне казалось, чтобы программы таких как Badruss-ы не имели бы возможность менять Windows-кие установки, в угоду своим гениальным программам :)


    бадрусс и не меняет сепаратор уиндовс.
    он меняет значение сепаратора в своем процессе.
    на системный сепаратор это никак не влияет
  • Костыль (27.12.16 17:11) [10]
    > iop ©   (27.12.16 16:50) [9]

    Возможно, не проверял, но страхуюсь ...
  • Badrussian55 (27.12.16 17:14) [11]
    Спасибо за отклик и за  советы. Пока не за компьютером с Delphi вечером буду пробовать  добиться реазльтата
  • Костыль (27.12.16 17:17) [12]
    > iop ©   (27.12.16 16:50) [9]
    бадрусс и не меняет сепаратор уиндовс

    в некоторых свои программах я меняю принтер по умолчанию, так вот при завершении моей проги, в виндах остается выбранный мой принтер по умолчанию
    возможно, что это не связанные вещи, тем не менее я предпочитаю "перестраховываться"...
  • Inovet © (27.12.16 17:50) [13]
    А я посоветую ничего не менять, пользователь не должен переучиваться под каждую программу и видение её разработчика. Есть стандартное поведение Виндоус, вот пусть будет. Да - неудобно местами, например на цифровой клавиатуре точка или запятая вводится в зависимости от текущей раскладки клавиатуры, но зато одинаково везде, если кто-то локально или, не дай бог, глобально не поменял вдруг на свой вкус и цвет.

    Другое дело, когда там из файла/в файл надо в разных форматах вводить/выводить но и на эти случаи с какой-то версии есть
    TFormatSettings
    и функции с дополнительным параметром этого класса, чтобы даже и локально ничего не менять. Например вот эта самая
    function StrToFloat(const S: string; const AFormatSettings: TFormatSettings): Extended;
    Но это после Д7 появилось ведь.(?)
  • Костыль (27.12.16 18:04) [14]
    > Inovet ©   (27.12.16 17:50) [13]

    Мои, возможно не самые корректные рекомендации, никоим образом не связаны с версиями Delphi (Д7), но в определенной степени решают проблемы "топик стартера юзера" :)
  • Badrussian55 (27.12.16 23:32) [15]
    Большое спасибо за внимание и ответы. Решил оставить как есть. Того не стоит.    Предложенное в качестве костыля у меня не получилось.....  Но это я просто криворукий.   Еще раз прошу прощение за беспокойство. Так или иначе  было познавательно. Спасибо.
  • Юрий Зотов © (28.12.16 06:39) [16]
    > Badrussian55   (27.12.16 23:32) [15]

    > Решил оставить как есть


    И правильно. Юзер поставил себе те системные настройки, которые ему нравятся. Их и нужно использовать. То есть, ничего делать не надо, программа все сделает сама.
  • Dimka Maslov © (28.12.16 10:33) [17]
    Костыль   (27.12.16 16:40) [7]

    Особенно хорошо системные настройки в виде запятой проявляются при использовании пакета M.Office: то не читаются csv файлы в Ёкселе, то начинает глючить Word. Так что гениальность программиста не причём. Даже у весьма средних разработчиков возникают проблемы. Поэтому десятичным разделителем всегда должна точка, и точка.
  • NoUser © (28.12.16 18:45) [18]

    > [0]
    > Как можно заставить программу воспринимать .=,


    А найти первую попавшуюся точку (или запятую) и заменить на DecimalSeparator  - не вариант?
  • Костыль (28.12.16 22:14) [19]
    procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
    begin
    if not (key in['0'..'9',DecimalSeparator,#8]) then
      key:=#0;
    end;
  • Inovet © (28.12.16 23:46) [20]
    > [19] Костыль   (28.12.16 22:14)

    -123,456,789.01e+56
  • Германн © (29.12.16 05:00) [21]
    Ну как вариант.
    В моих случаях самое предпочтительное было проверять в OnKeypress полей ввода точку и запятую и молча заменять её на DecimalSeparator. Решение не 100%, крнечно, но рабочее в моих случаях.
  • Костыль (29.12.16 08:10) [22]
    > Inovet ©   (28.12.16 23:46) [20]

    -123,456,789.01e+56 (ввести в эдит не получится)
    Ну, если и так рассматривать, то почему не сразу:
    123xav,31
    гораздо нагляднее :)
  • Костыль (29.12.16 11:48) [23]
  • Inovet © (29.12.16 22:55) [24]
    > [22] Костыль   (29.12.16 08:10)
    > 123xav,31
    > гораздо нагляднее :)

    Это чё? Я такое не знаю.:)
  • Signal (01.01.17 09:08) [25]
    Удалено модератором
  • macrodens © (10.01.17 11:41) [26]
    Вводить десятичные значения в TEdit изначально не очень удобно, так как требуется дополнительная обработка.
    В этом случае лучше использовать ввод по маске (и по моему мнению/опыту, желательно, что бы в качестве маски использовались регулярки, например TcxMaskEdit из набора DevExpress).
    Тогда не придется ловить кучу лишних разделителей и, если используется, знак (+/-)
 
Конференция "Начинающим" » Как сделать чтобы при вводе данных точка читалась как запятая. [D7]
Есть новые Нет новых   [118393   +7][b:0.001][p:0.001]