1 / 1 / 0
Регистрация: 08.10.2011
Сообщений: 9
1

Ввод дробного числа в Edit (автозамена точки на запятую)

14.10.2011, 23:44. Показов 21207. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Приветствую!
Моя задача - сделать так, чтобы при вводе дробного числа в поле Edit1 точка автоматически заменялась на запятую, а все остальные нажатия клавиш (кроме цифр, точки, запятой и Backspace) не вводились в поле. После нажатия Enter курсор должен перемещаться в Edit2.
Я делаю так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
...
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
    case Key of
      '0'..'9',#8: ; // цифры и <Backspace>
      { Обработку десятичного разделителя
        сделаем "интеллектуальной". Замени точку и
        запятую на символ DecimalSeparator - символ,
        который используется при записи дробных чисел.
      }
      '.',',':
         begin
           Key:=DecimalSeparator;
           // проверим, введен ли уже в поле
           // Edit десятичный разделитель
           if pos(DecimalSeparator,Edit1.Text) <> 0
             then Key:= #0;
         end;
      #13: Edit2.SetFocus; // <Enter> - курсор в поле Edit2
      else Key:= #0; // остальные символы запрещены
    end;
end;
...
Запускаю программу, ставлю курсор в поле Edit1 и начинаю набирать число (курсор при этом исчезает), ставлю запятую, точку, буквы, все печатается в поле! Почему так? И при нажатии на Enter курсор не переходит в поле Edit2.

Подскажите пожалуйста, где у меня ошибка(и).
Спасибо.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.10.2011, 23:44
Ответы с готовыми решениями:

Проверить корректность введения дробного числа в Edit
Здравствуйте. Нужно проверить корректность введённого пользователем в Edit дробного числа....

Автозамена точки на запятую в datagridview
В ячейку datagridview вводятся числа. Если ввести точку вместо запятой - происходит событие...

Ввод дробного числа в TextBox
Здравствуйте! Есть TextBox забинденный на double свойство. Если попытаться ввести в него дробное...

Как сделать возможным ввод дробного числа
Добрый вечер. Что-то никак не въеду, как сделать ввод дробного числа в EditText пользователем,...

10
1302 / 708 / 107
Регистрация: 25.05.2011
Сообщений: 2,158
Записей в блоге: 51
15.10.2011, 09:26 2
имхо лучше дать пользователю нормально ввести число, а потом при нажатии на кнопку или еще каким либо действием, проверить введенное число, при необходимости заменить точку на запятую.
1
Почетный модератор
64299 / 47594 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
15.10.2011, 11:05 3
Лучший ответ Сообщение было отмечено как решение

Решение

Все у меня работает...
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
case Key of
  #8,'0'..'9' :  ; // цифры и <Back Space>
 
       '.',',': // разделитель целой и дробной частей числа
                begin
                  if Key <> DecimalSeparator then
                  Key := DecimalSeparator; // заменим разделитель на допустимый
                  if Pos(DecimalSeparator,Edit1.Text) <> 0
                  then Key := Chr(0); // запрет ввода второго разделителя
                end;
           '-':    // минус можно ввести только первым символом,
                // т.е. когда ячейка пустая
                if Length(Edit1.Text) <> 0
                      then Key := Chr(0);
        #13:Edit2.Setfocus;
        else   // остальные символы запрещены
               key := Chr(0);
 
    end;
end;
 
 
procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char);
var s:real;
begin
case Key of
  #8,'0'..'9' :  ; // цифры и <Back Space>
 
       '.',',': // разделитель целой и дробной частей числа
                begin
                  if Key <> DecimalSeparator then
                  Key := DecimalSeparator; // заменим разделитель на допустимый
                  if Pos(DecimalSeparator,Edit2.Text) <> 0
                  then Key := Chr(0); // запрет ввода второго разделителя
                end;
           '-':    // минус можно ввести только первым символом,
                // т.е. когда ячейка пустая
                if Length(Edit2.Text) <> 0
                      then Key := Chr(0);
        #13:begin
            s:=StrToFloat(Edit1.Text)+StrToFloat(Edit2.Text);
            Edit3.Text:=FloatToStrF(s,fffixed,6,2);
            end;
        else   // остальные символы запрещены
               key := Chr(0);
    end;
end;
Вложения
Тип файла: rar Ввод вещественных чисел.rar (166.0 Кб, 228 просмотров)
5
1 / 1 / 0
Регистрация: 08.10.2011
Сообщений: 9
15.10.2011, 16:40  [ТС] 4
Puporev, спасибо за помощь.

Но у меня все равно проблема.
(ваша программа работает отлично, а вот моя никак не хочет)

даже сделал точно такую же как у вас, кинул 3 Edit, 3 Label,
поставил ваш код - вбиваются все подряд символы, по Enter не переходит.

Может еще какая настройка нужна? Подскажите пожалуйста.
(Пробовал на Turbo Delphi и на Delphi 7, на XP и на 7-ке)
Я в Делфи новичок, вы уж извините...

вот что у меня вышло...
Вложения
Тип файла: rar Ввод дробных.rar (6.2 Кб, 86 просмотров)
0
Почетный модератор
64299 / 47594 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
15.10.2011, 16:53 5
так не нужно просто копировать код с названиями процедур, их нужно инициировать. Зайдите в Инспектор объектов для Эдитов 1 и 2, и на вкладке Events кликните в окошечках около события OnKeyPress

Добавлено через 1 минуту
И уберите из Эдитов начальный текст, не красиво же...
1
1 / 1 / 0
Регистрация: 08.10.2011
Сообщений: 9
15.10.2011, 17:00  [ТС] 6
Puporev, ах)) классно, спасибо, заработало!!!
Из эдитов уберу, это же черновой вариант...

