Форум: "Начинающим";
Текущий архив: 2012.02.05;
Скачать: [xml.tar.bz2];
ВнизВвод в TЕdit руками или сканером штрихкода. Найти похожие ветки
← →
Laguna © (2011-10-24 13:12) [0]Возможно ли как то определить чем был произведен ввод в TEdit руками с клавиатуры или сканером штрихкода?
← →
Ega23 © (2011-10-24 13:16) [1]Сканнер штрихкода не "выводит" в TEdit
← →
Dennis I. Komarov © (2011-10-24 13:16) [2]если считать время ввода, то можно...
← →
Dennis I. Komarov © (2011-10-24 13:17) [3]
> считать
->е (Упс...)
← →
Inovet © (2011-10-24 13:33) [4]> [2] Dennis I. Komarov © (24.10.11 13:16)
> если считать время ввода, то можно...
А копипаст отлавливать?
← →
Ega23 © (2011-10-24 13:37) [5]ИМХО.
Если возникают такие вопросы, то в архитектуре проекта явный бардак.
Рекомендую посмотреть в сторону UML DFD (DataFlow Diagramm) и разрисовать всё как надо.
← →
Dennis I. Komarov © (2011-10-24 13:42) [6]
> Inovet © (24.10.11 13:33) [4]
нефиг вообще туда пастить :)
← →
RWolf © (2011-10-24 14:32) [7]
> Ega23 © (24.10.11 13:16) [1]
> Сканнер штрихкода не "выводит" в TEdit
сканер, подключаемый в клавиатурный разъём, будет выводить туда, куда юзер поставит текстовый курсор.
← →
Laguna © (2011-10-24 14:38) [8]
> сканер, подключаемый в клавиатурный разъём, будет выводить
> туда, куда юзер поставит текстовый курсор.
Совершенно верно. Просто в случае отсутствия сканера предлагается ввод вручную. Хочется отловить , чтобы не вводили сканером в поле, предназначенное для ручного ввода с последующей обработкой.
← →
Омлет © (2011-10-24 14:45) [9]> Laguna © (24.10.11 14:38) [8]
> Просто в случае отсутствия сканера предлагается ввод вручную. Хочется отловить , чтобы не вводили сканером в поле, предназначенное для ручного ввода с последующей обработкой.
Вам на архитектуру уже намекнули. Как вообще у вас сканер может не-в-то-поле ввести номер?
← →
Rouse_ © (2011-10-24 15:41) [10]Сканера под рукой нет, проверить неначем, но теоретически должен сработать след подход: при добавлении символа в EDIT проверяй, нажата ли соответствующая клавиша через GetKeyState()
← →
OW © (2011-10-24 15:46) [11]частота onChange
+ увеличение length(text)
← →
Laguna © (2011-10-24 15:55) [12]
> Вам на архитектуру уже намекнули. Как вообще у вас сканер
> может не-в-то-поле ввести номер?
Потому что я уже писал, что для ввода вручную чвое поле ввода, для сканера - свое. Каждое поле обрабатывается по своему. Точнее допустим для сканера 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()
А как определить какую клавтшу отлавливать? Ведь сканируются разные наборы цифр.
← →
Медвежонок Пятачок © (2011-10-24 16:04) [13]частота onChange
+ увеличение length(text)
+ и. интеллект на юзерский "копи-пасте"
← →
OW © (2011-10-24 16:10) [14]
> + и. интеллект на юзерский "копи-пасте"
там чендж один раз только будет, а длина на много единиц увеличится.
Вообще, надо конечно архитектуру пересматривать, но как заплатка "по-быстрому ", думаю, пойдет.
← →
Laguna © (2011-10-24 16:13) [15]ДА уж... юзерский интеллект, иногда на него не приходится расчитывать. Поэтому предусматриваются разные варианты от вылета программы.
ps
по поводу самозакрывающегося окна , походу на ShowMEssage кнопка стоит в фокусе, поэтому и закрывается после сканера.
← →
Laguna © (2011-10-24 16:16) [16]
> там чендж один раз только будет,
Нет, Change происходит на каждом добавлении символа, поэтому и придумана вот такая хитринкаif Length(Edit1.Text) = KolDigit then...
а до этого крутится пока условия не совпадут. (это я имею ввиду после считки сканером. Хотя с клавы тоже самое будет)
← →
Rouse_ © (2011-10-24 16:52) [17]
> А как определить какую клавтшу отлавливать? Ведь сканируются
> разные наборы цифр.
как какую? которая в OnKeyPress приходит...
← →
DiamondShark © (2011-10-24 18:22) [18]Удалено модератором
← →
DiamondShark © (2011-10-24 18:28) [19]
> 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:30) [20]
> Rouse_ © (24.10.11 16:52) [17]
> которая в OnKeyPress приходит.
Когда OnKeyPress приходит, никакая клавиша уже не нажата.
← →
Dimka Maslov © (2011-10-24 18:47) [21]
> Когда OnKeyPress приходит, никакая клавиша уже не нажата.
Сначала приходит KeyDown, потом KeyPress (он может повторяться если кнопка нажата и не отпускается), потом только KeyUp. Так что способ вполне себе проходной.
← →
QAZ (2011-10-24 19:30) [22]самое тупое во всем этом,так это наличие 2х едитов + разная обработка
а еще ктото гонит на интелект пользователей...
← →
Rouse_ © (2011-10-24 19:37) [23]
> 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;
← →
DiamondShark © (2011-10-24 20:38) [24]Удалено модератором
← →
Rouse_ © (2011-10-24 20:44) [25]
> DiamondShark © (24.10.11 20:38) [24]
Похоже хорошего языка ты не понимаешь, так и запишем...
← →
DiamondShark © (2011-10-24 20:51) [26]
> Rouse_ © (24.10.11 20:44) [25]
Как носом ткнули, так сообщения трёшь? Ой, красота какая.
← →
DiamondShark © (2011-10-24 20:57) [27]Повторяю для тех, кто в танке.
К моменту прихода OnKeyPress никакая клавиша уже может быть не нажата, хотя предложенный любителем мантр код радостно сообщит, что клавиша нажата.
Теперь посмотрим, как любитель мантр придерётся к языку и сотрёт и это сообщение.
← →
Rouse_ © (2011-10-24 20:57) [28]
> DiamondShark © (24.10.11 20:51) [26]
> Как носом ткнули, так сообщения трёшь? Ой, красота какая.
Ткни еще раз, только перед этим перечитай внимательно выделенное тобой и осмысли остатком мозга.
Еще раз допустишь подобные высказывания - получишь профилактику...
← →
Rouse_ © (2011-10-24 20:59) [29]
> DiamondShark © (24.10.11 20:57) [27]
> К моменту прихода OnKeyPress никакая клавиша уже может быть
> не нажата
А не кажется ли тебе что выражения "не нажата" и "может быть не нажата" - немного разные понятия, или это одно и то-же?
← →
Rouse_ © (2011-10-24 21:00) [30]И на последок, даже если клавиша не нажата, это как-то воспрепятствует прохождению стандартной цепочки (down/press/up) ?
← →
DiamondShark © (2011-10-24 21:29) [31]
> Rouse_ © (24.10.11 20:57) [28]
Давай ты начнёшь сам следовать своим советам (на счёт остатков мозга, например, или там языка). Ну, или вспомнишь, о чём идёт речь в теме. Ещё бы хорошо не приплетать то, о чём вообще речь не шла (о последовательности сообщений, например).
Если до тебя не доходит написанное (а как оно может дойти, когда попоболь и кнопка под рукой), то модифицируй свой код вот так:
procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if GetKeyState(Integer(Key)) <> 0 then
Memo1.Lines.Add("KeyDown");
sleep(100500);
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;
Нажми клавишу коротко и осмысли происходящее.
Ну вот именно это и было написано в стёртом тобой тексте.
Теперь давай вспомним, что речь у нас идёт не о клавиатурах, а о сканерах, точнее, о различении сканеров и клавиатур.
Пропускной способности интерфейсов (USB 2.0, например) вполне хватает, чтобы послать пару "нажато"-"отпущено" с такой скоростью, что приложение даже пол-цикла message pump-а выполнить не успеет.
Так что к моменту выборки WM_CHAR из очереди потока "клавиши" (т.е. внутреннее состояние HID-драйвера) будут "отпущены".
Но твой мантровский код радостно сообщит, что клавиша нажата.
← →
Rouse_ © (2011-10-24 21:44) [32]
> sleep(100500);
А че так мало?
А теперь выкинь всю бредятину из головы, поставь слип в своем коде на 1000 например, нажми кнопку и отпусти, дождись реакции кода. В момент прихода сообщения мы узнаем о том, была клавиша нажата или нет на момент прихода сообшщения?
Теперь выключи, как ты говоришь "попоболь" и ответь мне на вопрос: мой вариант даже с искусственно созданными тобой проблемами не отвечает на поставленный автором вопрос?
← →
Rouse_ © (2011-10-24 21:46) [33]зы: Толь - не надо закрывать, мы тут еще поспорим немного, если пойдут прямые оскорбления еще раз - сам закрою...
← →
Laguna © (2011-10-24 22:16) [34]> QAZ (24.10.11 19:30) [22]
> самое тупое во всем этом,так это наличие 2х едитов + разная
> обработкаа еще ктото гонит на интелект пользователей...
Ну и в чем конкретно тупость? Есть лучший вариант?
← →
Rouse_ © (2011-10-24 22:22) [35]
> Laguna © (24.10.11 22:16) [34]
> Ну и в чем конкретно тупость? Есть лучший вариант?
Желательно избегать неоднозначности. Мы в свое время делали след образом: отдельная кнопка, по нажатию которой выводился диалог с надписью что-то типа: "ожидаем ввода сканера", в котором блокировался ввод с клавиатуры за исключением Esc.
В диалоге и снимался сам ввод, таким образом и пользователю было понятно что делать и не нужно было городить разграничение с фокусом ввода...
← →
DiamondShark © (2011-10-24 22:39) [36]
> Rouse_ © (24.10.11 21:44) [32]
> А че так мало?
Шоб ты спросил.
Поставь туда свою оценку разницы скорости своего пальца и посылки двух кодов друг за другом по ЮСБ.
> А теперь выкинь всю бредятину из головы, поставь слип в
> своем коде на 1000 например, нажми кнопку и отпусти, дождись
> реакции кода.
Это ты у сканера попроси дождаться реакции твоего кода.
Если ты не понимаешь, что аппаратные события происходят абсолютно независимо от реакции твоего кода, что моменты выборки сообщений не имеют ничего общего с моментами наступления событий и что возвращает GetKeyState, то я тебе не доктор.
> В момент прихода сообщения мы узнаем о том, была клавиша
> нажата или нет на момент прихода сообшщения?
Не прошло и пол-суток, как ты соизволиил сделать попытку прочитать и перевести цитату из TFM.
К сожалению, низачот. Попробуй ещё раз.
> Теперь выключи, как ты говоришь "попоболь" и ответь мне
> на вопрос: мой вариант даже с искусственно созданными тобой
> проблемами не отвечает на поставленный автором вопрос?
Отвечаю: не отвечает.
← →
DiamondShark © (2011-10-24 22:43) [37]
> Rouse_ © (24.10.11 22:22) [35]
> Мы в свое время делали след образом: отдельная кнопка, по
> нажатию которой выводился диалог с надписью что-то типа:
> "ожидаем ввода сканера", в котором блокировался ввод с
> клавиатуры за исключением Esc.В диалоге и снимался сам ввод,
> таким образом и пользователю было понятно что делать и
> не нужно было городить разграничение с фокусом ввода...
Т.е. вы в своё время решили не задачу прикладной области, а какую-то свою собственную проблему.
← →
KilkennyCat © (2011-10-24 22:43) [38]сканер сканеру рознь.... у меня сказевый даже есть. А3. к нему можно приделать ручку и елозить им по штрихкоду.
← →
Rouse_ © (2011-10-24 22:44) [39]
> DiamondShark © (24.10.11 22:39) [36]
> Если ты не понимаешь, что аппаратные события происходят
> абсолютно независимо от реакции твоего кода, что моменты
> выборки сообщений не имеют ничего общего с моментами наступления
> событий и что возвращает GetKeyState, то я тебе не доктор.
Ага, я понял о чем ты, мдя... :)
Т.е. ты реально думаешь что событие сгенеренное сканером придет вне очереди сообщений и соответственно все АПИ, относящиеся к ней пойдут лесом?
← →
Anatoly Podgoretsky © (2011-10-24 22:44) [40]> Rouse_ (24.10.2011 21:46:33) [33]
Ну так просто, открой если считаешь нужным, но вы уже перешли на взаимные
оскорбления.
Страницы: 1 2 3 вся ветка
Форум: "Начинающим";
Текущий архив: 2012.02.05;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.004 c