Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Trabajar con Scanner de código de barras (https://www.clubdelphi.com/foros/showthread.php?t=54284)

Flecha 13-03-2008 10:02:04

Trabajar con Scanner de código de barras
 
Hola a todos.

Tengo varias preguntas, todas algo complejas, y todas en torno a trabajar con Scanners de códigos de barras.

Hasta ahora, para leer el código de barras me ha bastado con poner en el form un TEdit (por ejemplo), dejar en él el foco, y entonces leer el código de barras con el Scanner. El código leído se refleja en el TEdit como si lo hubiese tecleado. Pero necesito leer el código de barras prescindiendo de TEdit y similares. Es decir: Necesito capturar la entrada del dato desde el Scanner sin utilizar el truco del foco sobre un TEdit o similar. ¿Puede hacerse algo similar al trabajo con sockets y el TServerSocket? Eso me vendría de perlas.

Los Scanners (porque son varios) con los que estoy, se conectan todos al PC por puerto USB:
  • ¿Hay alguna manera de detectar el momento en el que alguien conecta el Scanner al PC? ¿Puedo saber exactamente a qué puerto del PC se ha conectado para capturarlo e intentar lo de la captura de entrada de datos?
  • Suponiendo que puedo detectar el momento en el que algo se conecta al PC por puerto USB, ¿puedo saber si lo que se ha conectado al puerto USB es un Scanner de código de barras u otro dispositivo distinto?
  • Y para seguir con el hilo de preguntas, ¿se puede detectar el momento en el que alguien desconecta el dispositivo del puerto USB?
  • Si alguien conectara dos Scanneres de códigos de barras al PC ¿hay algún modo de diferenciar la entrada de datos de cada uno de ellos?
Y por último. Todas las preguntas son sobre Scanners que se conectan al PC por puerto USB. ¿Habría alguna diferencia respecto a Scanneres que se conecten al PC por otro tipo de puerto (por ejemplo un puerto serie)? Lo pregunto por si me tocara modificar el programa en el futuro utilizando ese otro tipo de Scanneres, o por si simplemente el cable de conexión se estropeara y tubieramos que cambiarlo por otro que se conecte al serie en vez de al USB.

Muchas gracias de antemano.

Neeruu 14-03-2008 01:04:22

Trabajar con Scaneres de codigo de barra
 
Hola como estas??

Mira he trabajdo con Scaneres pero por curiosidad por que no quieres capturar en un Tedit lo que trae el Scaner..

Tambien podrias hacer que el formulario lo capte poniendo la propiedad KeyPreview en true.

Por lo que tengo entendido el Lector simula ser un teclado para la PC y asi poder escribir los datos por ejemploi en un Tedit, porque si prestas atendion lo va escribiendo de a uno a cada nro

por ejemplo

si leo este codigo 1000 2154 7846 4587

No aparecera todo el codigo escrito de una sola vez

sino que ira agregando de a una como si lo escribieras desde el teclado
por lo tanto si no quieres ocupar un Tedit podrias capturar las entradas que vienen desde el teclado(esto no lo proble pero podria andar)

Saluda Atte Neeruu :)

AzidRain 14-03-2008 01:27:13

Tendrías que hacer un manejador para los eventos del teclado como OnKeyPress o OnkeyDown para procesar los "teclazos" que manda el escaner. Si lo que no quieres es que se muestre el Tedit.

Flecha 17-03-2008 15:50:15

Hola.
Ante todo muchas gracias por contestar. :)

Quiero prescindir del TEdit y similares porque el código leido por el scanner no debe aparecer visible en pantalla. Sin embargo, para que un TEdit, o similar, recoja lo leído por el scanner, dicho objeto debe estar:
- con Visible a True,
- con Enabled a True,
- y con el foco de la aplicación en dicho objeto

Una primera solución podría ser poner el TEdit por detrás ("Send to Back") de otros objetos (por ejemplo, un TPanel), y así no sería visible para el ojo humano. Pero es muy posible que el usuario esté tocando en otras partes del TForm haciendo que el foco vaya de un lado para el otro y que nunca esté donde yo necesito que esté (en el TEdit que recoge lo leido por el Scanner). Y además en el TForm hay otros TEdit y TDBEdit con otro tipo de información. Tampoco combiene que por error se pegue en uno de esos objetos la información leida por el scanner.

El usuario dispone de teclado y ratón para "jugar" en el TForm todo lo que quiera. Por eso necesitaría distinguir la entrada del Scanner de la entrada del teclado.

