In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.

Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.

SET PRINTER

Foro de Xailer profesional en español
Responder
Xevi
Mensajes: 1706
Registrado: Jue Sep 08, 2005 12:58 pm

SET PRINTER

Mensaje por Xevi »

SET DEVICE TO PRINTER
SET PRINTER TO LPT1
@ 10,10 SAY "HOLA MUNDO"
EJECT
SET PRINTER TO
SET DEVICE TO SCREEN
¿Como puedo saber si el puerto LPT1 está disponible/conectado???
Lo que me ocurre... cuando utilizo esta sentencia, en una impresora de Red,
si no está el servidor de la impresora conectada, la aplicación se queda
"bloqueada"... entra en un bucle infinito...
Gracias.
Un Saludo,
Xevi.
Avatar de Usuario
jfgimenez
Site Admin
Mensajes: 5718
Registrado: Lun Abr 06, 2015 8:48 pm
Contactar:

SET PRINTER

Mensaje por jfgimenez »

Xevi,
> ¿Como puedo saber si el puerto LPT1 está disponible/conectado???
>
> Lo que me ocurre... cuando utilizo esta sentencia, en una impresora de
> Red, si no está el servidor de la impresora conectada, la aplicación se
> queda "bloqueada"... entra en un bucle infinito...
Prueba con la función IsPrinter(). Yo nunca la he usado con [x]Harbour, pero
se supone que debería funcionar.
--
Un saludo,
José F. Giménez
José F. Giménez
[Equipo de Xailer / Xailer team]
http://www.xailer.com
http://www.xailer.info
Xevi
Mensajes: 1706
Registrado: Jue Sep 08, 2005 12:58 pm

SET PRINTER

Mensaje por Xevi »

Jose,
Por lo visto IsPrinter() informa de si está imprimiendo... no si el puerto
está disponible!!!
Lo que necesitaría es poder cargar en un Array el comando NET USE...
que ese comando SI informa de los puertos y unidades disponibles...
¿Puede ser posible???
Un Saludo,
Xevi.
"Jose F. Gimenez" <jfgimenez@wanadoo.es> escribió en el mensaje
news:43842a4f$[email=1@ozsrvnegro.ozlan.local...]1@ozsrvnegro.ozlan.local...[/email]
>
> Xevi,
>
>> ¿Como puedo saber si el puerto LPT1 está disponible/conectado???
>>
>> Lo que me ocurre... cuando utilizo esta sentencia, en una impresora de
>> Red, si no está el servidor de la impresora conectada, la aplicación se
>> queda "bloqueada"... entra en un bucle infinito...
>
> Prueba con la función IsPrinter(). Yo nunca la he usado con [x]Harbour,
> pero se supone que debería funcionar.
>
>
> --
> Un saludo,
>
> José F. Giménez
>
>
Avatar de Usuario
jfgimenez
Site Admin
Mensajes: 5718
Registrado: Lun Abr 06, 2015 8:48 pm
Contactar:

SET PRINTER

Mensaje por jfgimenez »

Xevi,
> Por lo visto IsPrinter() informa de si está imprimiendo... no si el puerto
> está disponible!!!
Debería ser como en Clipper, es decir, que retorne .T. si la impresora está
lista y .F. si no; no si está imprimiendo o no. Otra cosa es que si es una
impresora de red, para windows la cola está disponible, y puede que siempre
devuelva .T.
> Lo que necesitaría es poder cargar en un Array el comando NET USE...
> que ese comando SI informa de los puertos y unidades disponibles...
> ¿Puede ser posible???
Supongo que te refieres a lanzar el comando y recoger su salida. No es que
sea muy de mi agrado, pero puedes usar algo como:
ShellExecute( 0, "open", "NET USE.... > netuse.txt" )
y después cargar el fichero netuse.txt y procesarlo.
--
Un saludo,
José F. Giménez
José F. Giménez
[Equipo de Xailer / Xailer team]
http://www.xailer.com
http://www.xailer.info
Xevi
Mensajes: 1706
Registrado: Jue Sep 08, 2005 12:58 pm

SET PRINTER

Mensaje por Xevi »

Jose,
No funciona!!!
local nHandle
ShellExecute( 0, "open", "NET USE >C:NETUSE.txt" )
*WinExec( "NET USE >C:NETUSE.txt", SW_NORMAL, .F. )
nHandle := FOpen( "C:NETUSE.txt" )
MsgInfo( nHandle )
MsgInfo( FReadStr( nHandle, 2000 ) )
Si ejecutas el comando NET USE >C:NETUSE.txt desde el sí­mbolo de sistema SI que crea el fichero, pero desde la aplicación Xailer/xHarbour no crea el fichero... nHandle devuelve -1
Un Saludo,
Xevi.
"Jose F. Gimenez" <jfgimenez@wanadoo.es> escribió en el mensaje news:4384369a$[email=1@ozsrvnegro.ozlan.local...]1@ozsrvnegro.ozlan.local...[/email]
>
> Xevi,
>
>> Por lo visto IsPrinter() informa de si está imprimiendo... no si el puerto
>> está disponible!!!
>
> Deberí­a ser como en Clipper, es decir, que retorne .T. si la impresora está
> lista y .F. si no; no si está imprimiendo o no. Otra cosa es que si es una
> impresora de red, para windows la cola está disponible, y puede que siempre
> devuelva .T.
>
>
>> Lo que necesitarí­a es poder cargar en un Array el comando NET USE...
>> que ese comando SI informa de los puertos y unidades disponibles...
>> ¿Puede ser posible???
>
> Supongo que te refieres a lanzar el comando y recoger su salida. No es que
> sea muy de mi agrado, pero puedes usar algo como:
>
> ShellExecute( 0, "open", "NET USE.... > netuse.txt" )
>
> y después cargar el fichero netuse.txt y procesarlo.
>
>
> --
> Un saludo,
>
> José F. Giménez
>
>
>
--
joseluis
Mensajes: 642
Registrado: Jue Sep 08, 2005 12:54 pm

SET PRINTER

Mensaje por joseluis »

Xevi,
¿Como hací­as esa operación en Clipper?
Técnicamente (no lo he probado) en xHarbour debe ser lo mismo.
Saludos,
José Luis Capel
Xevi
Mensajes: 1706
Registrado: Jue Sep 08, 2005 12:58 pm

SET PRINTER

Mensaje por Xevi »

José Luis,
No lo hacía en Clipper.
Pero como los cambios son para ir mejorando...
Lo único que he conseguido es montar la instrucción
NET USE >NetUse.txt
en un fichero.bat
Y llamar al fichero.bat desde ShellExecute()
Pero creo que debe de haber alguna API que devuelva el nombre de LPTs
conectados, como ocurre con las unidades, A: C: D:...
Si a alguien se le ocurre como detectar un puerto LPT si está o no
conectado... lo agradecería.
Un Saludo,
Xevi.
"José Luis Capel" <joseluis@iaicom.com> escribió en el mensaje
news:43845196$[email=1@ozsrvnegro.ozlan.local...]1@ozsrvnegro.ozlan.local...[/email]
> Xevi,
>
> ¿Como hacías esa operación en Clipper?
>
> Técnicamente (no lo he probado) en xHarbour debe ser lo mismo.
>
> Saludos,
> José Luis Capel
>
joseluis
Mensajes: 642
Registrado: Jue Sep 08, 2005 12:54 pm

SET PRINTER

Mensaje por joseluis »

Xevi,
>
> Pero creo que debe de haber alguna API que devuelva el nombre de LPTs
> conectados, como ocurre con las unidades, A: C: D:...
> Si a alguien se le ocurre como detectar un puerto LPT si está o no
> conectado... lo agradecerí­a.
>
En casa tengo el wrapper a WNetGetConnection que es una función del API
de windows que devuelve el nombre el nombre de red asociado a un recurso
local.
Serí­a algo así­:
cRecurso := wNetGetConn( "Z:") ---> ServidorCarpetaRemota
Y _creo_ que podrí­as interrogar esto:
cImpresora := wNetGetConn("LPT1:") ----->ServidorImpresoraRemota1
Esta tarde lo dejo aquí­...
Saludos,
José Luis Capel
Avatar de Usuario
jfgimenez
Site Admin
Mensajes: 5718
Registrado: Lun Abr 06, 2015 8:48 pm
Contactar:

SET PRINTER

Mensaje por jfgimenez »

Xevi,
> Pero creo que debe de haber alguna API que devuelva el nombre de LPTs
> conectados, como ocurre con las unidades, A: C: D:...
No lo he mirado, pero seguro que sí existe. Aunque habrá que hacer el
"wrapper"...
> Si a alguien se le ocurre como detectar un puerto LPT si está o no
> conectado... lo agradecería.
Yo creo que no deberías atacar directamente el puerto; en mi opinión, es
hacerlo como windows NO quiere que se haga, y por eso se complica. Yo lo que
haría es manejar la cola al estilo de windows, a través del objeto Printer.
Y en el caso de que tengas una impresora matricial o de tickets y necesites
enviarle directamente el texto sin que lo procese el driver de la impresora
puedes usar el método WriteData()
--
Un saludo,
José F. Giménez
José F. Giménez
[Equipo de Xailer / Xailer team]
http://www.xailer.com
http://www.xailer.info
Avatar de Usuario
jfgimenez
Site Admin
Mensajes: 5718
Registrado: Lun Abr 06, 2015 8:48 pm
Contactar:

SET PRINTER

Mensaje por jfgimenez »

Xevi,
aquí tienes el "wrapper":
//---------------------------------------------------------- --------------------
#pragma BEGINDUMP
#include "windows.h"
#include "xailer.h"
XA_FUNC( WNETGETCONNECTION )
{
char *cLocalName = hb_parc( 1 );
char *cRemoteName;
DWORD nLen = 0, nError;
nError = WNetGetConnection( cLocalName, NULL, &nLen );
if( nLen )
{
cRemoteName = hb_xgrab( nLen );
nError = WNetGetConnection( cLocalName, cRemoteName, &nLen );
hb_storc( cRemoteName, 2 );
hb_xfree( cRemoteName );
}
hb_retnl( nError );
}
#pragma ENDDUMP
//---------------------------------------------------------- --------------------
Para usarla tienes que hacerlo así:
LOCAL cImpresora
IF WNetGetConnection( "LPT1:", @cImpresora ) != 0
MsgInfo( "Hay un problema al usar la impresora" )
ENDIF
...
Lo normal es que si no está disponible te devuelva 1201
(ERROR_CONNECTION_UNAVAIL).
--
Un saludo,
José F. Giménez
José F. Giménez
[Equipo de Xailer / Xailer team]
http://www.xailer.com
http://www.xailer.info
Xevi
Mensajes: 1706
Registrado: Jue Sep 08, 2005 12:58 pm

SET PRINTER

Mensaje por Xevi »

PERFECTO!!!
Gracias, Jose y José Luis.
Eso es lo que necesitaba.
Un Saludo,
Xevi.
"Jose F. Gimenez" <jfgimenez@wanadoo.es> escribió en el mensaje
news:43845f40$[email=1@ozsrvnegro.ozlan.local...]1@ozsrvnegro.ozlan.local...[/email]
>
> Xevi,
>
> aquí tienes el "wrapper":
>
> //---------------------------------------------------------- --------------------
>
> #pragma BEGINDUMP
>
> #include "windows.h"
> #include "xailer.h"
>
> XA_FUNC( WNETGETCONNECTION )
> {
> char *cLocalName = hb_parc( 1 );
> char *cRemoteName;
> DWORD nLen = 0, nError;
>
> nError = WNetGetConnection( cLocalName, NULL, &nLen );
> if( nLen )
> {
> cRemoteName = hb_xgrab( nLen );
> nError = WNetGetConnection( cLocalName, cRemoteName, &nLen );
> hb_storc( cRemoteName, 2 );
> hb_xfree( cRemoteName );
> }
> hb_retnl( nError );
> }
>
> #pragma ENDDUMP
>
> //---------------------------------------------------------- --------------------
>
> Para usarla tienes que hacerlo así:
>
> LOCAL cImpresora
>
> IF WNetGetConnection( "LPT1:", @cImpresora ) != 0
> MsgInfo( "Hay un problema al usar la impresora" )
> ENDIF
> ...
>
> Lo normal es que si no está disponible te devuelva 1201
> (ERROR_CONNECTION_UNAVAIL).
>
>
> --
> Un saludo,
>
> José F. Giménez
>
>
Xevi
Mensajes: 1706
Registrado: Jue Sep 08, 2005 12:58 pm

SET PRINTER

Mensaje por Xevi »

¿Como compruebo si el puerto LPT1 local está disponible???
Habría algun Wrapper para puertos LOCALES
Algo como... WLocalGetConnection
Se trataría primero de intentar localizar el puerto localmente y si no está
disponible intentar localizarlo en la Red.
Gracias.
Un Saludo,
Xevi.
"Jose F. Gimenez" <jfgimenez@wanadoo.es> escribió en el mensaje
news:43845f40$[email=1@ozsrvnegro.ozlan.local...]1@ozsrvnegro.ozlan.local...[/email]
>
> Xevi,
>
> aquí tienes el "wrapper":
>
> //---------------------------------------------------------- --------------------
>
> #pragma BEGINDUMP
>
> #include "windows.h"
> #include "xailer.h"
>
> XA_FUNC( WNETGETCONNECTION )
> {
> char *cLocalName = hb_parc( 1 );
> char *cRemoteName;
> DWORD nLen = 0, nError;
>
> nError = WNetGetConnection( cLocalName, NULL, &nLen );
> if( nLen )
> {
> cRemoteName = hb_xgrab( nLen );
> nError = WNetGetConnection( cLocalName, cRemoteName, &nLen );
> hb_storc( cRemoteName, 2 );
> hb_xfree( cRemoteName );
> }
> hb_retnl( nError );
> }
>
> #pragma ENDDUMP
>
> //---------------------------------------------------------- --------------------
>
> Para usarla tienes que hacerlo así:
>
> LOCAL cImpresora
>
> IF WNetGetConnection( "LPT1:", @cImpresora ) != 0
> MsgInfo( "Hay un problema al usar la impresora" )
> ENDIF
> ...
>
> Lo normal es que si no está disponible te devuelva 1201
> (ERROR_CONNECTION_UNAVAIL).
>
>
> --
> Un saludo,
>
> José F. Giménez
>
>
Avatar de Usuario
jfgimenez
Site Admin
Mensajes: 5718
Registrado: Lun Abr 06, 2015 8:48 pm
Contactar:

SET PRINTER

Mensaje por jfgimenez »

Xevi,
> ¿Como compruebo si el puerto LPT1 local está disponible???
>
> Habría algun Wrapper para puertos LOCALES
>
> Algo como... WLocalGetConnection
>
> Se trataría primero de intentar localizar el puerto localmente y si no
> está disponible intentar localizarlo en la Red.
¿Has probado IsPrinter() en el puerto local? Podrías usar
WNetGetConnection() para comprobar si es un puerto de red, y si no lo es,
comprobarlo con IsPrinter(). Yo creo que así sí debería funcionar bien.
--
Un saludo,
José F. Giménez
José F. Giménez
[Equipo de Xailer / Xailer team]
http://www.xailer.com
http://www.xailer.info
Xevi
Mensajes: 1706
Registrado: Jue Sep 08, 2005 12:58 pm

SET PRINTER

Mensaje por Xevi »

Jose,
IsPrinter() no me funciona... o no se hacerlo funcionar !!!
En un ordenador con puerto LPT1, y una impresora conectada y encendida...
MsgInfo( IsPrinter( "LPT1" ) )
MsgInfo( IsPrinter( "LPT2" ) )
MsgInfo( IsPrinter( "LPT3" ) )
MsgInfo( IsPrinter( "LPT1:" ) )
MsgInfo( IsPrinter( "LPT2:" ) )
MsgInfo( IsPrinter( "LPT3:" ) )
La respuesta es SIEMPRE la misma F.
¿Hago algo mal???
y otra consulta sobre imprimir e interceptar el error...
En Clipper existí­a el objeto oError, que podí­amos "interceptar" e incluso "modificar" en el prg... ErrorSys.prg.
¿Cómo podemos interceptar los errores en Xailer/xHarbour???
Ya que si mando a imprimir
SET DEVICE TO PRINTER
SET PRINTER TO LPT5
y el puerto no existe
me lanza un error Xailer/xHarbour... y me "saca" de la aplicación
Subsistema: TERM
Código de error: 2014
Estado: .T.
Descripción: Create error
Operación: LPT5.prn
Argumentos:
Fichero:
Código error SO: 2
Pila de llamadas:
SET (0)
MAIN (17)
Gracias.
Un Saludo,
Xevi.
"Jose F. Gimenez" <jfgimenez@wanadoo.es> escribió en el mensaje news:[email=4385fe07@ozsrvnegro.ozlan.local...]4385fe07@ozsrvnegro.ozlan.local...[/email]
>
> Xevi,
>
>> ¿Como compruebo si el puerto LPT1 local está disponible???
>>
>> Habrí­a algun Wrapper para puertos LOCALES
>>
>> Algo como... WLocalGetConnection
>>
>> Se tratarí­a primero de intentar localizar el puerto localmente y si no
>> está disponible intentar localizarlo en la Red.
>
> ¿Has probado IsPrinter() en el puerto local? Podrí­as usar
> WNetGetConnection() para comprobar si es un puerto de red, y si no lo es,
> comprobarlo con IsPrinter(). Yo creo que así­ sí­ deberí­a funcionar bien.
>
>
> --
> Un saludo,
>
> José F. Giménez
>
>
>
--
Avatar de Usuario
jfgimenez
Site Admin
Mensajes: 5718
Registrado: Lun Abr 06, 2015 8:48 pm
Contactar:

