Algo sobre Clipper 5.01

por Waldemar Vigo

[Números en letras][División de un texto en renglones][Lectura y grabación binaria][Preguntas de Gente Amiga][Uso del Mouse][Impresoras a Chorro de Tinta][Correo al autor]

Mi tarea es programar, específicamente en el entorno PC y más precisamente aún, con Clipper 5.01. Ante el embate de Bill Gates, la atracción del entorno gráfico, la popularidad de los sistemas operativos de 32 bits, la tendencia es dejar de lado este lenguaje por Visual Basic o algun otro afín. Sin embargo, la obsolescencia de un lenguaje de programación no tira por la borda la concepción de rutinas. Los conceptos de las rutinas pueden pasarse de un lenguaje a otros, a veces con cambios mínimos. Las que presento a continuación están destinadas a dos fines: dibujito

Si Ud halla alguna otra solución o una optimización de las presentes, sería de mi agrado conocerlas.
Si Ud va a hacer uso de esta rutina en sus programas -lo cual vería yo con mucho placer- simplemente hágamelo saber por e-mail. Esto es e-mailware, es decir de libre uso, pero be polite!
.


Conversión de números en texto

La rutina NTOL que convierte números en letras hace uso de matrices en memoria para almacenar las palabras que compondrán el texto final. Con un pequeño esfuerzo es posible usar archivos.dbf en lugar de esas matrices. El límite superior de mil millones es harto suficiente para la mayoría de las aplicaciones comerciales y también, con un pequeño esfuerzo, es posible ampliar este margen superior si fuere necesario.

Uso:

NTOL(nImporte) -> cImportEnLetras

nImporte es el total numérico que hay que representar con letras. El máximo es de mil millones. Si se suministra un número mayor, NTOL devuelve una cadena vacía.

cImportEnLetras es una cadena de caracteres que contiene el número expresado en letras, en idioma español.

Ejemplo:

? NTOL(2132,50) // Devuelve: "DOS MIL CIENTO TREINTA Y DOS CON 50/100"


* IMPORLET.PRG   Rutinas que convierten números con dos decimales en letras
*
********** Rutina válida para números menores de mil millones

FUNC NTOL(nNumero)
LOCAL nCentavos := (nNumero - INT(nNumero)) * 100
LOCAL cCadena := ''                         
LOCAL nMillon := 0
LOCAL nCienMil := 0

nNumero := INT(nNumero) 

IF nNumero < 1000000000   // Mil millones!!!
    IF nNumero > 999999   // es un millón o más, hasta 999 millones 
        nMillon := INT(nNumero/1000000)
        nNumero := nNumero - nMillon*1000000
        cCadena += BASE(nMillon, .T.) + IF(nMillon>1, ' MILLONES ', 'MILLON ')
    ENDIF

    IF nNumero > 999   // Son más de mil
        nCienMil := INT(nNumero/1000)
        nNumero := nNumero - nCienMil*1000
        cCadena += BASE(nCienMil, .F.) + ' MIL '
    ENDIF

    cCadena += BASE(nNumero, .T.)  

    IF .NOT.EMPTY(cCadena)
        cCadena += ' CON '
    ENDIF
    cCadena += STRZERO(nCentavos, 2) + '/100'                     
ENDIF

RETURN (STRTRAN(cCadena, '  ', ' '))

********** Se pasa el número <= 999 sin decimales

STATIC FUNC BASE(nNumero, lFin)
LOCAL cCadena := ''
LOCAL nUnidad := 0 
LOCAL nDecena := 0
LOCAL nCentena := 0

IF nNumero < 1000
    IF nNumero > 99
        nCentena := INT(nNumero/100)
        nNumero := nNumero - nCentena*100
        IF nCentena == 1 .AND. nNumero == 0
            cCadena += 'CIEN '
         ELSE
            cCadena += CENTENAS(nCentena) + ' '
        ENDIF
    ENDIF

    IF nNumero > 29
        nDecena := INT(nNumero/10)
        nNumero := nNumero - nDecena*10
        IF nNumero > 0
            cCadena += DECENAS(nDecena) + ' Y ' + UNIDAD(nNumero, F.) + ' '
         ELSE
            cCadena += DECENAS(nDecena) + ' '
        ENDIF
     ELSE
        cCadena += UNIDAD(nNumero, lFin)
    ENDIF
ENDIF

RETURN (cCadena)

********** lFin indica si debe tomarse UNO en lugar de UN

STATIC FUNC UNIDAD(nNumero, lFin)
LOCAL aUnidades := {'UN','DOS','TRES','CUATRO','CINCO','SEIS','SIETE', ;
'OCHO','NUEVE','DIEZ','ONCE','DOCE','TRECE','CATORCE', ;'QUINCE','DIECISEIS', ;
'DIECISIETE','DIECIOCHO','DIECINUEVE','VEINTE',;
'VEINTIUNO','VEINTIDOS', ;
'VEINTITRES','VEINTICUATRO','VEINTICINCO','VEINTISEIS',;
'VEINTISIETE', ;
'VEINTIOCHO','VEINTINUEVE'} 
LOCAL cCadena := ''

IF nNumero > 0
    IF nNumero == 1 .AND. lFin
        cCadena := 'UNO'
     ELSE
        cCadena := aUnidades[nNumero]
    ENDIF
ENDIF

RETURN (cCadena)

**********

STATIC FUNC DECENAS(nNumero)
LOCAL aDecenas := {'DIEZ','VEINTE','TREINTA','CUARENTA','CINCUENTA', ;
 'SESENTA','SETENTA','OCHENTA','NOVENTA'} 