Todo control de eventos que ponga (KeyPreview:=True, o configurar OnKeyPress y/o OnKeyDown) también saltará cuando el usuario toque el teclado, y no tendré manera de distinguirlo de la entrada por Scanner.

La solución ideal creo que sería capturar la entrada del Scanner a nivel de puerto.

¿Alguna idea de cómo hacerlo? :confused:

Muchas gracias de nuevo.

Fenareth 17-03-2008 18:19:06

Hola, tal vez sea una solución un poco tonta pero no has pensado en poner un caracter que omita las letras y/o números que lea el scanner ???, algo así como cuando pones un Edit para escribir contraseñas...:rolleyes:

Sé que no es lo que pides pero me pareció una idea aceptable si lo que quieres es que lo que lea el scanner no se "vea" por el usuario... podrían solo ver asteriscos o puntos o cualquier otra cosa... :o

Saludos,

Neeruu 17-03-2008 23:12:21

Trabajar con Scaner de codigo de barra
 
Hola lo que podrias hacer es asignar una tecla especial para que ingrese el codigo de barra, por ejemplo que presione la tecla 'F1' y que se abra una ventanita con un TEdit y si quiere cancelar la lo ingresado que presione escape para cerrar la ventana!!!!!


En caso de que ingrese el codigo de barra, programas el caracter de fin de intruccion y lo usas para saber que termino de escribir el codigo de barra, y de ahi ya tienes tu codigo y puedes hacer lo que quieras!!!!

No se!!! esa podria ser una solucion!!! tambien nose pero creo que con tienen caracteres de fin de intruccion( o sea que indican que termino el codigo) tambien tienen caracteres de inicio, asi podrias asignar un caracteres medio raro y poder detectarlo despues... de esto no estoy seguro y no tengo ningun manual a mano...

Si decides algo avisa... por curiosidad haber como quedo

Saluda Atte Neeruu :)

Flecha 18-03-2008 13:01:05

Gracias de nuevo.

Las ideas son buenas, pero ya las había tenido en cuenta, y os aseguro que la mejor opción que sigo encontrando es la de intentar capturarlo a nivel de puerto.

Yo también he trabajado anteriormente con Scanners de códigos de barras y todo es mucho más sencillo de como lo estoy planteando ahora. El problema es que en este caso en concreto necesito hacer algo distinto.

El PC interpreta la entrada por Scanner como si fuese una entrada por teclado, y además sin distinguir entre el uno y el otro. Lo que yo necesito es que el PC diferencie entre la entrada por teclado y la entrada por Scanner.

Si consigo algo, os lo comentaré. Si no, pues ya veré qué me invento, y sobre todo, a ver si convencemos al usuario para que sea más flexible.

Un saludo.

jcarteagaf 18-03-2008 16:00:57

Controlar lector USB
 
Hace algun tiempo hice una aplicación en la que necesitaba controlar a un lector USB de tarjetas magneticas (credito, debito), no venia con ningun controlador y pude hacer interface usando el componente JvHidDeviceController de las librerias Jedi. Funciono para mi.

Espero que te sirva

Saludos.

Flecha 18-03-2008 17:55:50

Cita:

Empezado por jcarteagaf (Mensaje 273921)
Hace algun tiempo hice una aplicación en la que necesitaba controlar a un lector USB de tarjetas magneticas (credito, debito), no venia con ningun controlador y pude hacer interface usando el componente JvHidDeviceController de las librerias Jedi. Funciono para mi.

Espero que te sirva

Saludos.

¿Dónde puedo encontrar ese componente y esa librería?
Yo estoy con Delphi 6. ¿Es de algún Delphi superior, o es una librería externa a Delphi?

Muchas gracias.

jcarteagaf 18-03-2008 20:15:50

Librerias JEDI
 
Las JEDI son un conjunto de Componentes (mas de 300) gratuitos que puedes encontrarlos en su pagina de SourceForge. Constan de los JVCL (que son los componentes) y las JCL que son librerias de codigo. Para poder utilizarlos debes instalar ambos (primero las JCL). Cada uno viene con un install que hace practicamente todo.

Espero que te sirva. Saludos.

Flecha 19-03-2008 10:20:57

Algo me dice que ya no son gratuitos, o que algo ha cambiado desde que lo utilizaste. :(
He entrado en el link y después en Download, y esto es lo que me encuentro:


No File Packages Defined

This project has not yet created any file release packages.

Neeruu 19-03-2008 17:00:21

Trabajar con Scanner de código de barras
 
Hola yo tengo las Jedi dime donde te las puedo mandar!!!!


No se si se puede hacer esto en el foro, sino se puede perdon!!!


Saluda Atte Neeruu :)