SET PRINTER

Mensaje por jfgimenez »

Xevi,
IsPrinter() no me funciona... o no se hacerlo funcionar !!!
Nunca lo he usado en xHarbour (en Clipper tení­a mi propia función IsPrinter() escrita en assembler), pero deberí­a funcionar. En cuanto tenga un rato le echo un vistazo.
y otra consulta sobre imprimir e interceptar el error...
En Clipper existí­a el objeto oError, que podí­amos "interceptar" e incluso "modificar" en el prg... ErrorSys.prg.
¿Cómo podemos interceptar los errores en Xailer/xHarbour???
Ya que si mando a imprimir
SET DEVICE TO PRINTER
SET PRINTER TO LPT5
y el puerto no existe
me lanza un error Xailer/xHarbour... y me "saca" de la aplicación
Lo más fácil y práctico es usar un bloque TRY / CATCH / END:
TRY
SET DEVICE TO PRINTER5
SET PRINTER TO LPT5
.... // Resto de impresion
SET PRINTER TO
SET DEVICE TO SCREEN
CATCH oError
MsgStop( oError:Description, "Error al imprimir" )
END
--
Un saludo,
José F. Giménez
--
José F. Giménez
[Equipo de Xailer / Xailer team]
http://www.xailer.com
http://www.xailer.info
Avatar de Usuario
jfgimenez
Site Admin
Mensajes: 5718
Registrado: Lun Abr 06, 2015 8:48 pm
Contactar:

SET PRINTER

Mensaje por jfgimenez »

Xevi,
IsPrinter() no me funciona... o no se hacerlo funcionar !!!
Nunca lo he usado en xHarbour (en Clipper tení­a mi propia función IsPrinter() escrita en assembler), pero deberí­a funcionar. En cuanto tenga un rato le echo un vistazo.
y otra consulta sobre imprimir e interceptar el error...
En Clipper existí­a el objeto oError, que podí­amos "interceptar" e incluso "modificar" en el prg... ErrorSys.prg.
¿Cómo podemos interceptar los errores en Xailer/xHarbour???
Ya que si mando a imprimir
SET DEVICE TO PRINTER
SET PRINTER TO LPT5
y el puerto no existe
me lanza un error Xailer/xHarbour... y me "saca" de la aplicación
Lo más fácil y práctico es usar un bloque TRY / CATCH / END:
TRY
SET DEVICE TO PRINTER5
SET PRINTER TO LPT5
.... // Resto de impresion
SET PRINTER TO
SET DEVICE TO SCREEN
CATCH oError
MsgStop( oError:Description, "Error al imprimir" )
END
--
Un saludo,
José F. Giménez
--
José F. Giménez
[Equipo de Xailer / Xailer team]
http://www.xailer.com
http://www.xailer.info
joseluis
Mensajes: 642
Registrado: Jue Sep 08, 2005 12:54 pm

SET PRINTER

Mensaje por joseluis »

Xevi,
IsPrinter solo funciona con LPT1 y no acepta parámetros.
Prueba con xIsPrinter("LPTn") y dime se eso te soluciona el problema.
Saludos,
José Luis Capel
Xevi escribió:
> Jose,
>
> IsPrinter() no me funciona... o no se hacerlo funcionar !!!
>
> En un ordenador con puerto LPT1, y una impresora conectada y encendida...
> MsgInfo( IsPrinter( "LPT1" ) )
> MsgInfo( IsPrinter( "LPT2" ) )
> MsgInfo( IsPrinter( "LPT3" ) )
> MsgInfo( IsPrinter( "LPT1:" ) )
> MsgInfo( IsPrinter( "LPT2:" ) )
> MsgInfo( IsPrinter( "LPT3:" ) )
> La respuesta es SIEMPRE la misma F.
> ¿Hago algo mal???
>
>
> y otra consulta sobre imprimir e interceptar el error...
>
> En Clipper existí­a el objeto oError, que podí­amos "interceptar" e
> incluso "modificar" en el prg... ErrorSys.prg.
> ¿Cómo podemos interceptar los errores en Xailer/xHarbour???
> Ya que si mando a imprimir
> SET DEVICE TO PRINTER
> SET PRINTER TO LPT5
> y el puerto no existe
> me lanza un error Xailer/xHarbour... y me "saca" de la aplicación
> Subsistema: TERM
> Código de error: 2014
> Estado: .T.
> Descripción: Create error
> Operación: LPT5.prn
> Argumentos:
> Fichero:
> Código error SO: 2
>
> Pila de llamadas:
> SET (0)
> MAIN (17)
>
> Gracias.
>
> Un Saludo,
> Xevi.
>
>
> "Jose F. Gimenez" <jfgimenez@wanadoo.es> escribió en el
> mensaje news:[email=4385fe07@ozsrvnegro.ozlan.local...]4385fe07@ozsrvnegro.ozlan.local...[/email]
> >
> > Xevi,
> >
> >> ¿Como compruebo si el puerto LPT1 local está disponible???
> >>
> >> Habrí­a algun Wrapper para puertos LOCALES
> >>
> >> Algo como... WLocalGetConnection
> >>
> >> Se tratarí­a primero de intentar localizar el puerto localmente y si no
> >> está disponible intentar localizarlo en la Red.
> >
> > ¿Has probado IsPrinter() en el puerto local? Podrí­as usar
> > WNetGetConnection() para comprobar si es un puerto de red, y si no lo
> es,
> > comprobarlo con IsPrinter(). Yo creo que así­ sí­ deberí­a funcionar bien.
> >
> >
> > --
> > Un saludo,
> >
> > José F. Giménez
> >
> >
> >
Xevi
Mensajes: 1706
Registrado: Jue Sep 08, 2005 12:58 pm