RETURN (IF(nNumero==0, '', aDecenas[nNumero])) 

**********

STATIC FUNC CENTENAS(nNumero)
LOCAL aCentenas := {'CIENTO','DOSCIENTOS','TRESCIENTOS','CUATROCIENTOS', ;
 'QUINIENTOS','SEISCIENTOS','SETECIENTOS','OCHOCIENTOS','NOVECIENTOS' } 

RETURN (IF(nNumero==0, '', aCentenas[nNumero]))

Distribuir un texto en renglones

La rutina GRAPPA ha sido probada para que suministre una matriz donde cada elemento corresponde a un renglón, de modo que cada uno contenga palabras enteras, salvo que haya alguna cuyo largo sea mayor que el indicado en nCaracteres; en ese caso se trunca la palabra larga. Si hay retornos de carro intercalados -chr(13)+chr(10)- se los toma como un renglón más, en blanco.

Uso:

GRAPPA(cTexto, nCarac) -> aTexto

cTexto es la cadena de caracteres que hay que poner en renglones.

nCarac es el número de caracteres que tendrá como máximo cada renglón.

aTexto es una matriz de caracteres, donde cada elemento mide nCarac, el texto de cada renglón está recostado sobre la izquierda y está rellenado a la derecha con blancos.


********** Devuelve una matriz con elementos/renglones de nCaracteres cada uno.

FUNC GRAPPA(cCadena, nCaracteres)
LOCAL aTexto := {}
LOCAL nCont := 0
LOCAL lMuyLarga := .F.

cCadena := IF(cCadena == NIL, '', LTRIM(cCadena))
nCaracteres := IF(nCaracteres == NIL, 0, nCaracteres)

IF nCaracteres > 0
    IF LEN(cCadena) > nCaracteres
       WHILE LEN(cCadena) > 0
           WHILE chr(13)+chr(10) $ LEFT(cCadena, nCaracteres)
               IF LEFT(cCadena,2) == chr(13) + chr(10)
                   AADD(aTexto, SPACE(nCaracteres))     
               ELSE 
                   AADD(aTexto, PADR(LEFT(cCadena,AT(chr(13)+chr(10),cCadena)-1), nCaracteres))    
               ENDIF
               cCadena := SUBSTR(cCadena, AT(chr(13)+chr(10),cCadena)+2)
           ENDDO
           IF LEN(cCadena) <= nCaracteres
               AADD(aTexto, PADR(cCadena, nCaracteres))
               EXIT
           ELSE 
               IF SUBSTR(cCadena, nCaracteres, 1) == ' ' .OR. ;
                  SUBSTR(cCadena, nCaracteres+1, 1) == ' ' .OR. ;
                  SUBSTR(cCadena, nCaracteres, 1) == CHR(13) .OR. ;                  
                  SUBSTR(cCadena, nCaracteres+1, 1) == CHR(13)
                   *    El último carácter o el primero del siguiente es justo 
                   *        un espacio en blanco o un retorno de carro 
                   IF SUBSTR(cCadena, nCaracteres, 1) == CHR(13)
                       AADD(aTexto, PADR(LEFT(cCadena, nCaracteres-1), nCaracteres))                   
                       cCadena := LTRIM(SUBSTR(cCadena, nCaracteres))
                   ELSE 
                       AADD(aTexto, PADR(LEFT(cCadena, nCaracteres), nCaracteres))
                       cCadena := LTRIM(SUBSTR(cCadena, nCaracteres + 1))
                   ENDIF
               ELSE
                   nCont := nCaracteres
                   lMuyLarga := .T.
                   WHILE --nCont > 0
                       IF SUBSTR(cCadena, nCont, 1 ) == ' ' .OR. ;
                          SUBSTR(cCadena, nCont, 1 ) == CHR(13)
                           IF nCont == 1
                               IF SUBSTR(cCadena, nCont, 1) == CHR(13)
                                   AADD(aTexto, SPACE(nCaracteres))                                                    
                                   cCadena := LTRIM(SUBSTR(cCadena, 3))                                
                               ELSE 
                                   cCadena := LTRIM(SUBSTR(cCadena, 2))
                               ENDIF
                           ELSE
                               IF SUBSTR(cCadena, nCont, 1 ) == CHR(13)                               
                                   AADD(aTexto, PADR(LEFT(cCadena, nCont-1), nCaracteres))                                                
                                   cCadena := LTRIM(SUBSTR(cCadena, nCont))                           
                               ELSE  
                                   AADD(aTexto, PADR(LEFT(cCadena, nCont), nCaracteres))                 
                                   cCadena := LTRIM(SUBSTR(cCadena, nCont + 1))                               
                               ENDIF 
                               lMuyLarga := .F.
                           ENDIF
                           EXIT
                       ENDIF
                   ENDDO
                   IF lMuyLarga
                       AADD(aTexto, PADR(LEFT(cCadena, nCaracteres), nCaracteres))                
                       cCadena := LTRIM(SUBSTR(cCadena, nCaracteres + 1))
                   ENDIF
               ENDIF
           ENDIF
       ENDDO
    ELSE
       AADD(aTexto, cCadena)
    ENDIF
ELSE
    AADD(aTexto, '')
ENDIF

RETURN(aTexto)

********** 


Recortar un archivo binario

El presente código no es propiamente una rutina independiente. Por otra parte es muy específica de Clipper5.0x pero como usa funciones muy parecidas a las de C/C++ la cito por si quiere traspolarla.
Esta rutina fue desarrollada para "limpiar" un log compilado: había que eliminar la parte final del archivo sin tocar el comienzo.

nManejOut y nManejIn son los manejadores de los archivos NUEVO.LOG y VIEJO.LOG respectivamente.
Lee de a 50 caracteres (podría ser otra cantidad, pero debemos aseguramos que pueda caber la cadena buscada en ella), busca esa cadena (cConstante) y si la halla, graba los caracteres anteriores a la misma y finaliza.

cVariable debe tener 50 caracteres como mínimo, en el caso mencionado.
cVari es transitoria para no ejecutar dos veces un complejo de funciones y no escribirlas.
lBien es una variable lógica que es inicializada en .F. al crearla.
nLeidos es una variable numérica para detectar si se leyeron datos del archivo.
Por supuesto, todas las variables son locales.

IF (nManejOut := FCREATE('NUEVO.LOG')) # -1  
    IF (nManejIn := FOPEN('VIEJO.LOG')) # 0 
        WHILE .T. 
            IF (nLeidos := FREAD(nManejIn, @cVariable, 50))  > 0 
                IF cConstante $ cVariable                
                    cVari := LEFT(cVariable, AT(cConstante, cVariable)-1)
                    IF FWRITE(nManejOut, cVari, LEN(cVari)) # LEN(cVari)
                        ?'Error al grabar NUEVO.LOG'
                    ELSE
                        lBien := .T.
                    ENDIF
                    EXIT
                ELSE
                    IF FWRITE(nManejOut, cVariable, nLeidos) # nLeidos  
                        ?'Error al grabar NUEVO.LOG'
                    ENDIF
                ENDIF
            ELSE 
                EXIT 
            ENDIF 
        ENDDO 
        FCLOSE(nManejIn) 
    ENDIF  
    FCLOSE(nManejOut) 
ENDIF 

IF lBien
    FERASE('VIEJO.LOG')
    RUN COPY NUEVO.LOG VIEJO.LOG
    FERASE('NUEVO.LOG')
ENDIF

Uso del Ratón con Clipper 5.01/5.02

dibujitoAunque parezca extemporáneo, varios amigos han preguntado por una rutina que permita el uso del mouse con Clipper 5.01/5.02.

Luego de revisar muchos cajones (la verdad es que nunca hice una aplicación real que las utilizara) las pongo a vuestra disposición.

Las rutinas siguientes fueron suministradas por el maestro Gustavo Gretter.

Sería de buena educación, en caso de usarlas, enviarle un e-mail agradeciéndoselo.

include macros.mac

CODE SEGMENT
ASSUME CS:CODE

public ResetMouse
public MouseOn
public MouseOff
public GetMouseX
public GetMouseY
public GetLeft
public GetRight
;
ResetMouse PROC FAR

        xor      ax,ax
        int      33h
        ret

ResetMouse ENDP
;
MouseOn PROC FAR

        mov      ax,1
        int      33h
        ret

MouseOn ENDP
;
MouseOff PROC FAR

        mov      ax,2
        int      33h
        ret

MouseOff ENDP
;
GetMouseX PROC FAR

        mov       ax,3
        int       33h
        push      cx
        call      __retni
        add       sp,2
        ret

GetMouseX ENDP
;
GetMouseY PROC FAR

        mov       ax,3
        int       33h
        push      dx
        call      __retni
        add       sp,2
        ret

GetMouseY ENDP
;
GetLeft PROC FAR

        mov        ax,3
        int        33h
        and        bx,1
        push       bx
        call       __retni
        add        sp,2
        ret

GetLeft ENDP
;
GetRight PROC FAR

        mov        ax,3
        int        33h
        and        bx,2
        push       bx
        call       __retni
        add        sp,2
        ret

GetRight ENDP
;
CODE ENDS
END

Una vez compiladas (puede ser con MASM5), se obtendrá el .OBJ que luego será linkeditado con el fuente.PRG que hayan construido y serán invocadas así:

cls
MouseOn()
WHILE .T.
  @ 10,10 SAY GetMouseX()/8 
  @ 11,10 SAY GetMOuseY()/8
  IF GetLeft()!=0
      ? chr(7)
  ENDIF
  IF GetRight()!=0
      ? chr(7)
      ? chr(7)
  ENDIF
ENDDO
MouseOff()

Caracteres de Control a Impresoras de Chorro de Tinta

Cayó en nuestras manos, luego de ingentes esfuerzos, unas tablas de caracteres de control que deben enviarse a las impresoras de Chorro de tinta para que acepten compresión, letra cursiva, etc. pudiéndose aplicar desde una rutina DOS incluso.

Como el texto es muy largo irá apareciendo de a poco, a medida que el ánimo me contagie.


Comandos de Impresoras HP DeskJet 6xx y 8xx Series

Este documento lista los comandos de impresora HP DEskJet PCL para formato básico de página y selección de fuentes. Si necesita más información acerca de los comandos PCL, por favor use el Manual de Referencia Técnica (part number 2170-90099).

Algunas indicaciones sobre el uso de los comandos PCL
Los comandos están listados en orden jerárquico y también se dan las equivalencias decimales y hexadecimales.
Valores entre paréntesis "(x)" identifican la minúscula del carácter de terminación que es usado para combinar comandos.
Ec representa el carácter escape para su software. En el Edit de DOS el caracter escape se lo obtiene pulsando simultáneamente la tecla Control y presionando la letra P. Liberar ambas teclas y presionar la tecla Esc.
# and #...# representan variables que debe reemplazar con los números necesarios para completar los comandos requeridos.
Por ejemplo, para definir el número de copias a 14, Ec&l#X, reemplace el # o #...# con:
     Ascii: 14
     Decimal: 049 052
     Hexadecimal: 31 34


