Главная страница
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]

Ну так просто, открой если считаешь нужным, но вы уже перешли на взаимные
оскорбления.


 
DiamondShark ©   (2011-10-24 22:45) [41]

> Rouse_ ©   (24.10.11 22:22) [35]
Кстати, тут написано враньё.


 
Anatoly Podgoretsky ©   (2011-10-24 22:45) [42]

> Laguna  (24.10.2011 22:16:34)  [34]

Есть, одно поле


 
Rouse_ ©   (2011-10-24 22:47) [43]


> DiamondShark ©   (24.10.11 22:45) [41]
> Кстати, тут написано враньё.

Ты раскрывай тему, родимый - не стесняйся :)


 
Rouse_ ©   (2011-10-24 22:49) [44]


> Anatoly Podgoretsky ©   (24.10.11 22:44) [40]
> Ну так просто, открой если считаешь нужным, но вы уже перешли
> на взаимные оскорбления.

Ну не я ж первый по родственникам прошелся, тяжелые времена пошли, совсем народ с выражениями не стесняется...


 
Laguna ©   (2011-10-24 22:54) [45]

В предложенном варианте что подразумевается под диалогом? Если дополнителная форма - то смысл тот же будет. Просто будет задействована дополнительная форма. Вот с блокированием ввода с клавиатуры  есть над чем подумать.

Сейчас у меня вот так
http://s017.radikal.ru/i441/1110/39/c5c0ed02798b.jpg

http://s45.radikal.ru/i109/1110/74/c64733172f67.jpg

Как правило ручной ввод применяется когда нет в наличии сканера. В принципе можно не опасаться. Каждый Edit отработает нормально. Но кто его знает, если приспичит кому переключиться в ручной режим и подсунуть под сканер. Сегодня не хватило времени на работе полностью проверить все возможные варианты.


 
Anatoly Podgoretsky ©   (2011-10-24 22:57) [46]

> Rouse_  (24.10.2011 22:49:44)  [44]

А зачем разбирать, мол он первый начал, не в песочнице, бить своих и чужих


 
Rouse_ ©   (2011-10-24 22:59) [47]


> Laguna ©   (24.10.11 22:54) [45]
>
> В предложенном варианте что подразумевается под диалогом?
>

Первый


 
Rouse_ ©   (2011-10-24 23:00) [48]

Удалено модератором
Примечание: Ну вот даже так нельзя...


 
DiamondShark ©   (2011-10-24 23:00) [49]


> Rouse_ ©   (24.10.11 22:44) [39]

Ты опять слушаешь свои фантазии, а не то, что я говорю.
Весь АПИ будет работать как часики. Не будет работать твой подход, потому что ты не понимаешь, как работает тот самый АПИ, который ты упоминаешь всуе.


> Rouse_ ©   (24.10.11 22:47) [43]

Дык, формальная логика, класс второй, третья четверть:

> диалог с надписью что-то типа: "ожидаем ввода сканера",
> в котором блокировался ввод с клавиатуры за исключением Esc.

Если вы смогли блокировать ввод с клавиатуры, но принимали ввод сканера, значит вам удалось разрешить проблему различения ввода с клавиатуры и со сканера.
Но диалог вы создавали для того чтобы НЕ РЕШАТЬ (или потому что не СМОГЛИ решить) проблему различения ввода с клавиатуры и со сканера.

Твоя байка содержит внутреннее противоречие. Рыбаки и то лучше сочиняют.


 
Rouse_ ©   (2011-10-24 23:06) [50]


> DiamondShark ©   (24.10.11 23:00) [49]
>
>
> > Rouse_ ©   (24.10.11 22:44) [39]
>
> Ты опять слушаешь свои фантазии, а не то, что я говорю.
> Весь АПИ будет работать как часики. Не будет работать твой
> подход, потому что ты не понимаешь, как работает тот самый
> АПИ, который ты упоминаешь всуе.

Ну тыж не стесняйся - код приводи демонстрирующий невалидность работы данного кода со сканером, что ты как первокурсница ?
А там и поглядим у кого фантазии поболе будет.


> DiamondShark ©   (24.10.11 23:00) [49]
> Если вы смогли блокировать ввод с клавиатуры, но принимали
> ввод сканера, значит вам удалось разрешить проблему различения
> ввода с клавиатуры и со сканера.
> Но диалог вы создавали для того чтобы НЕ РЕШАТЬ (или потому
> что не СМОГЛИ решить) проблему различения ввода с клавиатуры
> и со сканера.

