Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.04.30;
Скачать: CL | DM;

Вниз

Медленная обработка события OnKeyUp в EditBox   Найти похожие ветки 

 
DmiSb   (2005-08-29 15:09) [0]

Мне нужно сделать ввод счета по маске, типа 00000 000 0 000 0000 0000
В событии OnKeyUp в EditBox написал следующее

 if key in [48..57, 96..105] then begin
   p:=eACC_B0.SelStart;
   if p in [5,9,11,15,20] then p:=p+1;
   eACC_B0.SelStart:=p;
   eACC_B0.SelLength:=1;
 end else
 if (key=VK_LEFT) or (key=VK_RIGHT) then begin
   p:=eACC_B0.SelStart;
   if key=VK_LEFT then begin
     if p<>0 then p:=p-1;
     if p in [5,9,11,15,20] then p:=p-1;
   end else begin
     if p<>24 then p:=p+1;
     if p in [5,9,11,15,20] then p:=p+1;
   end;
   key:=0;
   eACC_B0.SelStart:=p;
   eACC_B0.SelLength:=1;
 end else
 if key=VK_HOME then begin
   key:=0;
   eACC_B0.SelStart:=0;
   eACC_B0.SelLength:=1;
 end;

По умолчанию в поле написано 00000 000 0 000 0000 0000.
Щелкаем на поле, нажимаем на Home - выделается первый символ.
Начинаем вводить цифры.
Вроде работает, но если вводить цифры быстро, то не успевает и теряет цифры. Можно что-нибудь сделать по этому поводу.


 
Vladimir Kladov   (2005-08-29 15:15) [1]

ввод букв/цифр надо бы в onchar обраьатывать. Не на каждый OnKeyDown гарантируется приход OnKeyUp, кстати, например если клавишу просто нажать и подержать, то придет ой-ёй сколько WM_KEYDOWN, и только один WM_KEYUP.


 
thaddy   (2005-08-29 15:53) [2]

This is also why you should almost always use KeyUp, not KeyDown.


 
DmiSb   (2005-08-30 11:02) [3]

Спасибо за совет.
Сделал вот так.

procedure TForm1.EditBox1Char(Sender: PControl; var Key: Char;
 Shift: Cardinal);
var p: integer;
 s: string;
begin
 if key in ["1","2","3","4","5","6","7","8","9","0"] then begin
   p:=EditBox1.SelStart;
   s:=EditBox1.Text;
   s[p+1]:=key;
   EditBox1.Text:=s;
   if p in [4..9] then p:=10 else
   if p in [10,14,19] then p:=p+2
   else p:=p+1;
   EditBox1.SelStart:=p;
   EditBox1.SelLength:=1;
   key:=#0;
 end;
end;

procedure TForm1.EditBox1KeyUp(Sender: PControl; var Key: Integer;
 Shift: Cardinal);
var p: integer;
 s, s1, s2: string;
begin
 p:=EditBox1.SelStart;
 s:=EditBox1.Text;
 case key of
   VK_LEFT:
     if p in [6..11] then p:=4 else
     if p in [12,16,21] then p:=p-2
     else p:=p-1;
   VK_RIGHT:
     if p in [6..11] then p:=10 else
     if p in [12,16,21] then p:=p
     else p:=p-1;
   VK_HOME: p:=0;
   VK_END: p:=24;
   VK_DELETE: begin
     s1:=copy(s, 1, p);
     s2:=copy(s, p+1, length(s)-p);
     EditBox1.Text:=s1+"0"+s2;
     if p in [4..9] then p:=10 else
     if p in [10,14,19] then p:=p+2 else
     if p=24 then p:=p else p:=p+1;
   end;
   VK_BACK: begin
     s1:=copy(s, 1, p);
     s2:=copy(s, p+1, length(s)-p);
     EditBox1.Text:=s1+"0"+s2;
     if p in [6..11] then p:=4 else
     if p in [12,16,21] then p:=p-2 else
     if p=0 then p:=p else p:=p-1;
   end;
 end;
 key:=0;
 EditBox1.SelStart:=p;
 EditBox1.SelLength:=1;
end;

Немного коряво, но вроде работает.
Может у кого более красивая реализация ?


 
thaddy   (2005-08-30 14:48) [4]

If one of my staff would have written this, I would have found this code acceptable.
If it works, and I have seen no major errors or inefficiencies, leave it alone. ;)



Страницы: 1 вся ветка

Текущий архив: 2006.04.30;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.029 c
4-1139395573
rOOse
2006-02-08 13:46
2006.04.30
PopUp Menu


15-1144441168
NotDesigner
2006-04-08 00:19
2006.04.30
Помогите сделать логотип


2-1144912585
MAMBA
2006-04-13 11:16
2006.04.30
Как отобразить?


4-1139410159
Maverick
2006-02-08 17:49
2006.04.30
как узнать имя окна зная его handle?


15-1144389320
Indulf
2006-04-07 09:55
2006.04.30
Модуль для работы с БД