Odczyt kodu kresowego czytnikiem + wyświetlenie automatyczne nowej formy

Odczyt kodu kresowego czytnikiem + wyświetlenie automatyczne nowej formy
J0
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 82
0

Cześć.
Potrzebuję odczytać kod kreskowy, który będzie odczytywany czytnikiem. Po odczytaniu kodu musze wyświetlić automatycznie nową formę z informacjami z bazy danych.
Zrobiłem to tak, że odczytuję kod do kontrolki TEdit i na zdarzeniu TEdit.OnChange wyświetlam nową formę z informacjami.

Niestety tu jest problem ponieważ jeśli zaczytuję np kod 068031 to w TEdit pojawia się tylko pierwszy znak (w tym przypadku znak "0") i natychmiast jest wywoływana nowa forma a ja muszę pozyskać cały kod.
Próbowałem to samo na TEdit.KeyUp ale efekt jest taki sam.

Można zaczytać kod i dopiero na zdarzeniu TEdit.OnExit kontynuować, ale to wymaga dodatkowo użycia klawiatury lub myszki a chciałbym to pominąć.

W jaki sposób mogę odczytać cały kod i automatycznie wyświetlić nową formę z tym kodem?

cerrato
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Poznań
  • Postów: 9018
1

Ciężko coś poradzić nie widząc kodu, ale pierwsza rzecz, jaka mi przychodzi do głowy to skorzystanie z jakiegoś timera. Rozumiem, że czas od rozpoczęcia wpisywania (czyli wprowadzenia pierwszego znaku) do zakończenia procesu wstawiania cyfr to jest jakiś ułamek sekundy, prawda? W sensie - z punktu widzenia obserwatora to kod się po prostu wstawia, nie ma że np. co sekundę albo 2 wskakuje kolejna cyfra. Mam rację?

W takim razie zrobiłbym to jakoś tak:

  • po wprowadzeniu pierwszego znaku odpalasz timer na powiedzmy 500ms.
  • przy kolejnym znaku sprawdzasz i jeśli timer jest aktywny - nie robisz nic
  • zakładając, że (jak pisałem powyżej) wprowadzenie kodu z czytnika idzie bardzo szybko, zanim timer się wykona, to już cały kod będzie w kontrolce TEdit
  • w reakcji na timer - blokujesz edycję kontrolki (żeby przypadkiem ktoś czegoś nie kliknął i nie zmienił kodu) plus wywołujesz to, co chcesz. W sensie - masz cały kod (a nie pierwszą cyfrę) więc możesz działać.
J0
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 82
0

@cerrato wszystko dobrze zrozumiałeś o co mi chodzi. Dziękuje Ci za podpowiedź. Ja kombinowałem coś z timerem ale mi nie wychodziło, ale jak zrobiłem według Twojej podpowiedzi to teraz mi działa!

GS
  • Rejestracja: dni
  • Ostatnio: dni
3

W większości skanerów można zdefiniować dodatkowy znak doklejany na końcu odczytanego kodu np. #13.

Kopiuj
procedure TFMForm.EditKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if key=vk_return then
    begin
      //jakieś akcja
    end;
end;
cerrato
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Poznań
  • Postów: 9018
0

i TEdit i na zdarzeniu TEdit.OnChange wyświetlam nową formę

I jeszcze taka jedna uwaga/sugestia. Wprawdzie nie dotyczy bezpośrednio problemu, z którym się zgłosiłeś, ale warto o tym wspomnieć.
Niestety, wielu programistów Delphi (i ogólnie - technologii "wyklikiwanych") ma tendencję do wrzucania logiki aplikacji do zdarzeń OnCoś-tam. I to jest błąd.
Zasadniczo - powinna być osobna funkcja, która odpowiada za wykonanie określonych czynności. A w odpowiedzi na TEdit.OnChange jedynie wywołujesz tę funkcję i nic więcej nie robisz.

Dlaczego?

  • co, jeśli za jakiś czas zmienisz kontrolkę - z TEdit1 na TEdit2 albo w ogóle na kontrolkę innego typu?
  • co, jeśli będziesz chciał wykonać akcję otwarcia kartoteki towaru z innego poziomu, niż reakcja na czytnik kodów?
  • separacja logiki od elementów na formatce dotyczy także wartości/zmiennych, na których operujesz. Złe jest przetwarzanie bezpośrednio wartości Edit1.Text, zamiast tego ta wartość powinna zostać odczytana i przypisana do jakiejś zmiennej, albo przekazana jako parametr do funkcji ją przetwarzającej

W większości skanerów można zdefiniować dodatkowy znak doklejany na końcu odczytanego kodu np. #13.

A potem ktoś podepnie inny skaner - bo się zepsuł i używamy tymczasowego, bo wymiana sprzętu, bo w innym dziale jest skaner, który nie umożliwia konfiguracji terminowania ciągu i zaczną się cuda - tu działa, tam nie działa, nikt nie wie o co chodzi, trzeba coś zmieniać w ustawieniach skanera albo w aplikacji (albo opcja do konfiguracji, albo rekompilacja). Także - pomysł fajny, ale ja osobiście nie polecam iść w tym kierunku, bo jeśli można obejść to inaczej, to nie stwarzajmy sytuacji, które mogą generować potencjalne problemy.

ZK
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10
0

Też mam to na timerze z tym ze restartuje timer na zdarzeniu on change tedit. Dopiero w zdarzeniu timera szukam calych zaczytanych danych z czytnika.

PD
  • Rejestracja: dni
  • Ostatnio: dni
2

Timer jest nie najlepszym pomysłem, bardzo dobrze podpowiedział @grzegorz_so - każdy czytnik (wszystkie z którymi miałem do czynienia) ma domyślnie ustawiony sufix na #13 więc właśnie otrzymanie w TEdit char(13) powinno wyzwalać obsługę.

GS
  • Rejestracja: dni
  • Ostatnio: dni
3

@cerrato
Rozwiązanie z timerem nie jest dobre.
Wystarczy że użytkownik dwukrotnie w małym odstępie czasu zeskanuje tan sam kod i zamiast 13 znaków kodu EAN13 mamy 26 znaków.
Rozwiązanie ze znakiem terminującym wczytany kod eliminuje ten problem.
Do tego skaner może wprowadzać, konfigurowalne w skanerze, opóźnienia czasowe pomiędzy poszczególnymi znakami, więc należy zadbać o właściwe dobranie w aplikacji czasu bezczynności skanera, po którym można uznać że to koniec odczytu.
W swoich aplikacjach, z dobrym rezultatem, stosuję rozwiązanie ze znakiem terminującym odczytany kod. Rozwiązanie z timerem może generować mnóstwo problemów .

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.