Skanowanie kodów kreskówych

0

Robię okno do obsługi kodów kreskowych.
Na formie mam niewidoczny Edit. Na jego zdarzeniu OnKeyPress sprawdzam czy zeskanowany znak = #13 (czyli koniec numeru kreskowego) i obsługuję ten kod.
Oczywiście fokus musi być cały czas na tym edicie.
Te wszystkie zeskanowane kody wpisuję kolejno do StringGrida. Ale jeśli użytkownik chciałby kliknąć na tego StringGrida to wtedy Edit straci Fokusa. Oczywiście użytkownik musi mieć możliwość klikania na StringGrida ale nie chcę pokazywać tego Edita żeby użytkownik musiał tam umieścić kursor przed każdym skanowaniem kodu.

Chciałbym aby ktoś podsunął pomysł, jak to elegancko oprogramować,aby skanując kolejne kody działało tak jakby fokus był na tym edicie.

0

W czytniku kodów kreskowych należy zaprogramować prefix, a w aplikacji np. w onkeydown sprawdzać czy wyciśnięty klawisz to właśnie ten prefix, i jeżeli tak to należy zapisywać do zmiennej wszystkie znaki do momentu, aż wykryjesz sufix (domyślnie enter), a później zawartość tej zmiennej dodaj do grida

1

zmień sposób pracy czytnika na RS-owy i nie będziesz miał takiego problemu

0

Ale to musi być akurat ukryty Edit? Czemu tak?

0

Niekoniecznie musi być ukryty edit.
Pop prostu nie chcę zmuszać użytkownika do klikania w to pole żeby odczytać zeskanowane znaki.
Chciałbym żeby to działało niezależnie na jakim komponencie jest fokus.

0

To może spróbuj załatwić to przez obsługę stosownych komunikatów?

To ma wyglądać tak, że "akcja" ma się pojawiać automatycznie zaraz po zeskanowaniu kodu, czy też użytkownik ma coś jeszcze (ręcznie) robić po drodze?

1

@Crow miałeś kiedykolwiek skaner kodów w ręce? Masz pojęcie jak on działa? Zdajesz sobie sprawę, że przy skanerze w trybie klawiaturowym nie jesteś w stanie odróżnić czy dany znak pochodzi ze skanera czy z klawiatury? I jakie to są te stosowne komunikaty wg ciebie?

@Krzywy Ogrodnik jak już pisałem wyżej, na skanerze w trybie klawiaturowym nie jesteś w stanie osiągnąć takiego działania jakie byś chciał. To załatwi skaner na USB albo RS232 - jeśli skaner masz podłączony przez port klawiatury to jedynie wymiana na coś nowszego, jeśli przez USB to książeczka w dłoń i zmień jego ustawienia

0
abrakadaber napisał(a):

miałeś kiedykolwiek skaner kodów w ręce?

Tak.

Masz pojęcie jak on działa?

Nie.

Zdajesz sobie sprawę, że przy skanerze w trybie klawiaturowym nie jesteś w stanie odróżnić czy dany znak pochodzi ze skanera czy z klawiatury?

Nie.

I jakie to są te stosowne komunikaty wg ciebie?

Nie wiem. Chcę przede wszystkim dowiedzieć się, jaki efekt autor tematu chce osiągnąć (bo nie do końca rozumiem). Gdy zrozumiem, może będę w stanie cokolwiek doradzić.

0

Jaki efekt chcę osiągnąć?
Mając fokus na dowolnym komponencie skanuję kod kreskowy i go przechwytuję.
Myślałem żeby przechwytywać to w osobnym wątku czy coś.
Liczę na propozycje.

0

A jak odbywa się komunikacja skaner - program?

Zeskanowanie kodu program odbiera tak, jakby coś zostało wklepane z klawiatury czy w jakiś inny sposób?