SET PRINTER

Mensaje por Xevi »

MsgInfo( xIsPrinter("LPT1") )
MsgInfo( xIsPrinter("LPT2") )
MsgInfo( xIsPrinter("LPT3") )
MsgInfo( xIsPrinter("LPT4") )
MsgInfo( xIsPrinter("LPT5") )
SIEMPRE devuelve -1, exista o no el puerto, o esté o no esté lista la
impresora conectada en LPT1
Gracias.
Un Saludo,
Xevi.
"José Luis Capel" <joseluis@iaicom.com> escribió en el mensaje
news:[email=438734b0@ozsrvnegro.ozlan.local...]438734b0@ozsrvnegro.ozlan.local...[/email]
> Xevi,
>
> IsPrinter solo funciona con LPT1 y no acepta parámetros.
>
> Prueba con xIsPrinter("LPTn") y dime se eso te soluciona el problema.
>
> Saludos,
> José Luis Capel
>
> Xevi escribió:
>> Jose,
>> IsPrinter() no me funciona... o no se hacerlo funcionar !!!
>> En un ordenador con puerto LPT1, y una impresora conectada y
>> encendida...
>> MsgInfo( IsPrinter( "LPT1" ) )
>> MsgInfo( IsPrinter( "LPT2" ) )
>> MsgInfo( IsPrinter( "LPT3" ) )
>> MsgInfo( IsPrinter( "LPT1:" ) )
>> MsgInfo( IsPrinter( "LPT2:" ) )
>> MsgInfo( IsPrinter( "LPT3:" ) )
>> La respuesta es SIEMPRE la misma F.
>> ¿Hago algo mal???
>> y otra consulta sobre imprimir e interceptar el error...
>> En Clipper existía el objeto oError, que podíamos "interceptar" e
>> incluso "modificar" en el prg... ErrorSys.prg.
>> ¿Cómo podemos interceptar los errores en Xailer/xHarbour???
>> Ya que si mando a imprimir
>> SET DEVICE TO PRINTER
>> SET PRINTER TO LPT5
>> y el puerto no existe
>> me lanza un error Xailer/xHarbour... y me "saca" de la aplicación
>> Subsistema: TERM
>> Código de error: 2014
>> Estado: .T.
>> Descripción: Create error
>> Operación: LPT5.prn
>> Argumentos:
>> Fichero:
>> Código error SO: 2
>> Pila de llamadas:
>> SET (0)
>> MAIN (17)
>> Gracias.
>> Un Saludo,
>> Xevi.
>> "Jose F. Gimenez" <jfgimenez@wanadoo.es> escribió en el
>> mensaje news:[email=4385fe07@ozsrvnegro.ozlan.local...]4385fe07@ozsrvnegro.ozlan.local...[/email]
>> >
>> > Xevi,
>> >
>> >> ¿Como compruebo si el puerto LPT1 local está disponible???
>> >>
>> >> Habría algun Wrapper para puertos LOCALES
>> >>
>> >> Algo como... WLocalGetConnection
>> >>
>> >> Se trataría primero de intentar localizar el puerto localmente y si
>> no
>> >> está disponible intentar localizarlo en la Red.
>> >
>> > ¿Has probado IsPrinter() en el puerto local? Podrías usar
>> > WNetGetConnection() para comprobar si es un puerto de red, y si no lo
>> es,
>> > comprobarlo con IsPrinter(). Yo creo que así sí debería funcionar
>> bien.
>> >
>> >
>> > --
>> > Un saludo,
>> >
>> > José F. Giménez
>> >
>> >
>> >
>
joseluis
Mensajes: 642
Registrado: Jue Sep 08, 2005 12:54 pm

SET PRINTER

Mensaje por joseluis »

Xevi,
Pues me quedo pillado...
He revisado el fuente de xIsprinter y veo que utiliza una función del
Api de Windows ( OpenPrinter ) que abre un 'handle' a la impresora. Lo
que no se, mirando el MSDN, es si el nombre de la impresora corresponde
a "LPTx" o no. A ver si algún experto en la materia puede aclararnos
algo más esto.
Saludos,
José Luis Capel
Xevi escribió:
>
> MsgInfo( xIsPrinter("LPT1") )
> MsgInfo( xIsPrinter("LPT2") )
> MsgInfo( xIsPrinter("LPT3") )
> MsgInfo( xIsPrinter("LPT4") )
> MsgInfo( xIsPrinter("LPT5") )
>
> SIEMPRE devuelve -1, exista o no el puerto, o esté o no esté lista la
> impresora conectada en LPT1
>
> Gracias.
>
> Un Saludo,
> Xevi.
>
>
> "José Luis Capel" <joseluis@iaicom.com> escribió en el mensaje
> news:[email=438734b0@ozsrvnegro.ozlan.local...]438734b0@ozsrvnegro.ozlan.local...[/email]
>
>>Xevi,
>>
>>IsPrinter solo funciona con LPT1 y no acepta parámetros.
>>
>>Prueba con xIsPrinter("LPTn") y dime se eso te soluciona el problema.
>>
>>Saludos,
>>José Luis Capel
>>
>>Xevi escribió:
>>
>>>Jose,
>>> IsPrinter() no me funciona... o no se hacerlo funcionar !!!
>>> En un ordenador con puerto LPT1, y una impresora conectada y
>>>encendida...
>>>MsgInfo( IsPrinter( "LPT1" ) )
>>>MsgInfo( IsPrinter( "LPT2" ) )
>>>MsgInfo( IsPrinter( "LPT3" ) )
>>>MsgInfo( IsPrinter( "LPT1:" ) )
>>>MsgInfo( IsPrinter( "LPT2:" ) )
>>>MsgInfo( IsPrinter( "LPT3:" ) )
>>>La respuesta es SIEMPRE la misma F.
>>>¿Hago algo mal???
>>> y otra consulta sobre imprimir e interceptar el error...
>>> En Clipper existí­a el objeto oError, que podí­amos "interceptar" e
>>>incluso "modificar" en el prg... ErrorSys.prg.
>>>¿Cómo podemos interceptar los errores en Xailer/xHarbour???
>>>Ya que si mando a imprimir
>>>SET DEVICE TO PRINTER
>>>SET PRINTER TO LPT5
>>>y el puerto no existe
>>>me lanza un error Xailer/xHarbour... y me "saca" de la aplicación
>>>Subsistema: TERM
>>> Código de error: 2014
>>> Estado: .T.
>>> Descripción: Create error
>>> Operación: LPT5.prn
>>> Argumentos:
>>> Fichero:
>>> Código error SO: 2
>>> Pila de llamadas:
>>> SET (0)
>>> MAIN (17)
>>> Gracias.
>>> Un Saludo,
>>>Xevi.
>>> "Jose F. Gimenez" <jfgimenez@wanadoo.es> escribió en el
>>>mensaje news:[email=4385fe07@ozsrvnegro.ozlan.local...]4385fe07@ozsrvnegro.ozlan.local...[/email]
>>> >
>>> > Xevi,
>>> >
>>> >> ¿Como compruebo si el puerto LPT1 local está disponible???
>>> >>
>>> >> Habrí­a algun Wrapper para puertos LOCALES
>>> >>
>>> >> Algo como... WLocalGetConnection
>>> >>
>>> >> Se tratarí­a primero de intentar localizar el puerto localmente y si
>>>no
>>> >> está disponible intentar localizarlo en la Red.
>>> >
>>> > ¿Has probado IsPrinter() en el puerto local? Podrí­as usar
>>> > WNetGetConnection() para comprobar si es un puerto de red, y si no lo
>>>es,
>>> > comprobarlo con IsPrinter(). Yo creo que así­ sí­ deberí­a funcionar
>>>bien.
>>> >
>>> >
>>> > --
>>> > Un saludo,
>>> >
>>> > José F. Giménez
>>> >
>>> >
>>> >
>>
>
>
>
Xevi
Mensajes: 1706
Registrado: Jue Sep 08, 2005 12:58 pm

SET PRINTER

Mensaje por Xevi »

José Luis,
XISPRINTER
.. Syntax
XISPRINTER(<cPrinterName>) -->
.. Arguments
cPrinterName:
.. Files
rtl.lib, source is isprint.c
¿No será que xIsPrinter acepta el parámetro del nombre de la impresora, no del puerto ???
Gracias.
Un Saludo,
Xevi.
"José Luis Capel" <joseluis@iaicom.com> escribió en el mensaje news:[email=43873dbe@ozsrvnegro.ozlan.local...]43873dbe@ozsrvnegro.ozlan.local...[/email]
> Xevi,
>
> Pues me quedo pillado...
>
> He revisado el fuente de xIsprinter y veo que utiliza una función del
> Api de Windows ( OpenPrinter ) que abre un 'handle' a la impresora. Lo
> que no se, mirando el MSDN, es si el nombre de la impresora corresponde
> a "LPTx" o no. A ver si algún experto en la materia puede aclararnos
> algo más esto.
>
> Saludos,
> José Luis Capel
>
>
> Xevi escribió:
>>
>> MsgInfo( xIsPrinter("LPT1") )
>> MsgInfo( xIsPrinter("LPT2") )
>> MsgInfo( xIsPrinter("LPT3") )
>> MsgInfo( xIsPrinter("LPT4") )
>> MsgInfo( xIsPrinter("LPT5") )
>>
>> SIEMPRE devuelve -1, exista o no el puerto, o esté o no esté lista la
>> impresora conectada en LPT1
>>
>> Gracias.
>>
>> Un Saludo,
>> Xevi.
>>
>>
>> "José Luis Capel" <joseluis@iaicom.com> escribió en el mensaje
>> news:[email=438734b0@ozsrvnegro.ozlan.local...]438734b0@ozsrvnegro.ozlan.local...[/email]
>>
>>>Xevi,
>>>
>>>IsPrinter solo funciona con LPT1 y no acepta parámetros.
>>>
>>>Prueba con xIsPrinter("LPTn") y dime se eso te soluciona el problema.
>>>
>>>Saludos,
>>>José Luis Capel
>>>
>>>Xevi escribió:
>>>
>>>>Jose,
>>>> IsPrinter() no me funciona... o no se hacerlo funcionar !!!
>>>> En un ordenador con puerto LPT1, y una impresora conectada y
>>>>encendida...
>>>>MsgInfo( IsPrinter( "LPT1" ) )
>>>>MsgInfo( IsPrinter( "LPT2" ) )
>>>>MsgInfo( IsPrinter( "LPT3" ) )
>>>>MsgInfo( IsPrinter( "LPT1:" ) )
>>>>MsgInfo( IsPrinter( "LPT2:" ) )
>>>>MsgInfo( IsPrinter( "LPT3:" ) )
>>>>La respuesta es SIEMPRE la misma F.
>>>>¿Hago algo mal???
>>>> y otra consulta sobre imprimir e interceptar el error...
>>>> En Clipper existí­a el objeto oError, que podí­amos "interceptar" e
>>>>incluso "modificar" en el prg... ErrorSys.prg.
>>>>¿Cómo podemos interceptar los errores en Xailer/xHarbour???
>>>>Ya que si mando a imprimir
>>>>SET DEVICE TO PRINTER
>>>>SET PRINTER TO LPT5
>>>>y el puerto no existe
>>>>me lanza un error Xailer/xHarbour... y me "saca" de la aplicación
>>>>Subsistema: TERM
>>>> Código de error: 2014
>>>> Estado: .T.
>>>> Descripción: Create error
>>>> Operación: LPT5.prn
>>>> Argumentos:
>>>> Fichero:
>>>> Código error SO: 2
>>>> Pila de llamadas:
>>>> SET (0)
>>>> MAIN (17)
>>>> Gracias.
>>>> Un Saludo,
>>>>Xevi.
>>>> "Jose F. Gimenez" <jfgimenez@wanadoo.es> escribió en el
>>>>mensaje news:[email=4385fe07@ozsrvnegro.ozlan.local...]4385fe07@ozsrvnegro.ozlan.local...[/email]
>>>> >
>>>> > Xevi,
>>>> >
>>>> >> ¿Como compruebo si el puerto LPT1 local está disponible???
>>>> >>
>>>> >> Habrí­a algun Wrapper para puertos LOCALES
>>>> >>
>>>> >> Algo como... WLocalGetConnection
>>>> >>
>>>> >> Se tratarí­a primero de intentar localizar el puerto localmente y si
>>>>no
>>>> >> está disponible intentar localizarlo en la Red.
>>>> >
>>>> > ¿Has probado IsPrinter() en el puerto local? Podrí­as usar
>>>> > WNetGetConnection() para comprobar si es un puerto de red, y si no lo
>>>>es,
>>>> > comprobarlo con IsPrinter(). Yo creo que así­ sí­ deberí­a funcionar
>>>>bien.
>>>> >
>>>> >
>>>> > --
>>>> > Un saludo,
>>>> >
>>>> > José F. Giménez
>>>> >
>>>> >
>>>> >
>>>
>>
>>
>>
>
--
Xevi
Mensajes: 1706
Registrado: Jue Sep 08, 2005 12:58 pm

SET PRINTER

Mensaje por Xevi »

Lo suyo serí­a, según ayuda de xHarbour...
GETPRINTERS
Retrieve a list of available printers.
.. Syntax
GetPrinters() -->
.. Arguments
[<lPorts>] = .T. or .F. ( default .F. )
.. Returns
A List of available printers.
.. Description
This function retrieves a list of available printers.
.. Examples
CLS
?? 'Test program for WINDOWS printing'
? '---------------------------------'
? SET(_SET_DEVICE)
aPrinter:=GetPrinters()
IF EMPTY(aPrinter)
? '----- No Printers installed'
ELSE
set printer to (GetDefaultPrinter())
? SET(_SET_PRINTER)
? SET(_SET_PRINTFILE)
set console off
set printer on
? 'Default Printer'
?'----------------'
? GetDefaultPrinter()
?
? 'Printers Available'
?'-------------------'
FOR x:= 1 TO LEN(aPrinter)
? aPrinter[x]
NEXT x
aPrinter:= GetPrinters(.T.)
? 'Printers and Ports'
?'-------------------'
FOR x:= 1 TO LEN(aPrinter)
? aPrinter[x,1]+' on '+aPrinter[x,2]
NEXT x
EJECT
set printer off
set console on
set printer to
ENDIF
? SET(_SET_PRINTER)
? SET(_SET_DEVICE)
WAIT
return nil
.. Files
source is tprinter.c
Se puede utilizar como parámetro, .T. o .F. por si queremos saber la lista de puertos...
GetPrinters( .T. )
Eso deberí­a devolver un Array con los puertos que tenemos en nuestro Windows...
Bien, pues por lo que veo... GetPrinters() devuelve un Array Vacio!!!
Por lo que respecta a IsPrinter()
ISPRINTER
Determine whether LPT1 is ready
.. Syntax
ISPRINTER() --> lReady
.. Arguments
None
.. Returns
ISPRINTER() returns true (.T.) if LPT1 is ready; otherwise, it returnsfalse (.F.).
.. Description
ISPRINTER() is a printer function that determines whether the parallelport (LPT1) is online and ready to print. ISPRINTER() ishardware-dependent and, therefore, only works on IBM BIOS compatiblesystems.
You can check ISPRINTER() to make sure the printer is ready before youbegin a print operation; however, if an error occurs during the printoperation, a runtime error is generated.
.. Examples
This example tests the parallel port for readiness with up to
25 retries. If the parallel port is ready, the printer operation
begins:
lReady := ISPRINTER()
//
IF lReady
REPORT FORM Sales TO PRINTER
ELSE
? "Printer not ready..."
BREAK
ENDIF
.. Files
Library is rtl.lib, source is isprint.c
Pues desde Xailer... IsPrinter() lanza un GPF
Para que no lanze el GPF, debemos enviar algún parámetro a la Función...
IsPrinter("loquesea")
Pero SIEMPRE devuelve .F.
Si he entendido bien lo que he leí­do,...
Creo que hay problemas con los puertos LPTs y Xailer
Gracias.
Un Saludo,
Xevi.
"José Luis Capel" <joseluis@iaicom.com> escribió en el mensaje news:[email=43873dbe@ozsrvnegro.ozlan.local...]43873dbe@ozsrvnegro.ozlan.local...[/email]
> Xevi,
>
> Pues me quedo pillado...
>
> He revisado el fuente de xIsprinter y veo que utiliza una función del
> Api de Windows ( OpenPrinter ) que abre un 'handle' a la impresora. Lo
> que no se, mirando el MSDN, es si el nombre de la impresora corresponde
> a "LPTx" o no. A ver si algún experto en la materia puede aclararnos
> algo más esto.
>
> Saludos,
> José Luis Capel
>
>
> Xevi escribió:
>>
>> MsgInfo( xIsPrinter("LPT1") )
>> MsgInfo( xIsPrinter("LPT2") )
>> MsgInfo( xIsPrinter("LPT3") )
>> MsgInfo( xIsPrinter("LPT4") )
>> MsgInfo( xIsPrinter("LPT5") )
>>
>> SIEMPRE devuelve -1, exista o no el puerto, o esté o no esté lista la
>> impresora conectada en LPT1
>>
>> Gracias.
>>
>> Un Saludo,
>> Xevi.
>>
>>
>> "José Luis Capel" <joseluis@iaicom.com> escribió en el mensaje
>> news:[email=438734b0@ozsrvnegro.ozlan.local...]438734b0@ozsrvnegro.ozlan.local...[/email]
>>
>>>Xevi,
>>>
>>>IsPrinter solo funciona con LPT1 y no acepta parámetros.
>>>
>>>Prueba con xIsPrinter("LPTn") y dime se eso te soluciona el problema.
>>>
>>>Saludos,
>>>José Luis Capel
>>>
>>>Xevi escribió:
>>>
>>>>Jose,
>>>> IsPrinter() no me funciona... o no se hacerlo funcionar !!!
>>>> En un ordenador con puerto LPT1, y una impresora conectada y
>>>>encendida...
>>>>MsgInfo( IsPrinter( "LPT1" ) )
>>>>MsgInfo( IsPrinter( "LPT2" ) )
>>>>MsgInfo( IsPrinter( "LPT3" ) )
>>>>MsgInfo( IsPrinter( "LPT1:" ) )
>>>>MsgInfo( IsPrinter( "LPT2:" ) )
>>>>MsgInfo( IsPrinter( "LPT3:" ) )
>>>>La respuesta es SIEMPRE la misma F.
>>>>¿Hago algo mal???
>>>> y otra consulta sobre imprimir e interceptar el error...
>>>> En Clipper existí­a el objeto oError, que podí­amos "interceptar" e
>>>>incluso "modificar" en el prg... ErrorSys.prg.
>>>>¿Cómo podemos interceptar los errores en Xailer/xHarbour???
>>>>Ya que si mando a imprimir
>>>>SET DEVICE TO PRINTER
>>>>SET PRINTER TO LPT5
>>>>y el puerto no existe
>>>>me lanza un error Xailer/xHarbour... y me "saca" de la aplicación
>>>>Subsistema: TERM
>>>> Código de error: 2014
>>>> Estado: .T.
>>>> Descripción: Create error
>>>> Operación: LPT5.prn
>>>> Argumentos:
>>>> Fichero:
>>>> Código error SO: 2
>>>> Pila de llamadas:
>>>> SET (0)
>>>> MAIN (17)
>>>> Gracias.
>>>> Un Saludo,
>>>>Xevi.
>>>> "Jose F. Gimenez" <jfgimenez@wanadoo.es> escribió en el
>>>>mensaje news:[email=4385fe07@ozsrvnegro.ozlan.local...]4385fe07@ozsrvnegro.ozlan.local...[/email]
>>>> >
>>>> > Xevi,
>>>> >
>>>> >> ¿Como compruebo si el puerto LPT1 local está disponible???
>>>> >>
>>>> >> Habrí­a algun Wrapper para puertos LOCALES
>>>> >>
>>>> >> Algo como... WLocalGetConnection
>>>> >>
>>>> >> Se tratarí­a primero de intentar localizar el puerto localmente y si
>>>>no
>>>> >> está disponible intentar localizarlo en la Red.
>>>> >
>>>> > ¿Has probado IsPrinter() en el puerto local? Podrí­as usar
>>>> > WNetGetConnection() para comprobar si es un puerto de red, y si no lo
>>>>es,
>>>> > comprobarlo con IsPrinter(). Yo creo que así­ sí­ deberí­a funcionar
>>>>bien.
>>>> >
>>>> >
>>>> > --
>>>> > Un saludo,
>>>> >
>>>> > José F. Giménez
>>>> >
>>>> >
>>>> >
>>>
>>
>>
>>
>
--
joseluis
Mensajes: 642
Registrado: Jue Sep 08, 2005 12:54 pm

