FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
Lectura de un código de barras vía TMessage
Buenas a todos!
Espero que la pandemia os esté tratando bien! Os pongo un poco en antecedentes, para leer un código de barras a través de un lector yo lo hago vía Messages en VCL, el problema es al migrar esta aplicación a FireMonkey (cosas del cliente), soy incapaz de replicar el funcionamiento. Os pongo un poco de código y os explico, yo en el Main de la aplicación VCL (no dejo abrir la aplicación más de una vez) en el .OnMessage tengo este código, que no hace más que comprobar dos tipos de mensajes, WM_KEYDOWN para apertura de un cajón portamonedas y cambiar el '.' por ',' y comprobar si lo que se pasa es una WM_CHAR entonces ahí procesar el código de barras: Código:
procedure TfrMain.AppOnMessage( var Msg: TMsg; var Handled: Boolean); begin if (Msg.message = WM_KEYDOWN) then begin oMsg.hwnd := Msg.hwnd; oMsg.message:= Msg.message; oMsg.wParam := Msg.wParam; oMsg.lParam := Msg.lParam; oMsg.time := Msg.time; oMsg.pt := Msg.pt; if (Msg.wParam = VK_F9) then begin Handled := True; // le indicamos a windows que lo procesamos // nosotros y no queremos que llege a la aplicación if Assigned(OdaDisplay) then begin try OdaDisplay.ClearDisplay; OdaDisplay.OpenBoxNew; except end; end; end else if Msg.wParam = VK_DECIMAL then begin PostMessage( Msg.Hwnd, wm_Char, Ord(','), 0 ); Handled := True; end else ProcesarMensajeKeyDown( Msg, Handled ); end else if (Msg.message = WM_CHAR) then ProcesarMensajeChar( Msg, Handled, tTimerCodBar, ParmPerfil.PrefijoLectorCodBar, ParmPerfil.SufijoLectorCodBar, ParmPerfil.ForzarUpperCase ); end; Código:
procedure ProcesarMensajeChar( var Msg: TMsg; var Handled: Boolean; tTimer : TTimer; iPrefijo : Integer; iSufijo : Integer; bForzarUC: Boolean ); var iBarType : TBarType; sCaracter : Char; hOwner : Hwnd; iCodigo : Integer; sBuffer : string; i : Integer; oEdit : TEdit; begin if (Msg.message = WM_CHAR) then begin Handled := False; sCaracter := Chr(Msg.wParam); if (iSufijo > 0) or (iPrefijo > 0) then begin if DebugCodBarKeyChar and not DebugCodBarKeyDown then begin if sCaracter <> #0 then BufferCodBar := sCaracter+Format( '%d', [Msg.wParam] )+' '; if Assigned(Screen.ActiveForm) then PostMessage( Screen.ActiveForm.Handle, um_CodBar, 0, Longint( BufferCodBar ) ); Handled := True; end; if not Handled and LeyendoCodBar then begin if sCaracter = Chr(iSufijo) then begin sBuffer := ''; for i := 1 to Length(BufferCodBar) do begin if BufferCodBar[i] = #13 then Continue; sBuffer := sBuffer + BufferCodBar[i]; end; LeyendoCodBar := False; tTimer.Enabled := False; // a veces es nil if Assigned(Screen.ActiveForm) then begin BufferCodBar := TrimRight(sBuffer); PostMessage( Screen.ActiveForm.Handle, um_CodBar, 0, Longint( BufferCodBar ) ); end; end else begin BufferCodBar := BufferCodBar + sCaracter; if Length(BufferCodBar) = 50 then begin LeyendoCodBar := False; tTimer.Enabled := False; if Assigned(Screen.ActiveForm) then SendKeys( PChar(BufferCodBar), True ); // bWait BufferCodBar := ''; end; end; Handled := True; end else if (sCaracter = Chr(iPrefijo)) then begin if LeyendoCodBar then begin if (BufferCodBar > '') and Assigned(Screen.ActiveForm) then SendKeys(PChar(BufferCodBar), True ); // bWait end; BufferCodBar := ''; LeyendoCodBar := True; Handled := True; tTimer.Enabled := True; // no en desarrollo // el sufijo es capturado por el control si esta seleccionado if (Screen.ActiveControl is TCustomEdit) then TCustomEdit(Screen.ActiveControl).SelLength := 0 else if Screen.ActiveControl is TCustomGrid then SetSelectNullGrid( TCustomGrid(Screen.ActiveControl) ); end else if bForzarUC then begin if Assigned(Screen.ActiveControl) then begin if (Screen.ActiveControl is TEdit) then begin oEdit := TEdit(Screen.ActiveControl); if oEdit.CharCase = ecNormal then begin sBuffer := AnsiUpperCase(sCaracter); Msg.wParam := Ord(sBuffer[1]); end; end else if not (Screen.ActiveControl is TCustomMemo) and not (Screen.ActiveControl is TCustomDCMemo) and not (Screen.ActiveControl is TCustomEasyEdit) then begin sBuffer := AnsiUpperCase(sCaracter); Msg.wParam := Ord(sBuffer[1]); end end; end; end; end; end; Ahora ya en FireMonkey me resulta imposible controlar ni siquiera los mensajes que devuelve Windows... He rebuscado y lo que he encontrado es el TMessageManager, con esto puedo hacer SendMessages y leerlo pero no controlo el dónde lo tengo que hacer cuando leo un código de barras. La otra posibilidad es ir controlando objeto por objeto en el KeyDown por si lo introducido es un código de barras, porque solo nos interesan que en dos o tres objetos se pueda hacer una lectura. Con lo fácil que era lo otro :'( Gracias de antemano! Saludos, Quique. |
#2
|
||||
|
||||
Deberías leer estos 2 hilos.
Explican el porqué estás teniendo problemas con los mensajes de Windows en tu aplicación. https://stackoverflow.com/questions/...iremonkey-form https://stackoverflow.com/questions/...ssage-handling Recordemos que la Base de FMX es que es una librería para multiplataforma (Windows, iOS, android, Linux,...), por lo tanto no se si tendría mucho sentido implementar el tratamiento de mensajería de Windows.
__________________
Germán Estévez => Web/Blog Guía de estilo, Guía alternativa Utiliza TAG's en tus mensajes. Contactar con el Clubdelphi P.D: Más tiempo dedicado a la pregunta=Mejores respuestas. |
#3
|
|||
|
|||
Cita:
Toda esa documentación ya me la he mirado (no sé cuantos días llevo con esto), sí, sé que FMX es una librería que no está basada en Windows y por tanto no se parece en nada a VCL, y por eso os pedía ayuda porque ya me estoy quedando bloqueado , para ver cómo podría implementar algo parecido con FMX y así no tener que estar posicionado en un componente de escritura cuando se haga la lectura, sino que se pueda capturar siempre dicha lectura y poder enviarla al formulario activo. Gracias de nuevo! Saludos, Quique. |
#4
|
||||
|
||||
La primera respuesta del segundo link que te he puesto es lo que yo intentaría.
Haz una pequeña prueba a ver si consigues recibir mensajes. ¿Lo has probado? ¿Has conseguido algo?
__________________
Germán Estévez => Web/Blog Guía de estilo, Guía alternativa Utiliza TAG's en tus mensajes. Contactar con el Clubdelphi P.D: Más tiempo dedicado a la pregunta=Mejores respuestas. |
#5
|
|||
|
|||
Cita:
Estoy probando esto: https://francois-piette.blogspot.com...ndows-and.html A ver sin el hilo, si es capaz de capturarme un mensaje WM_CHAR... Te voy contando... Gracias! |
#6
|
|||
|
|||
Buenas a todos,
Con esto de Overbyte, pues he conseguido registrar casi todos los eventos de Windows, menos el que necesito Me coge bien el WM_KEYDOWN y el WM_KEYUP justo cuando leo un código de barras, obtengo uno de cada uno por cada cifra devuelve el lector, en vez de mandarme un WM_CHAR que no lo consigo manejar, no sé por qué será. Estoy desistiendo de la idea de manejar mensajes (que al final sería lo más lógico usando FMX) y empezar a controlarlo mirando el prefijo en el KeyDown (ya que los tenemos configurados con un CTRL+B de prefijo) y mirando si lo que se recibe es la tecla CTRL y ésta no está pulsada, sé que es un código de barras. No sé cómo lo habéis controlado en otras aplicaciones vosotros, si es mejor hacerlo por otro lado o qué. Saludos, Quique. |
#7
|
||||
|
||||
Cita:
¿Has revisado la VCL? Es posible que no todos los mensajes que le llegan a una aplicación de Windows los esté generando necesariamente el sistema. En concreto WM_CHA, ¿Puedes comprobar con alguna utilidad que se esté generando realmente? Estoy pensando que se sea un mensaje que genera alguna unit de la propia VCL. ¿No se si me explico?
__________________
Germán Estévez => Web/Blog Guía de estilo, Guía alternativa Utiliza TAG's en tus mensajes. Contactar con el Clubdelphi P.D: Más tiempo dedicado a la pregunta=Mejores respuestas. |
#8
|
|||
|
|||
Cita:
He tirado por la calle del medio y buscando he encontrado un par de cosillas que creo que me van a funcionar. Cuando compruebe que va bien os pongo el código por si a alguien le interesa. Gracias! |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Restringir lectura código de barras a un Tedit | hogol | Varios | 8 | 17-10-2012 11:33:36 |
lectura de codigo de barras | edmundo1481 | Varios | 1 | 27-01-2008 01:03:59 |
Codigo de Barras | CoCaInE | Varios | 2 | 25-11-2006 11:14:45 |
Tmessage Hotkey hacia aplicacion externa | vtdeleon | OOP | 4 | 24-09-2005 17:23:25 |
Codigo Barras | novatix | Impresión | 1 | 17-02-2004 12:43:25 |
|