C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
ограниченный Edit, чтобы набирались "нужные" символы
seg_r
Отправлено: 18.11.2005, 16:50


Дежурный стрелочник

Группа: Участник
Сообщений: 74



Короче чтобы можно было набирать только цифиры и смвол "/" . . .

можно только идею, с примерами . . . biggrin.gif
AVC
Отправлено: 18.11.2005, 18:43


Ветеран

Группа: Модератор
Сообщений: 1583



В поиск.
(OnKeyDown/OnKeyPress)
Grigoriy
Отправлено: 19.11.2005, 00:08


Мастер участка

Группа: Участник
Сообщений: 381



QUOTE (AVC @ 18/11/2005, 18:43)
В поиск.
(OnKeyDown/OnKeyPress)

А если в такой редактор вставлять текст из буфера обмена...
exp
Отправлено: 19.11.2005, 00:35


Мастер участка

Группа: Участник
Сообщений: 304



QUOTE
А если в такой редактор вставлять текст из буфера обмена...


Запретить вставку!
На крайняк проверку на OnChange делать.
seg_r
Отправлено: 19.11.2005, 18:54


Дежурный стрелочник

Группа: Участник
Сообщений: 74



Решил сделать по-простому вот так:

CODE
void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key)
{
if ((int(Key)!=8)&& // BACKSPACE
   (Key!='0')&&
   (Key!='1')&&
   (Key!='2')&&
   (Key!='3')&&
   (Key!='4')&&
   (Key!='5')&&
   (Key!='6')&&
   (Key!='7')&&
   (Key!='8')&&
   (Key!='9')&&
   (Key!='/')) Key=0x00;
}
Георгий
Отправлено: 19.11.2005, 19:43


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



[color=gray]seg_r, а почему инверсную логику используете? мне кажется что прямая более нагладная:
CODE
void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key)
{
if ((int(Key)==8)|| // BACKSPACE
(Key=='0')||
(Key=='1')||
(Key=='2')||
(Key=='3')||
(Key=='4')||
(Key=='5')||
(Key=='6')||
(Key=='7')||
(Key=='8')||
(Key=='9')||
(Key=='/')) Key=0x00;
}
а ещё проще:
CODE
TForm1::Edit1KeyPress(TObject *Sender, char &Key)
{if ((int(Key)==8)|| // BACKSPACE
isdigit(Key)|| //цифра
(Key=='/'))
Key=0x00;
}


Отредактировано Георгий — 19/11/2005, 20:45
Grigoriy
Отправлено: 19.11.2005, 22:07


Мастер участка

Группа: Участник
Сообщений: 381



Вот код на все случаи, в том числе вставка из буфера обмена.
И курсор не уходит никуда.
Проверил многими способами.

CODE

void __fastcall TForm1::Edit1Change(TObject *Sender)
{
int r,i,i1,i2,selst;
AnsiString c1;
AnsiString c2;
selst=Edit1->SelStart;
r=Edit1->Text.Length();
c1=Edit1->Text;
c2.SetLength(c1.Length());
i1=1;
i2=0;
for (i=1;i<=r;i++)
{
if ((c1[i]>='/')&&(c1[i]<='9')){
c2[i1]=c1[i];
i1++;
}else
{i2++;};
}
c2.Delete(c2.Length()+1-i2,i2);
Edit1->Text=c2;
Edit1->SelStart=selst-i2;
}
seg_r
Отправлено: 20.11.2005, 14:14


Дежурный стрелочник

Группа: Участник
Сообщений: 74



Последний ответ интересен, но

QUOTE
if ((c1[i]>='/')&&(c1[i]<='9'))


с1 — AnsiString,
а почему между '/' и '9' именно 012345678 ?
Grigoriy
Отправлено: 20.11.2005, 20:15


Мастер участка

Группа: Участник
Сообщений: 381



QUOTE (seg_r @ 20/11/2005, 14:14)
Последний ответ интересен, но

QUOTE
if ((c1[i]>='/')&&(c1[i]<='9'))


с1 — AnsiString,
а почему между '/' и '9' именно 012345678 ?

Потому что каждый символ в строке AnsiString кодируется одним байтом,
а в арифметических операциях сравнения процессор воспринимает байты как числа в двоичной системе счисления.

Для справки приведу значения байтов, которые кодируют некоторые символы

.........
'-' 0x2d
'.' 0x2e
'/' 0x2f
'0' 0x30
'1' 0x31
'2' 0x32
'3' 0x33
'4' 0x34
'5' 0x35
'6' 0x36
'7' 0x37
'8' 0x38
'9' 0x39
':' 0x3a
';' 0x3b
'<' 0x3c
'=' 0x3d
'>' 0x3e
..........

Вернуться в Вопросы программирования в C++Builder