Jeżeli odbiera to jako zwykłe znaki z klawiatury, to może mógłbyś założyć hooka i przechwytywać wszystkie znaki, a potem wyszukiwać w nich jakiegoś znaku szczególnego (np. tego #13) i na tej podstawie oskryptować różne akcje?

0

w większości skanerów da się wy-programować #13, w skanerach firmy Symbol w ramach instrukcji obsługi jest opis jak to ustawić (za pomoc skanowania kodów sterujących)

0

@Pele2, da się to zrobić tak jak chcesz za pomocą komunikatów.

Musisz zrobić sobie oprogramowanie zdarzenia Application.OnMessage. Podpinasz do tego zdarzenia procedurę np.:

procedure DoOnApplicationMessage(var Msg: TMsg; var Handled: boolean);
begin
// tutaj dla kodów które wysyła Twój czytnik robisz obsługę
  case Msg.Message of
  begin
     WM_KEYDOWN:
       // sprawdzasz jakie są znaki, przechowujesz w jakimś buforze i jeśli odpowiada to formatowi Twojego kodu kreskowego z #13 na końcu to wykonujesz jakąś akcję
  end;
end;
0

Tylko, że z tego co wiem, to format kodu nie jest stały.

1
Smutny Kret napisał(a):

@Pele2, da się to zrobić tak jak chcesz za pomocą komunikatów.

Musisz zrobić sobie oprogramowanie zdarzenia Application.OnMessage. Podpinasz do tego zdarzenia procedurę np.:

procedure DoOnApplicationMessage(var Msg: TMsg; var Handled: boolean);
begin
// tutaj dla kodów które wysyła Twój czytnik robisz obsługę
case Msg.Message of
begin
WM_KEYDOWN:
// sprawdzasz jakie są znaki, przechowujesz w jakimś buforze i jeśli odpowiada to formatowi Twojego kodu kreskowego z #13 na końcu to wykonujesz jakąś akcję
end;
end;

i przychodzi user, wciska ENTER na klawiaturze i cały misterny plan w pizdu.....

ZROZUMCIE, ŻE SKANER KODÓW KRESKOWY W TRYBIE KLAWIATUROWYM EMULUJE KLAWIATURĘ, CZYLI "WCISKA" KLAWISZE I NIE ODRÓŻNISZ CZY ENTER #13 JEST Z CZYTNIKA CZY Z KLAWIATURY tak samo jak nie odróżnisz czy te 10 znaków przed enterem są z czytnika czy z klawiatury!

user322 napisał(a):

Tylko, że z tego co wiem, to format kodu nie jest stały.

EAN13 ma stały format, ale już np 2z5 czy Code39 nie

0

@user322: to już jest kwestia logiki Twojej aplikacji. W DoOnApplicationMessage jest opisany przykładowy sposób jak można to zrobić nie za pomocą TEdit. Do TEdit, też może Ci użytkownik wpisać coś co nie jest kodem. Możesz np. sprawdzać czy wszystkie podane znaki to cyfry zakończone enterem i dopiero wtedy przyjąć że jest to Twój kod kreskowy.

0
Smutny Kret napisał(a):

Możesz np. sprawdzać czy wszystkie podane znaki to cyfry zakończone enterem i dopiero wtedy przyjąć że jest to Twój kod kreskowy.

tylko, że w kodzie mogą być też litery... I znowu cały misterny plan w pizdu...

0

@abrakadaber: To co wyżej opisałem to jest przykładowy sposób. Nie będę pisał całego algorytmu do rozpoznawania kodu bo nie wiem jaki on jest. To że nie umiesz czytać między wierszami i będziesz się czepiał wszystkiego co nie jest czytnikiem pod RS232 lub USB to już inna sprawa. W pierwszym poście było pytanie o sposób oprogramowania, a nie o wybór czytnika.

0

Nie zrobisz tego za pomocą takiego czytnika. Jedyne, co przychodzi mi do głowy, to sprawdzenie, czy znaki przychodzą z odpowiednią prędkością. Tylko tu rodzi się pytanie, jaka jest ta odpowiednia prędkość. Musiałbyś porobić pewnie jakieś testy, a na koniec i tak by się okazało, że jest użytkownik, który pisze odpowiednio szybko na klawiaturze i wszystko w pizdu. Możliwe dobre rozwiązania:

  1. Kody odczytujesz TYLKO I WYŁĄCZNIE w okienku modalnym
  2. Zakładasz, że użytkownik nie może wpisywać żadnych danych z palca - dzięki temu wszystko, co Ci przychodzi - uznajesz, że przyszło z czytnika. Prawdopodobnie jest to błędne założenie jednak.
  3. Zmieniasz czytnik na taki, który emuluje port COM i świat od razu staje się lepszym miejscem.
0

Pisalem kiedys aplikacje do handlu i to sie robi wlasnie sprawdzajac czas. Przechwytujesz wciskane klawisze i sprawdzasz z jaka szybkoscia sa wprowadzane. Jak minie timeout i w buforze nie znajdziesz kodu to traktujesz to jako znaki od uzytkownika. W skanerze mozna ustawiac szybkosc wysylania znakow ale domyslna szybkosc i tak jest nie osiagalna dla czlowieka

0

A może zrobić coś takiego, jak zmiana trybu wprowadzania? Np. użytkownik wciska jakiś klawisz i wtedy program wie, że teraz lecą inputy ze skanera. Puszcza klawisz albo wciska ponownie i program odczytuje to jako powrót do normalnej klawiatury.

1 użytkowników online, w tym zalogowanych: 0, gości: 1