Flecha 25-03-2008 15:13:02

Cita:

Empezado por Neeruu (Mensaje 274137)
Hola yo tengo las Jedi dime donde te las puedo mandar!!!!


No se si se puede hacer esto en el foro, sino se puede perdon!!!


Saluda Atte Neeruu :)

No sé si habrá algún problema. Por mi parte, no.
Puedes mandármelo a g4-0b@hotmail.com

Muchas gracias.
Ya contaré qué tal me ha ido.

MaMu 29-03-2008 21:58:26

Yo pienso una posible solución, es hacer un Hook para el teclado, y la única distinción entre el ingreso por teclado por parte del usuario, respecto del enviado por el lector, es la velocidad, claro está, mucho más rápida esta última.
Con respecto a acceder directamente al puerto, (0x060) tiene el conflicto de necesitar establecerse por driver, a nivel del kernel, ya que XP no lo permite de otra forma, y habría que convertir la data binaria al formato que quieras.
Yo particularme prefiero el método mediante un Hook, tipo TKeyboardHook, ya que todos los lectores CCD, tienen la carecterística de definir el caracter terminal, pudiendose utilizar éste para la distinción usuario/lector.
Los lectores que emulan teclado son los más económicos, pero tienen sus limitaciones. Fueron creados con el fin de satisfacer terminales TPV, donde la mayoría de los casos, por no decir todos, siempre tienen un elemento con el foco, como en tu caso, un TEdit.

Saludos

MaMu 30-03-2008 19:41:37

Porbando lo que decias, a nivel de Puerto, hice este ensayo:

- Colocando 2 Memos en un form, y haciendo uso de esta dll
http://logix4u.net/Legacy_Ports/Para...000/NT/XP.html

Código Delphi [-]
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;
type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Memo2: TMemo;
    procedure Memo1KeyPress(Sender: TObject; var Key: Char);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
function Inp32(wAddr:word):byte; stdcall; external 'inpout32.dll';
function Out32(wAddr:word;bOut:byte):byte; stdcall; external 'inpout32.dll';

{$R *.dfm}
procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char);
var leido:byte;
begin
  leido:=Inp32($060);
  Memo1.Text:=(IntToStr(leido));
  case leido of   //por cada código
    2: begin
          memo2.Text:=memo2.Text+IntToStr(leido-1);
        end;
    3: begin
          memo2.Text:=memo2.Text+IntToStr(leido-1);
        end;
end;
end;
end.

Me resulta bastante incómodo, por 2 razones. Se mezclan flags de la INT33 (mouse) con el Port 0x060 del teclado PS/2, por lo que un simple clic (Flag Dx) altera el curso del Port 0x060, efecto no deseable pero tratable. Y lo más
molesto, es que si cronometrás el evento en cada KeyPress, el envío del scanner CCD equivale a mantener presionada una tecla, es decir tener un KeyDown siempre en true, aunque visualmente no lo parezca, pero las mediciones manda. Voy a seguir viendo o mejor dicho encontrando una forma de distinguir entre Usuario y Scanner CCD, pienso que el quiz está en el Buffer del teclado, Probaste mantener una tecla presionada o presionarla justo en el mismo momento que el scanner envia el dato?

Saludos

firestone2 16-12-2009 01:14:05

Lo mas sencillo para lo que intentabas hacer, (porque sopungo que ya pudiste ya que ni tiene continuidad este hilo) es usar un lector de codigos de barras serial, y desde delphi siempre sabes desde que puerto vienen la entrada y no es visible al usuario

yapt 26-12-2009 17:58:24

Yo seguiría el camino que te ha indicado firestone2.

Alguna vez he configurado escaneres de codigo de barras USB como SERIAL y he recogido la entrada vía COMx, sin presentar nada en pantalla.

Incluso, en una ocasión, leia (sin mostrar nada al usuario) el código de barras y lo pasaba a un servidor UDP a la escucha en un Terminal Server. El usuario no se enteraba de nada, salvo que el producto aparecía en su pantalla de la aplicación corriendo en Terminal Server.

Para eso:
1.- Configuraba el puerto USB como COMx.
2.- Utilizaba el componente de PSoft. www.psoft.sk (que incluye un lector de codigo de barras bastante bueno).

Aunque quizá puedes utilizar otro lector de COMx. Si alguien conoce alguno, agradeceré comentarios al respecto. :)

Saludos.


La franja horaria es GMT +2. Ahora son las 05:45:52.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi