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

Вниз

Ввод в 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;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.007 c
2-1319921661
samsung
2011-10-30 00:54
2012.02.05
Поиск в Memo


15-1318883405
Юрий
2011-10-18 00:30
2012.02.05
С днем рождения ! 18 октября 2011 вторник


1-1283368487
Eraser
2010-09-01 23:14
2012.02.05
Отладка загрузки модулей - initialization..finalization


11-1206198913
DJ_UZer
2008-03-22 18:15
2012.02.05
Горячие клавиши


2-1319991854
Gu
2011-10-30 19:24
2012.02.05
system.pas