SET PRINTER

Mensaje por joseluis »

Xevi,
>
> Pues desde Xailer... IsPrinter() lanza un GPF
> Para que no lanze el GPF, debemos enviar algún parámetro a la Función...
> IsPrinter("loquesea")
> Pero SIEMPRE devuelve .F.
>
> Si he entendido bien lo que he leí­do,...
> Creo que hay problemas con los puertos LPTs y Xailer
>
El problema es de xharbour.
Serí­a interesante reportar ese fallo en la news de xharbour.
Saludos,
José Luis Capel
Avatar de Usuario
jfgimenez
Site Admin
Mensajes: 5718
Registrado: Lun Abr 06, 2015 8:48 pm
Contactar:

SET PRINTER

Mensaje por jfgimenez »

Xevi,
Si he entendido bien lo que he leí­do,...
Creo que hay problemas con los puertos LPTs y Xailer
En realida el problema no es de Xailer ni de xHarbour. Simplemente, que con windows no se trabaja con los puertos directamente, sino con los dispositivos (en este caso impresoras) que tenga instalados.
Por eso te decí­a yo el otro dí­a que es mejor hacerlo a la windows, no a la MS-DOS. Utiliza la clase TPrinter (o mejor dicho, el objeto público Printer) para imprimir. Y en el caso de que necesites enviar a la impresora la secuencia de caracteres directamente, sin que los procese el driver, puedes usar el método WriteData().
--
Un saludo,
José F. Giménez
--
José F. Giménez
[Equipo de Xailer / Xailer team]
http://www.xailer.com
http://www.xailer.info
Responder