Форум: "KOL";
Текущий архив: 2006.04.30;
Скачать: [xml.tar.bz2];
ВнизМедленная обработка события 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 вся ветка
Форум: "KOL";
Текущий архив: 2006.04.30;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.01 c