А эт батенька все из-за того, что кто-то леницо читать мануалы от МС по юзабилити, отсюда и рождаются всякого рода нестандартные подходы к построению интерфейса, и неликвидные задачи плана "надо решить как в одно окно будет литься куча данных я мы их должны расфасовывать по смыслу"


 
Laguna ©   (2011-10-24 23:14) [51]


>  и неликвидные задачи плана "надо решить как в одно окно
> будет литься куча данных я мы их должны расфасовывать по
> смыслу"

Если это камень в мой огород, то да, решается в одной форме, но разграничение принимаемых данных придумано на уровне разных мест ввода. Пока так... а там будет подумать как лучше сделать.


 
Медвежонок Пятачок ©   (2011-10-24 23:16) [52]

Весь гемор из-за того, что пошли по пути наименьшего сопротивления - сканер в режиме "разрыв клавы". Ибо программировать ничего как бы не надо.


 
Юрий Зотов ©   (2011-10-24 23:17) [53]

А зачем вообще все это? Разве не пофиг, откуда в Edit"е взялся штрих-код?


 
Rouse_ ©   (2011-10-24 23:19) [54]


> Юрий Зотов ©   (24.10.11 23:17) [53]
>
> А зачем вообще все это? Разве не пофиг, откуда в Edit"е
> взялся штрих-код?

Ну, если лень перечитывать, то началось все с того что Дима Акуличев зачем-то высказал мнение, что на момент генерирования события о нажатии клавиши, сама клавиша может быть не нажата и поэтому узнать о ее состоянии на момент генерации сообщения не представляется возможным. Ну а дальше как обычно...


 
Юрий Зотов ©   (2011-10-24 23:27) [55]


> Rouse_ ©   (24.10.11 23:19) [54]

Да я не о вас, я о сабже. На фиг надо вообще что-то там различать - не понимаю. Есть Edit (один!), в нем есть штрих-код - и разве не пофиг, откуда он там взялся?


 
Игорь Шевченко ©   (2011-10-24 23:29) [56]


> на момент генерирования события о нажатии клавиши, сама
> клавиша может быть не нажата и поэтому узнать о ее состоянии
> на момент генерации сообщения не представляется возможным


Узнать о состоянии клавиши в момент выборки сообщения из очереди в общем случае невозможно. В этом ничего странного нет.


 
Laguna ©   (2011-10-24 23:33) [57]


> Весь гемор из-за того, что пошли по пути наименьшего сопротивления
> - сканер в режиме "разрыв клавы". Ибо программировать ничего
> как бы не надо.

Так тут выбирать не приходится. Какой сканер есть в наличии с тем и работаем :)

Еще раз про два едита. "Edit для сканера" был придуман, чтобы ввод проходил как бы в фоновом режиме, т.к. ручного вмешательства не будет. И пользователю особо заморачиваться не приходится. Сканируй данные и все. Как говорится что есть, то и считали.


 
Rouse_ ©   (2011-10-24 23:35) [58]


> Игорь Шевченко ©   (24.10.11 23:29) [56]
> Узнать о состоянии клавиши в момент выборки сообщения из
> очереди в общем случае невозможно. В этом ничего странного нет.

Дык на этом собственно затык и произошел...


 
sniknik ©   (2011-10-24 23:36) [59]

> А зачем вообще все это? Разве не пофиг, откуда в Edit"е взялся штрих-код?
не особо удобно когда нужно смотреть где ввод... вот у нас было, "ручной" в поля а сканером где ни попадя вводи и оно инициирует добавление товара в накладную.
т.е. не нужно из пролистывания/сумирования/т.д. что бы ни делали в накладной, где бы ввод не находился, просто провел сканером и товар добавлен и ожидание ввода количества стоит.

без разделения так не получится, у нас был префикс/постфикс при сканерах в разрыв, но это еще для DOS-а, в винде с таким подходом проблемы, и с COM портом в винде.


 
Laguna ©   (2011-10-24 23:38) [60]

Я ничего не имею против вашего предложение по поводу одного Edit-а. Просто говорю раньше был такой вариант, возможно нужно пересмотреть и действительно перевести все на один Edit.


 
sniknik ©   (2011-10-24 23:39) [61]

> Какой сканер есть в наличии с тем и работаем :)
цена вопроса 50-100$ поменять. (у нас было проще, мы их поставляли, и что кому давать решалось административно... после того как выяснили что программно это практически не решается)


 
DiamondShark ©   (2011-10-24 23:59) [62]


> Rouse_ ©   (24.10.11 23:06) [50]
> Ну тыж не стесняйся - код приводи демонстрирующий невалидность
> работы данного кода со сканером, что ты как первокурсница
> ?А там и поглядим у кого фантазии поболе будет.

Тролишь?

В твоём обработчике GetKeyState всегда сообщит, что клавиша нажата, хотя в случае очень быстрого темпа аппаратных событий "клавиша" может быть давно отпущена.
Для того, чтобы имитировать ситуацию, когда соотношение темпа выборки сообщений и темпа аппаратных событий отличается от типичного отношения при обычном человеческом вводе, я тебе предложил вариант с задержкой.
Ты предпочёл постебаться, а не подумать. Ну, свобода выбора, фигли, святое. Только не обижайся потом, что тебя перестают всерьёз воспринимать, когда ты начинаешь дурочку валять.


> А эт батенька все из-за того, что кто-то леницо читать мануалы
> от МС по юзабилити, отсюда и рождаются всякого рода нестандартные
> подходы к построению интерфейса, и неликвидные задачи плана
> "надо решить как в одно окно будет литься куча данных я
> мы их должны расфасовывать по смыслу"

Я не понял, что из-за чего?
Ты сочиняешь нелогичные байки, из-за того, что кто-то чего-то не читает?
*facepalm.jpg*

Что же до мануалов...
Ты рабочее место кассира видел? Ну, в супермаркете-то хоть был?
Дай ссылку на мануал, в котором расписано юзабилити рабочего места кассира, к которому подключены клавиатура, два сканера (стационарный и ручной) и ридер каких-нибудь карточек, сблокированный с клавиатурой и гонящий данные по тому же интерфейсу.
Я тебе натуральное спасибо скажу. Я уже десятка полтора таких штук написал, на разных платформах, включая ДОС и такую экзотическую штуку, как залитую в компаунд коробочку 10х15х5 см, из которой кроме шести КОМ-портов и Эзернета ничего не торчало, зато внутри была ВинЦЕ. Вдруг я в этой жизни что-то упустил.


 
DiamondShark ©   (2011-10-25 00:05) [63]


> Rouse_ ©   (24.10.11 23:19) [54]

Можно цитату, где Дима Акуличев что-то подобное говорит?
(если ты не различаешь "момент генерации события" и момент обработки Windows-сообщения, то можешь не утруждаться)


 
Rouse_ ©   (2011-10-25 00:07) [64]


> DiamondShark ©   (24.10.11 23:59) [62]

Тяжко... ты действительно не представляешь схему, а вроде по моим представлениям должен был понимать...

Хм, попробую дать намек.
Ты сказал: "в случае очень быстрого темпа аппаратных событий "клавиша" может быть давно отпущена".

Вопрос, что произойдет в случае быстрого темпа?
1. часть сообщений окном будет пропущена и ввод со сканера будет не успешен.
2. все сообщения окно получит.

Если да, то:
1. обработает генерацией сообщения?
2. сможет получить по сообщению состояние клавиши через GetKeyState?

какой пункт по твоему мнению не верный?


 
Laguna ©   (2011-10-25 00:11) [65]

> sniknik ©   (24.10.11 23:39) [61]


> > Какой сканер есть в наличии с тем и работаем :)цена вопроса
> 50-100$ поменять.

Здесь не решается вопрос на уровне пользователей. Закупает сканеры головное предприятие. А подчененных более 4500. Т.ч. сами понимаете, что шиковать не приходится. Поэтому и пытаюсь решить задачу малой кровью при малом количестве часов, отпушенных на решение задачи.

Сейчас пересматривал возможность перехода к одному Edit. Оказывается не зря все же я делпал разделение ввода. При считке сканером к примеру билет читается как серия + номер+ индекс. Приручном вводе поля ввода разделяются(в другой задаче). Здесб же нужно вводить только номер + индекс. Короче тут tit и фейс самой проги завязан. Т.ч. звиняйте, может и по колхозному, но...


 
Rouse_ ©   (2011-10-25 00:18) [66]


> DiamondShark ©   (24.10.11 23:59) [62]
> Ты рабочее место кассира видел? Ну, в супермаркете-то хоть был?

писал, тока для RS232, там окна не надомно...
Я вообще, ес чего, дохрена чего писал, и для лифтов и для датчиков давления и для котлов котельных ПО фигачил, а вот в супермаркете небыл, по инету предпочитаю чтоб продукты доставляли...


 
DiamondShark ©   (2011-10-25 00:18) [67]


> Rouse_ ©   (25.10.11 00:07) [64]

Почитай внимательно описание GetKeyState.

И не подменяй предмет. Задача -- не просто получить ввод со сканера (который, конечно же, будет получен), а отличить ввод со сканера от "человеческого".

Твой подход -- по темпу ввода, человек нажимает на кнопочки (по сравнению со сканером) неспешно, и в момент выборки (которую ты постоянно путаешь с генерацией) WM_CHAR кнопочка ещё будет "нажата" (т.е. не произойдёт аппаратного события "присылка скан-кода отпускания").

Так вот я всего лишь говорю, что GetKeyState тут тебе не поможет совсем. Никак. Absolutly.
Почему -- читай внимательно описание GetKeyState. Следуй своему ценному совету.


 
DiamondShark ©   (2011-10-25 00:21) [68]


> Rouse_ ©   (25.10.11 00:18) [66]
> писал, тока для RS232, там окна не надомно...

Тю... Не спортивно. На разных интерфейсах и дурак напишет.
Знаешь, как я радовался, когда появились УСБ-устройства, и АПИ RAW Input.


 
Rouse_ ©   (2011-10-25 00:21) [69]


> DiamondShark ©   (25.10.11 00:18) [67]
> Твой подход -- по темпу ввода

плин, так я ж тебе уже раза три попросил - ну сделай ты мне демо код где эмулируется человеческий ввод и нечеловеческий, чегож ты ерунду пишешь то? покажи мне как мой код будет темп ввода то отличать :)


 
имя   (2011-10-25 00:25) [70]

Удалено модератором


 
DiamondShark ©   (2011-10-25 00:26) [71]


> Закупает сканеры головное предприятие.

Так какого типа сканеры? С каким интерфейсом? Keyboard или USB?
А клавиатуры с каким интерфейсом?

Если или клавы или сканеры USB, то юзай RAW Input.


 
Laguna ©   (2011-10-25 00:44) [72]

Сканеры в разрыв клавы. Клава обычная PS/2. Есть и другие сканеры, объемные, динозавры блин, но тоже в разрыв клавы включены. Раньше был еще такой сканер, который после скана не вставлял в конце #13. Вот тоже гемор был. И на разных местах разные сканеры стояли. Пришлось выкручиватся(уже точно не момн., эмулировал передерг с Edita, дабы onChange произошло). Т.к. на разных местах разное оборудование. Я тнигда захожу к людям и боьно становится смотреть на 15 монитор, на котором ну ни фига не видно. Мало того что тресется все, так еще под обильным слоем вуали. А людям приходится на этом работать. А вы говорить 50-100 баксов не вопрос...


 
Laguna ©   (2011-10-25 00:51) [73]

Уважаемые мастера. Еще одна просьба(за одно), дабы не плодить лишних тем, подскажите, какое событие срабатывает на гриде в момент его скроллинга. Т.е. когда реально нажимаеи на его значки скрола или передвигаем сам ползунок? http://s44.radikal.ru/i105/1110/9b/1be205e20182.jpg


 
sniknik ©   (2011-10-25 01:09) [74]

> который после скана не вставлял в конце #13
постфикс настраивается, сам сканер... единственный сканер с не настраиваемым постфиксом(или префиксом, не помню уже) был стационарный "магелан". забавно было дешевые китайские как угодно, а то такая "дорогая дура"... и вдруг "наполовину".

> дабы не плодить лишних тем
сейчас я тебя закрою, дабы не плодить лишних... один вопрос одна ветка, что в правилах в этом непонятного? что сэкономить пытаешься?


 
Laguna ©   (2011-10-25 01:13) [75]

> sniknik


> сейчас я тебя закрою, дабы не плодить лишних... один вопрос
> одна ветка, что в правилах в этом непонятного? что сэкономить
> пытаешься?

Ок, тогда лучше [73] вобще удалить, дабы не путалось здесь в этом топике


 
Германн ©   (2011-10-25 01:32) [76]


> Ты рабочее место кассира видел? Ну, в супермаркете-то хоть
> был?
> Дай ссылку на мануал, в котором расписано юзабилити рабочего
> места кассира, к которому подключены клавиатура, два сканера
> (стационарный и ручной) и ридер каких-нибудь карточек, сблокированный
> с клавиатурой и гонящий данные по тому же интерфейсу.

Честно говоря, я вышеуказанное рабочее место "детально", т.е. со стороны самого кассира не видел. Но разве это оправдание делать "идиотский" алгоритм программы, которая должна  сама определять откуда пришел ввод? И при этом сама делать вывод какой код учитывать? Считанный со сканера или введённый юзером с клавиатуры? А ведь они оба могут быть введены!


 
KilkennyCat ©   (2011-10-25 02:09) [77]

за пару долларов можно сделать небольшой переходничек на клаву, или на сканер, без разницы.... будет генерить дополнительно че-нить или генерить в усб 232 или куда угодно...
могу взяться через пару недель.


 
KilkennyCat ©   (2011-10-25 02:13) [78]

может, действительно сделать? судя по полемике, наболевшая проблема.


 
KilkennyCat ©   (2011-10-25 02:15) [79]

если в варианте "нажатие на кнопку клавиатуры шлет битик в усб" то себестоимость - доллар от 100 штук.


 
Германн ©   (2011-10-25 02:17) [80]


> KilkennyCat ©   (25.10.11 02:09) [77]
>
> за пару долларов можно сделать небольшой переходничек на
> клаву, или на сканер, без разницы.... будет генерить дополнительно
> че-нить или генерить в усб 232 или куда угодно...
> могу взяться через пару недель.

Мне нужно возвращать долги после ремонта, а ты Костя тут демпингуешь! Чем я тебе не угодил? :)


 
KilkennyCat ©   (2011-10-25 02:35) [81]

а... ты уже что-то предлагаешь? извини, не заметил... снимаю свою кандитадуру.
извиняюсь за оффтоп, Германн, а ты ту проблему с езернетом решил? а то я почти решил.


 
Германн ©   (2011-10-25 04:05) [82]


> извиняюсь за оффтоп, Германн, а ты ту проблему с езернетом
> решил? а то я почти решил.
>

И я "почти решил". Но наверняка моё почти никак не коррелирует с твоим почти. :)
Если что конкретное, то обращайся на почту.


 
sniknik ©   (2011-10-25 08:01) [83]

> Но разве это оправдание делать "идиотский" алгоритм программы, которая должна  сама определять откуда пришел ввод?
почему это для удобства у тебя синоним "идиотский"?

поверь это очень удобно, при вводе накладной например не искать/вставать в специальное поле, или не не нажимать доп кнопку открывающую "форму ввода со сканера"(видел и такие "решения", и не с одной кнопкой), а просто сканировать сканером. собственно это их и отличает от клавиатуры, удобство ввода.
а вот "поле куда нужно встать" прежде чем "пикнуть", не очень отличается от ввода вручную, 13 цифр хороший оператор успевает набрать тогда быстрее чем с товара сканером со сканировать.  удобство нивелируется.

> на клаву, или на сканер, без разницы....
только на клаву. т.к. после подключения сканера "в разрыв" для устройства также не будет разницы между данными устройств... и как поймешь "ху из ху"?

но вообще бессмысленно. т.к. вся проблема в неорганизованности, люди не знают как работает/чего хотят, покупают не то что нужно(или в моем случае было отгружают...), а после это хотят решить программно... т.е. попросту делают и переваливают проблему на программистов.
в общем никто твой переходник покупать не будет, но все также будут ожидать, что все должно работать "само". (да блин, посмотри выше там даже устройство не настраивают, на предмет посылки #13 в конце, а делают различные реализации ввода в программе... нонсенс)


 
sniknik ©   (2011-10-25 08:06) [84]

> если в варианте "нажатие на кнопку клавиатуры шлет битик в усб"
в связи с виндовой событийностью, и ее не реал таймом, битик в  в усб может уже поменяться в тот момент когда идет чтение символа программой... неопределенность остается.


 
Anatoly Podgoretsky ©   (2011-10-25 10:07) [85]

> Laguna  (25.10.2011 00:11:05)  [65]

4500 и только в одном месте решили два эдита


 
Laguna ©   (2011-10-25 11:00) [86]

> Anatoly Podgoretsky ©   (25.10.11 10:07) [85]

> Laguna  (25.10.2011 00:11:05)  [65]4500 и только в одном  месте решили два эдита


Не совсем понятна мысль


 
Inovet ©   (2011-10-25 11:58) [87]

> [77] KilkennyCat ©   (25.10.11 02:09)
> можно сделать небольшой переходничек на клаву, или на сканер,
> без разницы.... будет генерить дополнительно че-нить или
> генерить в усб 232 или куда угодно...

Тогда зачем его делать переходником - пусть включается в эти порты и шлёт всё туда, а клавиатура сама по себе.


 
Anatoly Podgoretsky ©   (2011-10-25 13:45) [88]

Ты решил проблему для 4500 пользователей, путем создания 2 эдитов :-)


 
Laguna ©   (2011-10-25 13:55) [89]


> Ты решил проблему для 4500 пользователей, путем создания
> 2 эдитов :-)


Нет, путем создания программы, в которой используется функция сканирования посредством двух Edit.


 
Anatoly Podgoretsky ©   (2011-10-25 14:11) [90]

> Laguna  (25.10.2011 13:55:29)  [89]

Брехология


 
Труп Васи Доброго ©   (2011-10-25 16:21) [91]

Вот хоть убей - не пойму зачем ДВА едита? Что мешает использовать ОДИН? Чтобы проще было понять опиши ситуацию ошибки при вводе в один едит, тогда будет ясно (может быть) чего ты пытаешься избежать.


 
Труп Васи Доброго ©   (2011-10-25 16:37) [92]


> Сейчас пересматривал возможность перехода к одному Edit.
>  Оказывается не зря все же я делпал разделение ввода. При
> считке сканером к примеру билет читается как серия + номер+
> индекс. Приручном вводе поля ввода разделяются(в другой
> задаче). Здесб же нужно вводить только номер + индекс.

Опять нет никакой проблемы с одним едитом. Сканер введёт (количество от балды) 20 символов, а юзер только 10. И какая проблема? Если длина текста 20, то хватай и обрабатывай как "серия + номер+ индекс", если же их меньше, то юзер полюбасу энтер тыкнет, это тебе сигнал что "не сканер вводил", проверь количество и обрабатывай как "только номер + индекс". Вот и всё решение. Даже если юзер пробъёт все 20 цифр, то код сработает и энтер жать не придётся. А ты геморрой изобретаешь. Надо будет что гениально-простое, обращайся!


 
Laguna ©   (2011-10-25 16:51) [93]


> Опять нет никакой проблемы с одним едитом. Сканер введёт
> (количество от балды) 20 символов, а юзер только 10. И какая
> проблема? Если длина текста 20, то хватай и обрабатывай
> как "серия + номер+ индекс", если же их меньше, то юзер
> полюбасу энтер тыкнет, это тебе сигнал что "не сканер вводил",
>  проверь количество и обрабатывай как "только номер + индекс".
>  Вот и всё решение. Даже если юзер пробъёт все 20 цифр,
> то код сработает и энтер жать не придётся. А ты геморрой
> изобретаешь. Надо будет что гениально-простое, обращайся!
>

А если введено не 7 положенных от руки , а 6? На "ручном" Edit стоит
 if Length(NomEdit.Text) = KolDigit then
  PostMessage(Handle, WM_NEXTDLGCTL, 0, 0);

Дабы исключить лишнее клацанье по ентер. Чтобы уменьшить телодвижения при вводе(а этого ой как боятся дамы бальзаковского возраста), перед сканированием билетов я сперва отдельно запрашиваю номер серии. Затем в "ручном" режиме вводится только номер + индекс.[45] Сканер же все вместе возьмет. Конечно можно сделать проверку на количество введенных символов(если меньше чем нужно) Короче, нужно пробывать.


 
Игорь Шевченко ©   (2011-10-25 20:40) [94]


> перед сканированием билетов


трамвайных ?


 
KilkennyCat ©   (2011-10-25 22:44) [95]


> Inovet ©   (25.10.11 11:58) [87]

>
> Тогда зачем его делать переходником - пусть включается в
> эти порты и шлёт всё туда, а клавиатура сама по себе.


мой вариант не потребует переделки уже существующего софта. он лишь дополнит девайс, все штатные функции сохранены.


 
Труп Васи Доброго ©   (2011-10-26 00:16) [96]


> А если введено не 7 положенных от руки , а 6? На "ручном"
> Edit стоит
>  if Length(NomEdit.Text) = KolDigit then
>   PostMessage(Handle, WM_NEXTDLGCTL, 0, 0);
> Дабы исключить лишнее клацанье по ентер.

Вот сразу видно, что ты с людьми не много работал. Дамы с великим удовольствием давят Enter, к тому же нажав Enter юзер подтверждает, что он ввёл номер полностью. Дальше уже твоя работа обрабатывать данные и проверять их на валидность. Вопрос "А если введено не 7 положенных от руки , а 6?" может возникнуть (извини за прямоту) у человека который только начинает учиться писать программы. (И два Edita для одной информации лишнее тому подтверждение) Проверь что ввели и маякни юзеру что "не всё ввёл", тем же едитом и поморгай или меняй цвет заливки Edita, когда будет нужное количество символов, чтобы даже неопытный юзер понял, что всё ОК. Потом они сами привыкнут не тыкать Enter, пока Edit не покраснеет. А проверяя на автомате, без подтверждения юзера по нажатию Enter рискуешь нарваться на проглатывание случайного нажатия кнопки или залипания или "я постоянно эту кнопку ногтем задеваю, у меня маникюр", а твой код радостно схавает эти 7 цифр и потащит на обработку. Ты не даёшь юзеру возможность исправить ошибку ввода, а это "боком чревато". Надеюсь понял.


 
Германн ©   (2011-10-26 00:58) [97]


> мой вариант не потребует переделки уже существующего софта.
>  он лишь дополнит девайс, все штатные функции сохранены.
>
>

Он лишь предоставит программисту новые возможности, которые заставят программиста писать новое ПО. Ибо ему, этому программисту, только дай дополнительные возможности! Но если программист "заточен" на известную ему "юзабилити" и "шаг вправо, шаг влево - расстрел на месте" для него норма. Что тогда?


 
brother ©   (2011-10-26 05:44) [98]

Все имхо:
1. 2 едита для ручного и сканрного ввода - перебор, достаточно одного с нужными проверками
2. Забыли про очередь сообщений окну
3. Не вижу демо кода для проверки нажатия клавиш и приходов сообщений контролу
4. Сканерами не пользовался но, скорость ввода символов через сканер как то ограничена (скорость ввода, задержки между "клавишами")?
5. Зачем спорить если вопрос в начинающих и кода нет?


 
Laguna ©   (2011-10-26 09:45) [99]

> Труп Васи Доброго ©   (26.10.11 00:16) [96]


> Вот сразу видно, что ты с людьми
> не много работал. Дамы с великим удовольствием давят Enter,
>  к тому же нажав Enter юзер подтверждает, что он ввёл номер
> полностью.

Не скажи. У нас такие дамы, что хотят чтобы программа выполняла действия только от ожного их взгляда на монитор.

> Дальше уже твоя работа обрабатывать данные и
> проверять их на валидность. Вопрос "А если введено не 7
> положенных от руки , а 6?" может возникнуть (извини за прямоту)
> у человека который только начинает учиться писать программы.
>  (И два Edita для одной информации лишнее тому подтверждение)
> Проверь что ввели и маякни юзеру что "не всё ввёл", тем
> же едитом и поморгай или меняй цвет заливки Edita, когда
> будет нужное количество символов, чтобы даже неопытный юзер
> понял, что всё ОК. Потом они сами привыкнут не тыкать Enter,
>  пока Edit не покраснеет.

В принципе я согласен.
А идея с контрольной подсветкой едита во время ввода мне понравилась.

> А проверяя на автомате, без подтверждения
> юзера по нажатию Enter рискуешь нарваться на проглатывание
> случайного нажатия кнопки или залипания или "я постоянно
> эту кнопку ногтем задеваю, у меня маникюр", а твой код радостно
> схавает эти 7 цифр и потащит на обработку. Ты не даёшь юзеру
> возможность исправить ошибку ввода, а это "боком чревато".

После едита стоит подтверждающая кнопка ввода, по нажатию на которую и выполняется проверка введенных данных с последующим сохранением. "Автомат" просто переводит на ее после того, как введено определенное количество знаков и только. Т.е. подредактировать введенную информацию возможность предоставляется.
http://s45.radikal.ru/i109/1110/74/c64733172f67.jpg
Т.е. автомат исключает повторный клац по Ентеру и всего то.


 
Труп Васи Доброго ©   (2011-10-26 10:23) [100]

Чем меньше надо тыкать кнопок мышью, тем лучше. Рука у юзера не отрывается от клавы. Я 7 лет отработал в ЖКХ конторе, так что кто такие дамы из бухгалтерии и абонентского отдела и как они могут работать я тоже в курсе. Сначала они по одной кнопке в минуту тычут, а потом приноровятся и так пальцами перебирают при разноске квитанций, что аж ветер вокруг, по 1500 квитанций в день лупили! Тот, кто бьёт много цифр будет счастлив, если ему вообще не придётся хвататься за мышь. Сначала может и будут ныть что непривычно, но потом будут тебе руки целовать за хорошую, удобную программу.


 
Laguna ©   (2011-10-26 11:11) [101]


> Чем меньше надо тыкать кнопок мышью, тем лучше. Рука у юзера
> не отрывается от клавы.
>...
Тот, кто бьёт много  цифр будет счастлив, если ему вообще не придётся >хвататься  за мышь. Сначала может и будут ныть что непривычно, но потом
> будут тебе руки целовать за хорошую, удобную программу.


Так вот автомат у меня так и отробатывает. Переводит на кнопку, нажали ентер, данные обработались -  фокус опять перешел на поле ввода, вводим следующие данные. и так по кругу. Потом закрываем режим ручного ввода одним кликом мыши. Как то так.


 
Труп Васи Доброго ©   (2011-10-26 11:35) [102]


> Переводит на кнопку, нажали ентер, данные обработались -
>   фокус опять перешел на поле ввода,

ЗАЧЕМ?!?!?!?
КТО МЕШАЕТ нажать Enter НЕ ВЫХОДЯ из Edita???? Ты создал лишнюю кнопку, лишний обработчик перевода фокуса и т.д. Это лишнее. Как ты там говоришь? "А если..." ввели 7 цифр, фокус ушёл на кнопку, а юзер понял, что цифра не та и её надо исправить, как юзер вернёт фокус? Ему надо рукой перевести мышь на Edit и тыкнуть, то есть лишние действия!!!


 
Anatoly Podgoretsky ©   (2011-10-26 14:17) [103]

> Труп Васи Доброго  (26.10.2011 11:35:42)  [102]

Что бы нажать кнопку Enter, фокус менять не требуется и даже писать
программу.


 
Laguna ©   (2011-10-26 14:39) [104]


> Ему надо рукой перевести мышь на Edit и тыкнуть, то есть
> лишние действия!!!

Мдя... есть такое дело. Впринципе Все основная обработка проискодит в Edit1. Все, здаюсь, согласен, что второй Edit лишний. Обязуюсь переписать без него, как тока время появится. Всем спасибо. Тему можно закрывать.


 
Труп Васи Доброго ©   (2011-10-26 14:39) [105]


> фокус менять не требуется и даже писать
> программу

Дак и я о том же!!! Там вообще эта кнопка не нужна! Об этом и пытаюсь камраду сказать. А он мало того, что кнопку, он ещё и второй Edit поставил, хотя можно только одним Editом обойтись.



Страницы: 1 2 3 вся ветка

Текущий архив: 2012.02.05;
Скачать: CL | DM;

Наверх




Память: 0.81 MB
Время: 0.009 c
15-1318797003
Юрий
2011-10-17 00:30
2012.02.05
С днем рождения ! 17 октября 2011 понедельник


15-1318916274
Mamed
2011-10-18 09:37
2012.02.05
TQRPExpr+Unicode


15-1318624203
Юрий
2011-10-15 00:30
2012.02.05
С днем рождения ! 15 октября 2011 суббота


2-1319921661
samsung
2011-10-30 00:54
2012.02.05
Поиск в Memo


2-1319647986
Крококо
2011-10-26 20:53
2012.02.05
как получить адрес днс-сервера НА КОМПЬЮТЕРЕ?