Puede usar la siguiente tabla para convertir valores ASCII a valores decimales o hexadecimales:

ASCII
value
Hex Dec Descripción
0 30 48 Cero
1 31 49 Uno
2 32 50 Dos
3 33 51 Tres
4 34 52 Cuatro
5 35 53 Cinco
6 36 54 Seis
7 37 55 Siete
8 38 56 Ocho
9 39 57 Nueve
. 2E 46 Punto

Comandos de impresión
Esta sección describe los comandos de impresión y los códigos de control para esta impresora. Consulte el manual de la aplicación de software o el manual de referencia técnica para obtener mayor información acerca de los comandos de impresión.

Principios básicos de los comandos de impresión
Este instructivo utiliza las siguientes convenciones en los ejemplos de los comandos de impresión:

"l" minúscula = "l" Número "uno" = "1"
"O" mayúscula = "O" Número "cero"="0"

El carácter "l" no aparece en la pantalla.
Tenga presente lo siguiente al usar los comandos de impresión:

  • Aparecen espacios en los comandos de impresión usados como ejemplos únicamente para facilitar su lectura. No añada espacios a los comandos de impresión.
  • La impresora reconoce los comandos de impresión únicamente cuando las letras mayúsculas y minúsculas se escriben correctamente.
  • Si se envía un comando de impresión para cambiar una característica de impresión, el comando permanecerá en efecto hasta que se envíe otro comando de impresión.
  • La impresora regresa a la configuración por omisión de los conmutadores cuando se enciende o apaga, o cuando se presiona la tecla RESET en el panel de control. Si se envía el comando EcE (reinicializar la impresora), la impresora regresa a las definiciones de la modalidad y de los tipos hechas más recientemente a través del panel de control.

Cómo combinar los comandos de impresión
Pueden combinarse los comandos de impresión que contienen dos caracteres iguales que siguen al carácter "Escape·". Combine los comandos empezando con el comando de impresión Ec y los dos caracteres compartidos, luego agregue los caracteres restantes de cada uno de los comandos.

Ejemplo:
Estos comandos de impresión: Ec(s3T Ec(s3B Ec(s2Q
Pueden combinarse entre sí: Ec(s3TEc(s3BEc(s2Q
"Ec(s" es la porción del comando que comparten los tres comandos. En los comandos combinados, la "b" y la "t" se escriben en minúscula, mientras que la "Q", debido a que es el último carácter, permanece en mayúscula para indicarle a la impresora que el comando ha terminado.

Algunas reglas para combinar los comandos de impresión:

  • Combine solamente los comandos que compartan los primeros dos caracteres inmediatamente después del carácter Ec.
  • En los comandos combinados, todo carácter alfabético debe escribirse con letras minúsuclas, con excepción del último carácter. En los comandos combinados, el último carácter debe escribirse en letra mayúsucla para indicarle a la impresora que el comando ha terminado.
  • Los comandos de impresión toman efecto a medida que el software los encuentra (de izquierda a derecha). Combínelos en el orden que debe realizarlos la impresora.

Cómo usar los equivalente decimales o hexadecimales
Es posible que el software exija que se envíen comandos de impresión en forma decimal o hexadecimal. Cuando se convierte una secuencia de escape ASCII a su equivalente decimal o hexadecimal, los caracteres que aparecen como valores numéricos son únicamente caracteres ASCII. Es por eso que el comando de impresión Ec(15U es la serie de caracteres: Ec,(,1,5,U, que cuando se convierten al equivalente decimal aparecen como
027 040 049 053 085.
Los tres comandos de impresión para una página con orientación apaisada son:

Secuencia de escape Ec & l 1O
Equivalente decimal 027 038 108 049 079
Equivalente hexadecimal 1B 26 6C 31 4F

Cómo usar comandos de impresión para seleccionar tipos
Cuando se usa un comando de impresión para seleccionar tipos, se selecciona entre varias características de tipos para imprimir uno. Cada característica posee un comando de impresión y una prioridad.

Prioridad Característica Comando de impresión #=valor numérico
1 Orientación Ec & l # 0 0=vertical, 1=apaisada
2 Conjunto de caracteres Ec(#U Consulte la sección "Referencia" del capítulo 5 para obtener valores
3 Espaciado Ec(s#P 0=fijo, 1=proporcional
4 Pitch Ec(s#H depende de los pitchs disponibles
5 Tamaño del punto Ec(s#V depende los tamaños de pitch disponibles
6 Estilo Ec(s#S 0=vertical, 1=cursiva
7 Impacto Ec(s#B 0=normal, 3=negrita
8 Tipo de letra Ec(s#T Consulte la sección "Referencia" del capítulo 5 para obtener valores

Cuando se selecciona un tipo con los comandos de impresión, debe enviarse el comando correcto para cada característica. Use la lista de prioridades de la impresora para asegurarse de que se imprimirán los tipos correctos.

Envíe el comando para el pitch para seleccionar Letter Gothic de pitch 12, de 12 puntos. El valor por omisión de la característica del pitch es 10. Si no se envía el comando para pitch 12, se imprimirá el tipo por omisión Courier de pitch 10 debido a que la característica del pitch prevalece sobre la del tipo de letra. Para seleccionar el tipo Courier, cursiva, de pitch 10, de 12 puntos, envíe el siguiente comando de impresión:
Ec & l 0O 10U 0p 10h 12v 1s 0b 3t

O, para elegir el tipo CG Times (PS, 12 puntos), envíe:
Ec & l 0O 10U 1p 12v 0s 0b 410t


Resumen de los comandos de impresión HP PCL
Característica Comando Equivalente Decimal Equivalente Hexad.
Control de la Impresora
Reinicializar EcE 027 069 1B 45
Autoverificación Ecz 027 122 1B 7A
Control de la entrada del papel (fuente del medio)
Expulsar medio Ec & l 0 H 027 038 108 048 072 1B 26 6C 30 48
Alimentar desde bandeja Ec & l 1 H 027 038 108 049 072 1B 26 6C 31 48
Alimentar sobre Ec & l 3 H 027 038 108 051 072 1B 26 6C 33 48
Modalidad de impresión (texto)
Unidireccional izq. a der. Ec & k 0 W 027 038 107 048 087 1B 26 6B 30 57
Bidireccional Ec & k 1 W 027 038 107 049 087 1B 26 6B 31 57
Unidireccional der. a izq. Ec & k 2 W 027 038 107 050 087 1B 26 6B 32 57
Subrayado
Simple fijo Ec & d 1 D 027 038 100 049 068 1B 26 64 31 44
Doble fijo Ec & d 2 D 027 038 100 050 068 1B 26 64 32 44
Simple flotante Ec & d 3 D 027 038 100 051 068 1B 26 64 33 44
Doble flotante Ec & d 4 D 027 038 100 052 068 1B 26 64 34 44
Apagar Ec & d @ 027 038 100 064 1B 26 64 40
Fin de avance de línea
Activado Ec & s 0 C 027 038 115 048 067 1B 26 73 30 43
Desactivado Ec & s 1 C 027 038 115 049 067 1B 26 73 31 43
Datos transparentes de la impresora
Nro. de bytes Ec & p # X [data] 027 038 112 # 088 [data] 1B 26 70 # 58 [data]
Funciones de representación
Activado EcY 027 089 1B 59
Desactivado EcZ 027 090 1B 5A
Control del Subrayado
Activar línea por línea Ec & k 0 E 027 038 107 048 069 1B 26 6B 30 45
Desactivar línea por línea Ec & k 1 E 027 038 107 049 069 1B 26 6B 31 45
Control de cambio (SI/SO)
Activar línea por línea Ec & k 0 F 027 038 107 048 070 1B 26 6B 30 46
Desactivar línea por línea Ec & k 1 F 027 038 107 049 070 1B 26 6B 31 46
Control de la Página
Orientación de la página*
Apaisada Ec & l 1 O 027 038 108 049 079 1B 26 6C 31 4F
Vertical Ec & l 0 O 027 038 108 048 079 1B 26 6C 30 4F
Tamaño del papel*
Tamaño por omisión Ec & l 0 A 027 038 108 048 065 1B 26 6C 30 41
Carta EE.UU. Ec & l 2 A 027 038 108 050 065 1B 26 6C 32 41
Legal EE.UU. Ec & l 3 A 027 038 108 051 065 1B 26 6C 33 41
A4 Ec & l 26 A 027 038 108 050 054 065 1B 26 6C 32 36 41
Sobre Nro. 10 (apaisada) Ec & l -81 A 027 038 108 045 056 049 065 1B 26 6C 2D 38 31 41
Espaciado de línea
Líneas por pulgada por número de líneas Ec & l # D 027 038 108 # 068 1B 26 6C # 44
Longitud de la página*
Número de líneas Ec & l # P 027 038 108 # 080 1B 26 6C # 50
Fin de línea
RC => RC, LF => LF, FF => FF Ec & k 0 G 027 038 107 048 071 1B 26 6B 30 47
RC => CR+LF, LF => LF, FF => FF Ec & k 1 G 027 038 107 049 071 1B 26 6B 31 47
RC => RC+LF, LF => RC+LF, FF => RC+FF Ec & k 3 G 027 038 107 051 071 1B 26 6B 33 47
Salto de la perforación
Activado Ec & l 1 L 027 038 108 049 076 1B 26 6C 31 4C
Desactivado Ec & l 0 L 027 038 108 048 076 1B 26 6C 30 4C
Margen superior*
Número de líneas Ec & l # E 027 038 108 # 069 1B 26 6C # 45
Longitud del texto*
Número de líneas Ec & l # F 027 038 108 # 070 1B 26 6C # 46
Márgenes laterales*
Izquierdo (columna número) Ec & L 027 038 097 # 076 1B 26 61 # 4C
Derecho (columna número) Ec & M 027 038 097 # 077 1B 26 61 # 4D
Escalar el Texto
Desactivada Ec & k 5 W 027 038 107 053 087 1B 26 6B 35 57
Activada Ec & k 6 W 027 038 107 054 087 1B 26 6B 36 57
Colocación del cursor
Número del índice del movimiento horizontal en incrementos de 1/120avos de pulgada Ec & k # H 027 038 107 # 072 1B 26 6B # 48
Moverse a la columna número Ec & a # C 027 038 097 # 067 1B 26 61 # 43
Número horizontal (decipuntos) Ec & a # H 027 038 097 # 072 1B 26 61 # 48
Número horizontal (puntos) Ec * p # X 027 042 112 # 088 1B 2A 70 # 58
Número del índice del movimiento vertical en incrementos de 1/48avos de pulgada Ec & l # C 027 038 108 # 067 1B 26 6C # 43
Moverse a la fila número Ec & a # R 027 038 097 # 082 1B 26 61 # 52
Número vertical (decipuntos) Ec & a # V 027 038 097 # 086 1B 26 61 # 56
Número vertical (puntos) Ec * p # Y 027 042 112 # 089 1B 2A 70 # 59
Selección del Tipo
Conjunto de caracteres
PC-8 Ec( 10 U 027 040 049 048 085 1B 28 31 30 55
HP Roman8 Ec( 8 U 027 040 056 085 1B 28 31 38 55
PC-8 Danés/Noruego Ec( 11 U 027 040 049 049 085 1B 28 31 31 55
PC-850 Ec( 12 U 027 040 049 050 085 1B 28 31 32 55
ECMA-94 Latín 1 Ec( 0 N 027 040 048 078 1B 28 30 4E
Alemán ISO 21 Ec( 1 G 027 040 049 071 1B 28 31 46
Francés ISO 69 Ec( 1 F 027 040 049 070 1B 28 31 46
Italiano ISO 15 Ec( 0 I 027 040 048 073 1B 28 30 49
Español ISO 17 Ec( 2 S 027 040 050 083 1B 28 32 53
Sueco ISO 11 Ec( 0 S 027 040 048 083 1B 28 30 53
Sueco ISO 10 Ec( 3 S 027 040 051 083 1B 28 33 53
Noruego ISO 60 Ec( 0 D 027 040 048 068 1B 28 30 44
Noruego ISO 61 Ec( 1 D 027 040 049 068 1B 28 31 44
Noruego ISO 61 Ec( 1 D 027 040 049 068 1B 28 31 44
Portugués ISO 16 Ec( 4 S 027 040 052 083 1B 28 34 53
Reino Unido ISO 4 Ec( 1 E 027 040 049 069 1B 28 31 45
ANSI ASCII ISO 6 Ec( 0 U 027 040 048 085 1B 28 30 55
JIS ASCII Ec( 0 K 027 040 048 075 1B 28 30 4B
Legal HP Ec( 1 U 027 040 049 085 1B 28 31 55
ISO IRV Ec( 1 U 027 040 049 085 1B 28 31 55
Line Draw (opcional) Ec( 0 L 027 040 048 076 1B 28 30 4C
Matemáticas 7 (opcional) Ec( 0 M 027 040 048 077 1B 28 30 4D
Matemáticas 8 (opcional) Ec( 8 M 027 040 056 077 1B 28 38 4D
Matemáticas 8a (opcional) Ec( 0 Q 027 040 048 081 1B 28 30 51
Matemáticas 8b (opcional) Ec( 1 Q 027 040 049 081 1B 28 31 51
PIFont (opcional) Ec( 15 U 027 040 049 053 085 1B 28 31 35 55
PIFonta (opcional) Ec( 2 Q 027 040 050 081 1B 28 32 51
... ... ... ...
Espaciado*
Proporcional Ec( s 1 P 027 040 115 049 080 1B 28 73 31 50
Fijo Ec( s 0 P 027 040 115 048 080 1B 28 73 30 50
Pitch de impresión*
Nro. de caracteres por pulgada Ec(s # H 027 040 115 # 072 1B 28 73 # 48
Tamaño del punto (Altura del carácter)*
Nro. de 1/72 avos de pulgada Ec( s # V 027 040 115 # 086 1B 28 73 # 56
Estilo*
Vertical Ec( s 0 S 027 040 115 048 083 1B 28 73 30 53
Cursiva Ec( s 1 S 027 040 115 049 083 1B 28 73 31 53
Impacto*
Negrita Ec( s 3 B 027 040 115 051 066 1B 28 73 33 42
Normal Ec(s 0 B 027 040 115 048 066 1B 28 73 30 42
Extra Negrita (opcional) Ec(s 7 B 027 040 115 055 066 1B 28 73 37 42
Tipo de letra*
Courier Ec(s 3 T 027 040 115 051 084 1B 28 73 33 54
CG Times Ec(s 4101 T 027 040 115 052 049 048 049 084 1B 28 73 34 31 30 31 54
Letter Gothic Ec(s 6 T 027 040 115 054 084 1B 28 73 36 54
Univers (opcional) Ec(s 52 T 027 040 115 053 050 084 1B 28 73 35 32 54
Pica (opcional) Ec(s 1 T 027 040 115 049 084 1B 28 73 31 54
Prestige (opcional) Ec(s 8 T 027 040 115 056 084 1B 28 73 38 54
Elite (opcional) Ec(s 2 T 027 040 115 050 084 1B 28 73 32 54
Script (opcional) Ec(s 7 T 027 040 115 055 084 1B 28 73 37 54
Helvetica (opcional) Ec(s 4 T 027 040 115 052 084 1B 28 73 34 54
Presentations (opcional) Ec(s 11 T 027 040 115 049 049 084 1B 28 73 31 31 54
Times Roman (opcional) Ec(s 5 T 027 040 115 053 084 1B 28 73 35 54
CG Century Schoolbook (opcional) Ec(s 23 T 027 040 115 050 051 084 1B 28 73 32 33 54
Brush (opcional) Ec(s 32 T 027 040 115 051 050 084 1B 28 73 33 32 54
Dom Casual (opcional) Ec(s 61 T 027 040 115 054 049 084 1B 28 73 36 31 54
Univers Condensed (opcional) Ec(s 85 T 027 040 115 056 053 084 1B 28 73 38 35 54
Garamond (opcional) Ec(s 101 T 027 040 115 049 048 049 084 1B 28 73 31 30 31 54
CG Triunvirate (opcional) Ec(s 4 T 027 040 115 052 084 1B 28 73 34 54
Calidad de Impresión
Correspondencia Ec(s 2 Q 027 040 115 050 081 1B 28 73 32 51
Borrador Ec(s 1 Q 027 040 115 049 081 1B 28 73 31 51
Manejo de la carga de los tipos
Nro. de ID del Tipo Ec * c # D 027 042 099 # 068 1B 2A 63 # 44
Nro. del código ASCII Ec * c # E 027 042 099 # 069 1B 2A 63 # 45
Borrar todo Ec c 0 F 027 042 099 048 070 1B 2A 63 30 46
Borrar último Ec c 2 F 027 042 099 050 070 1B 2A 63 32 46
Hacer temporales Ec c 4 F 027 042 099 052 070 1B 2A 63 34 46
Hacer temporales Ec c 5 F 027 042 099 053 070 1B 2A 63 35 46
Crear número de bytes del tipo Ec ) s # W [data] 027 041 115 # 087 [data] 1B 29 73 # 57 [data]
Crear número de bytes del caract. Ec(s # W [data] 027 040 115 # 087 [data] 1B 28 73 # 57 [data]
Selec. nro. primario de ID Ec( # X 027 040 # 088 1B 28 # 58
Selec. nro. secundario de ID Ec) # X 027 041 # 088 1B 29 # 58
Gráficos de Barrido
Comenzar gráficos de barrido
Extremo izquierdo Ec* r 0 A 027 042 114 048 065 1B 2A 72 30 41
Posición actual del cursor Ec* r 1 A 027 042 114 049 065 1B 2A 72 31 41
Terminar gráficos de barrido
Terminar gráficos Ec* r b C 027 042 114 098 067 1B 2A 72 62 43
Resolución
75 puntos por pulgada Ec* t 75 R 027 042 116 055 053 082 1B 2A 74 37 35 52
100 puntos por pulgada Ec* t 100 R 027 042 116 049 048 048 082 1B 2A 74 31 30 30 52
150 puntos por pulgada Ec * t 150 R 027 042 116 049 053 048 082 1B 2A 74 31 35 30 52
300 puntos por pulgada Ec * t 300 R 027 042 116 051 048 048 082 1B 2A 74 33 30 30 52
Configurar datos de barrido Ec * g # W 027 042 103 # 087 1B 2A 67 # 57
Fijar ancho de gráficos de barrido
Número de píxeles Ec * r # S 027 042 114 # 083 1B 2A 72 # 53
Modalidad de impresión (gráficos)
Gráficos por omisión (sin quiebre) Ec * p 0 N 027 042 116 055 053 082 1B 2A 74 37 35 52
Bidireccional Ec * p 1 N 027 042 116 049 048 048 082 1B 2A 74 31 30 30 52
Izquierda a derecha Ec * p 2 N 027 042 116 049 053 048 082 1B 2A 74 31 35 30 52
Derecha a izquierda Ec * p 3 N 027 042 116 051 048 048 082 1B 2A 74 33 30 30 52
Bidireccional condicional Ec * p 4 N 027 042 103 # 087 1B 2A 67 # 57
Fijar compresión de gráficos de barrido
Método 0 Ec * b 0 M 027 042 098 048 077 1B 2A 62 30 4D
Método 1 Ec * b 1 M 027 042 098 049 077 1B 2A 62 31 4D
Método 2 Ec * b 2 M 027 042 098 050 077 1B 2A 62 32 4D
Método 3 Ec * b 3 M 027 042 098 051 077 1B 2A 62 33 4D
Método 9 Ec * b 9 M 027 042 098 057 077 1B 2A 62 39 4D
Seed Row Source Ec * b # S 027 042 098 # 083 1B 2A 62 # 53
Transferir gráficos de barrido
Número de bytes Ec * b # W [data] 027 042 098 # 087 [data] 1B 2A 62 # 57 [data]
Transfer graphics data by plane Ec * b # V data 027 042 098 #...# 086 data 1B 2A 62 #...# 56 data
Movimiento vertical relativo del pixel (previamente llamado gráficos Y Offset)
Número de puntos Ec * b # Y 027 042 098 # 089 1B 2A 62 # 59
Configurar la calidad de gráficos
Calidad Borrador Ec * r 1 Q 027 042 114 049 081 1B 2A 72 31 51
Calidad similar a Correspondencia Ec * r 2 Q 027 042 114 050 081 1B 2A 72 32 51
Fijar número de planos de barrido por línea
Color del primer plano Ec * r 1 U 027 042 114 049 085 1B 2A 72 31 55
3 planos, paleta CYM Ec * r - 3 U 027 042 114 045 051 055 1B 2A 72 2D 33 37
3 planos, paleta RGB Ec * r 3 U 027 042 114 051 055 1B 2A 72 33 37
Comandos misceláneos de gráficos de barrido
Entrelazado-gráficos de barrido Ec * o # Q 027 042 111 # 081 1B 2A 6F # 51
Reducción-gráficos de barrido Ec * o # D 027 042 111 # 068 1B 2A 6F # 44
* Los comandos de impresión se muestran en el orden en que deben ser enviados. # indica el valor numérico

Códigos de control HP PCL

El código de control es un cáracter que inicia una función de la impresora. Para generar CTRL, presione la tecla de control en el teclado de la computadora al escribir el carácter. Esta tecla podría rotularse: CTRL, CNTL o CTL. La siguiente tabla enumera los códigos HP PCL que la impresora reconoce. La columna "Pulsación" indica la letra que deben presionarse con la tecla CTRL para enviar un código de control. La posición "Posición actual de impresión" en la columna "Descripción" es la posición donde la impresora imrpime el siguiente carácter.

Nombres de código Símbolo Descripción Valor Dec. Valor Hex. Pulsación
Retroceso BS Mueve la posición de impresión un carácter a la izquierda. 08 08 Ctl H
Tab. Horizontal HT Hace que la impresora se mueva a la siguiente posición predefinida del tabulador. (Los tabuladores se han fijado cada octava posición de carácter, empezando en el margen izquierdo.) 09 09 Ctl I
Salto de Línea LF Avanza los medios una línea según el espaciado actual que se haya fijado. 10 0A Ctl J
Salto de hoja FF Avanza el medio al siguiente tope del papel. El tope del papel es la primera línea de impresión en la siguiente página. 12 0C Ctl L
Retorno del carro CR Mueve la posición de impresión actual un carácter hacia la izquierda. No avanza el papel. 13 0D Ctl M
Desactivar cambio S0 Selecciona el uso del conjunto secundario de caracgteres. 14 0E Ctl N
Activar cambio S1 Selecciona el uso del conjunto primario de caracteres. 15 0F Ctl O
Control de dispositivo 1 <D1> Se usa sólo para el protocolo RS-232-C. Se usa como el carácter XON para el protocolo RS-232-C XON/XOFF. Se usa también para activar la petición del estado. 17 11 Ctl Q
Control de dispositivo 3 <D3> Se usa sólo para el protocolo RS-232-C. Se usa como el carácter XON para el protocolo RS-232-C XON/XOFF. 19 13 Ctl S
Escape EC Le indica a la impresora que los caracteres que siguen forman parte del comando de impresión. 27 1B Ctl [

Especificaciones

Método de impresión
Impresión termal por rocío de tinta sobre papel corriente.
Velocidad de impresión con tinta negra*
Velocidad de impresión, tinta negra, en MSWindows
Modalidad Presentación: 1 página por minutos.
Modalidad Normal: 2 páginas por minutos
Modalidad Borrador: 3 páginas por minuto
Velocidad de impresión, tinta a color, en MSWindows
Modalidad Presentación: 7 minutos por página
Modalidad Normal: 4 minutos por página
Modalidad Borrador: 3 minutos por página
Velocidad del mecanismo DOS (tinta negra)
Modalidad correspondencia: 167 cps a 10 cpp
Modalidad Borrador: 240 cps a 10 cpp
Velocidad del mecanismo DOS a color
La velocidad de impresión depende del contenido del documento, la aplicación de software y la configuración del sistema.
Estructura de la celda
Modalidad Correspondencia: 300 x 300 dpi
Modalidad Borrador: 300 x 150 dpi
Resolución de los gráficos
Página entera 75, 100, 150, 300 dpi
Lenguaje de los comandos de la impresora
HP PCL Level 3
Soporte para los conjuntos de caracteres
HP Roman8, PC-8 (D/N), ISO 7 bit languages (Alemán, Francés, Italiano, Noruego, Portugués, Sueco, Español, R.U.) JIS ASCII, ASCII, ECMA-94 Latín 1, HP Legal, HP Line Draw, Math y Pl.
Tipos incorporados (internos)
Vertical:
Courier Pitch: 5, 10, 16.67, 20. Tamaño de pt: 6, 12 pt. Estilo: Vertical, Cursiva, Impacto: Normal, Negrita.
CG Times Pitch: Proporcional. Tamaño del pt.: 6, 12. Estilo: Vertical, Cursiva. Impacto: NOrmal, Negrita.
Letter Gothic Pitch: 6, 12, 24. Tamaño del pt.: 6, 12. Estilo: Vertical, Cursiva. Impacto: Normal, Negrita.
Otras características de impresión: expandido, subrayado, **subrayado doble,**sub/superíndice..
Apaisada:
Courier Pitch: 10, 16.67, 20. Tamaño de pt.: 6, 12, 24. Estilo: Vertical. Impacto: Normal, Negrita.
Peso del medio de impresión
Papel: 60 a 90 g/m2 (16 a 24 lbs.)
Tamaño de los medios de impresión
Carta EE.UU. (216 x 279 mm - 8.5 x 11")
A4 Europeo (210 x 297 mm)
Legal EE.UU. (216 x 356 mm - 8.5 x 14")
Transparencia EE.UU. (216 x 279 m - 8.5 x 11")
Transparencia A4 Europea (210 x 297 mm)
Sobre Nro.10 EE.UU. (104.7 x 241.3 - 4,12 x 9,5")
Manejo del medio de impresión
Alimentador automático (hasta 100 hojas)
Papel corriente, papel suelto HP CX JetSeries
CutSheet, película para transparencias
HP LX JetSeries
Alimentación manual de sobres
Panel de control
Teclas
Quality (calidad), Status (estado), Busy (ocupada), Load/Eject Papel (cargar/expulsar el papel), Print Cartridge (cartucho de impresión), Clean (limpiar), Envelope (sobre), Reset (reiniciar).
Luces
Draft (borrador), Ready (lista), Busy (ocupada), Portrait (vertical), Compress (comprimida).
Interfaz doble E/S
Paralela Centronics
RS-232-C en serie

Por más información sobre PCL Printer Commands ... haga una búsqueda en www.google.com o www.altavista.com con "PCL Printer Commands" ... y suerte!
Por si no encuentra nada, aquí hay algunos sitios con indicaciones pertinentes:
http://www.hp.com/cposupport/printers/support_doc/bpl02705.html
http://web.1asphost.com/agostinho/kb/content_by_cat.asp?catid=104
http://rabbit.eng.miami.edu/info/hp-pcl.html
http://techref.massmind.org/techref/language/pcls.htm


[Números en letras][División de un texto en renglones][Lectura y grabación binaria][Preguntas de Gente Amiga][Uso del Mouse][Impresoras a Chorro de Tinta][Correo al autor]



wvigo@adinet.com.uy

Última actualización de esta página: 12/IV/1998
Página inicial: http://www.chasque.apc.org/avigo