| 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 
..........
 | 
  |