Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.005 c
15-1318624203
Юрий
2011-10-15 00:30
2012.02.05
С днем рождения ! 15 октября 2011 суббота


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


15-1319020883
Kerk
2011-10-19 14:41
2012.02.05
WinXP: User Permissions


2-1319447555
Laguna
2011-10-24 13:12
2012.02.05
Ввод в TЕdit руками или сканером штрихкода.


2-1319653394
Дмитрий
2011-10-26 22:23
2012.02.05
Проблемы c Firebird





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский