Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Ввод в TЕdit руками или сканером штрихкода. [D7, XP]


Страницы:   1 2 3 4 5 6

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]

нефиг вообще туда пастить :)


Страницы:   1 2 3 4 5 6

Наверх

Титульная страница Поиск, карта сайта Написать письмо