seg_r |
Отправлено: 18.11.2005, 16:50 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 74
|
Короче чтобы можно было набирать только цифиры и смвол "/" . . .
можно только идею, с примерами . . . |
|
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
..........
|
|