![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ввод в TЕdit руками или сканером штрихкода. [D7, XP]
Laguna © (2011-10-24 13:12:00)Возможно ли как то определить чем был произведен ввод в TEdit руками с клавиатуры или сканером штрихкода?
Rouse_ (2011-10-24 20:44:00) [81]
> DiamondShark © (24.10.11 20:38) [24]
Похоже хорошего языка ты не понимаешь, так и запишем...
DiamondShark (2011-10-24 20:38:00) [82]Удалено модератором
Rouse_ (2011-10-24 19:37:00) [83]
> DiamondShark © (24.10.11 18:30) [20]
> Когда OnKeyPress приходит, никакая клавиша уже не нажата.
Заучи как мантру: "я буду всегда делать RTFM прежде чем постить глупость"
procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if GetKeyState(Integer(Key)) <> 0 then
Memo1.Lines.Add('KeyDown')
end;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if GetKeyState(Integer(UpperCase(Key)[1])) <> 0 then
Memo1.Lines.Add('KeyStillDown');
end;
procedure TForm1.Edit1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
Memo1.Lines.Add('KeyUp');
end;
QAZ (2011-10-24 19:30:00) [84]самое тупое во всем этом,так это наличие 2х едитов + разная обработка
а еще ктото гонит на интелект пользователей...
Dimka Maslov (2011-10-24 18:47:00) [85]
> Когда OnKeyPress приходит, никакая клавиша уже не нажата.
Сначала приходит KeyDown, потом KeyPress (он может повторяться если кнопка нажата и не отпускается), потом только KeyUp. Так что способ вполне себе проходной.
DiamondShark (2011-10-24 18:30:00) [86]
> Rouse_ © (24.10.11 16:52) [17]
> которая в OnKeyPress приходит.
Когда OnKeyPress приходит, никакая клавиша уже не нажата.
DiamondShark (2011-10-24 18:28:00) [87]
> Laguna © (24.10.11 13:12)
> Возможно ли как то определить чем был произведен ввод в
> TEdit руками с клавиатуры или сканером штрихкода?
Если сканер клавиатурный, включён в разрыв в один порт с клавиатурой, то практически никак. Теоретически, можно ловить скорость ввода, или настроить сканер на передачу символов префикса/суффикса и ловить по ним.
Если сканер подключён в отдельный порт (USB, сканер определяется как HID), то, возможно, ОРД спасёт RAW Input (WinXP и выше):
http://msdn.microsoft.com/en-us/library/ms645536(v=VS.85).aspx
Можно определять с какого экземпляра HID пришёл ввод.
DiamondShark (2011-10-24 18:22:00) [88]Удалено модератором
Rouse_ (2011-10-24 16:52:00) [89]
> А как определить какую клавтшу отлавливать? Ведь сканируются
> разные наборы цифр.
как какую? которая в OnKeyPress приходит...
Laguna (2011-10-24 16:16:00) [90]
> там чендж один раз только будет,
Нет, Change происходит на каждом добавлении символа, поэтому и придумана вот такая хитринка
if Length(Edit1.Text) = KolDigit then...
а до этого крутится пока условия не совпадут. (это я имею ввиду после считки сканером. Хотя с клавы тоже самое будет)
Laguna (2011-10-24 16:13:00) [91]ДА уж... юзерский интеллект, иногда на него не приходится расчитывать. Поэтому предусматриваются разные варианты от вылета программы.
ps
по поводу самозакрывающегося окна , походу на ShowMEssage кнопка стоит в фокусе, поэтому и закрывается после сканера.
OW (2011-10-24 16:10:00) [92]
> + и. интеллект на юзерский "копи-пасте"
там чендж один раз только будет, а длина на много единиц увеличится.
Вообще, надо конечно архитектуру пересматривать, но как заплатка "по-быстрому ", думаю, пойдет.
Медвежонок Пятачок (2011-10-24 16:04:00) [93]частота onChange
+ увеличение length(text)
+ и. интеллект на юзерский "копи-пасте"
Laguna (2011-10-24 15:55:00) [94]
> Вам на архитектуру уже намекнули. Как вообще у вас сканер
> может не-в-то-поле ввести номер?
Потому что я уже писал, что для ввода вручную чвое поле ввода, для сканера - свое. Каждое поле обрабатывается по своему. Точнее допустим для сканера Edit1, а для ручного ввода Edit2. Основная операция обработки происходит на onChange для Edit1
procedure TScanFrm.Edit1Change(Sender: TObject);
begin
if Length(Edit1.Text) = KolDigit then
begin
if Copy(Edit1.Text, 1, 3) <> IntToStr(LotRec.Nom) then
begin
DublBlink;
Edit1.SetFocus;
Edit1.SelectAll;
Exit;
end;
if not DM1.NotrelizTbl.FindKey([LRec.Kod, LRec.Nom, B_SNom]) then
DM1.NotrelizTbl.InsertRecord([Nil, LRec.Kod, LRec.Nom, B_SNom])
else
begin
// WarnMsg('Дублирование записи !');
DublBlink;
Edit1.SetFocus;
Edit1.SelectAll;
Exit;
end;
LoadTir;
Edit1.SetFocus;
Edit1.SelectAll;
end;
end;
procedure TScanFrm.Edit2Change(Sender: TObject);
begin
if Length(Edit2.Text) = KolDigit then
PostMessage(Handle, WM_NEXTDLGCTL, 0, 0);
end;
Дополнительно хочу чпросить, точнее указать на засаду. Если после входа в обработку после сканера вызвать MessageBox? то окно его не появляется, кнопка вроде как сама нажимается, поэтому делаю просто подстветку поля рамкой красной (procedure DublBlink)
> при добавлении символа в EDIT проверяй, нажата ли соответствующая
> клавиша через GetKeyState()
А как определить какую клавтшу отлавливать? Ведь сканируются разные наборы цифр.
OW (2011-10-24 15:46:00) [95]частота onChange
+ увеличение length(text)
Rouse_ (2011-10-24 15:41:00) [96]Сканера под рукой нет, проверить неначем, но теоретически должен сработать след подход: при добавлении символа в EDIT проверяй, нажата ли соответствующая клавиша через GetKeyState()
Омлет (2011-10-24 14:45:00) [97]> Laguna © (24.10.11 14:38) [8]
> Просто в случае отсутствия сканера предлагается ввод вручную. Хочется отловить , чтобы не вводили сканером в поле, предназначенное для ручного ввода с последующей обработкой.
Вам на архитектуру уже намекнули. Как вообще у вас сканер может не-в-то-поле ввести номер?
Laguna (2011-10-24 14:38:00) [98]
> сканер, подключаемый в клавиатурный разъём, будет выводить
> туда, куда юзер поставит текстовый курсор.
Совершенно верно. Просто в случае отсутствия сканера предлагается ввод вручную. Хочется отловить , чтобы не вводили сканером в поле, предназначенное для ручного ввода с последующей обработкой.
RWolf (2011-10-24 14:32:00) [99]
> Ega23 © (24.10.11 13:16) [1]
> Сканнер штрихкода не "выводит" в TEdit
сканер, подключаемый в клавиатурный разъём, будет выводить туда, куда юзер поставит текстовый курсор.
Dennis I. Komarov (2011-10-24 13:42:00) [100]
> Inovet © (24.10.11 13:33) [4]
нефиг вообще туда пастить :)