У меня там задача еще сделать кнопку Произведение, чтобы она становилась доступной, когда я введу корректные числа, сейчас буду делать, думаю справлюсь, но если что спрошу у вас еще, если не затруднит.

Еще раз спасибо. :dance3:
0
1 / 1 / 0
Регистрация: 08.10.2011
Сообщений: 9
15.10.2011, 19:29  [ТС] 7
Ура, у меня всё вышло. Puporev, благодарю за помощь.
Если кому будет полезно - программка по курсу доллара и цене товара в долларах определяет стоимость в рублях.

Скрин и исходники прилепил.
(ввод минуса отключен, т.к. входящие данные не могут быть отрицательными)
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Edit1KeyPress(Sender: TObject; var Key: Char);
    procedure Edit2KeyPress(Sender: TObject; var Key: Char);
    procedure Edit1Change(Sender: TObject);
 
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
// Нажатие клавиши в поле Курс
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  case Key of
    #8,'0'..'9' :  ; // цифры и <Back Space>
    '.',',': // разделитель целой и дробной частей числа
      begin
        if Key <> DecimalSeparator then
          Key := DecimalSeparator; // заменим разделитель на допустимый
        if Pos(DecimalSeparator,Edit1.Text) <> 0
          then Key := Chr(0); // запрет ввода второго разделителя
      end;
//    '-':    // минус можно ввести только первым символом,
//            // т.е. когда ячейка пустая
//      if Length(Edit1.Text) <> 0
//        then Key := Chr(0);
    #13:Edit2.Setfocus;
    else   // остальные символы запрещены
       key := Chr(0);
  end;
end;
 
// Нажатие клавиши в поле Цена
procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char);
begin
  case Key of
    #8,'0'..'9' :  ; // цифры и <Back Space>
    '.',',': // разделитель целой и дробной частей числа
      begin
        if Key <> DecimalSeparator then
          Key := DecimalSeparator; // заменим разделитель на допустимый
        if Pos(DecimalSeparator,Edit2.Text) <> 0
          then Key := Chr(0); // запрет ввода второго разделителя
      end;
//    '-':    // минус можно ввести только первым символом,
//            // т.е. когда ячейка пустая
//      if Length(Edit2.Text) <> 0
//        then Key := Chr(0);
    #13:Button1.SetFocus; // Сделать активной кнопку пересчет
    else   // остальные символы запрещены
       key := Chr(0);
  end;
end;
 
// текст, находящийся в поле редактирования, изменился
procedure TForm1.Edit1Change(Sender: TObject);
  begin
    // проверим, есть ли данные в полях редактирования
    if (Length(Edit1.Text)=0) or (Length(Edit2.Text)=0) then
      Button1.Enabled:=False  //Кнопка пересчет недоступна доступна
    else
      Button1.Enabled:=True  //Кнопка пересчет доступна
end;
 
procedure TForm1.Button1Click(Sender: TObject);
  var dol,kurs,rub:real;
begin
  kurs:=StrToFloat(Edit1.Text);
  dol:=StrToFloat(Edit2.Text);
  rub:=kurs*dol;
  rub:=round(rub*100)/100;
  Label4.Caption:=FloatToStr(dol)+'$ = '+ FloatToStr(rub)+'руб.';
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
  Close;
end;
 
end.
Миниатюры
Ввод дробного числа в Edit (автозамена точки на запятую)  
Вложения
Тип файла: rar Конвертор.rar (201.6 Кб, 133 просмотров)
1
0 / 0 / 0
Регистрация: 26.03.2013
Сообщений: 6
19.05.2013, 11:38 8
Зачем так мучиться и писать одно и то же для 2 разных Эдитов?
Delphi
1
TEdit(Sender).Text
И всех делов....
К тому же, нужно ввести проверку, не вводится ли DecimalSeparator в пустой Edit
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32830 / 21168 / 8147
Регистрация: 22.10.2011
Сообщений: 36,428
Записей в блоге: 8
19.05.2013, 12:09 9
Цитата Сообщение от Blondink@ Посмотреть сообщение
И всех делов....
Ну да, и плевать на то, что обработка нажатия #13 - разная для двух эдитов, зато короче. Главное ж не чтоб правильное решение подсказать, а чтобы апнуть некротему, да еще и таким бредовым постом...
0
12 / 8 / 6
Регистрация: 10.07.2011
Сообщений: 374
Записей в блоге: 1
21.08.2014, 15:44 10
Цитата Сообщение от Puporev Посмотреть сообщение
Все у меня работает...
Код-то работает, однако можно ввести первым символом разделитель, что не до конца решает задачу, описанную ТС.
0
Почетный модератор
64299 / 47594 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
21.08.2014, 15:54 11
Если введем .133, то в программе это прочитается как 0.133
0
21.08.2014, 15:54
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.08.2014, 15:54
Помогаю со студенческими работами здесь

Ввод дробного числа из поля TextBox в переменную
Доброго времени! Вроде все элементарно.... Есть форма UserForm и текстовые поля TextBox1,...

При вводе дробного числа происходит бесконечный ввод
При вводе дробного числа происходит бесконечный ввод, а при вводе целого все ок. #include...

Написать функцию, обеспечивающую интерактивный ввод с клавиатуры дробного числа
Написать функцию, обеспечивающую ввод с клавиатуры дробного числа. При нажатии клавиши...

Написать функцию, обеспечивающую интерактивный ввод с клавиатуры дробного числа
Написать функцию, обеспечивающую ввод с клавиатуры дробного числа. При нажатии клавиши...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru