![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Медленная обработка события OnKeyUp в EditBox
DmiSb © (2005-08-29 15:09:00)Мне нужно сделать ввод счета по маске, типа 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 - выделается первый символ.
Начинаем вводить цифры.
Вроде работает, но если вводить цифры быстро, то не успевает и теряет цифры. Можно что-нибудь сделать по этому поводу.
thaddy (2005-08-30 14:48:00) [1]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. ;)
DmiSb (2005-08-30 11:02:00) [2]Спасибо за совет.
Сделал вот так.
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-29 15:53:00) [3]This is also why you should almost always use KeyUp, not KeyDown.
Vladimir Kladov (2005-08-29 15:15:00) [4]ввод букв/цифр надо бы в onchar обраьатывать. Не на каждый OnKeyDown гарантируется приход OnKeyUp, кстати, например если клавишу просто нажать и подержать, то придет ой-ёй сколько WM_KEYDOWN, и только один WM_KEYUP.