Revistas en papel
 Commodore Amiga World Nº2 - Septiembre 1989
Anterior
MenĂº
Logotipo

El Amiga Me Encanta ha conseguido el permiso por escrito de IDG Comunications España
para ofrecer los artículos de la revista Amiga World España.

PEQUEÑAS UTILIDADES Amiga World

Para aprovechar
toda la potencia
del AmigaBasic
hay que saber
utilizar todos los
recursos y trucos
disponibles. En
esta sección
encontrarás rutinas
que puedes incluir
en tus propios
programas.

Por Alvaro F. Mingo

VERIFY

Los que hayan programado en otras máquinas con BASIC habrán notado la ausencia de un pequeño comando que facilita las tareas con ficheros: VERIFY. Esta instrucción permite comprobar la existencia de un determinado fichero en un determinado disco, y es necesaria cuando un programa usa ficheros de datos elegibles por el ordenador. Cuando se accede al fichero con un comando como LOAD, MERGE, CHAIN no hay problema, puesto que la no existencia del fichero provoca un mensaje de error 53 (File Not Found) que se puede desviar fácilmente con una instrucción ON ERROR.

El problema surge cuando el programa accede al fichero con un APPEND (OPEN "A",#1,"NOMBRE"), puesto que si no existe el fichero, será creado, provocando una situación atípica que puede poner en jaque al ordenador, o simplemente llenar el disco con ficheros inútiles.

Para evitar pues esta última situación he creado un pequeño subprograma que comprueba la existencia de ficheros. Para utilizarlo incluya el programa del listado 1 al principio del programa principal, y para comprobar la existencia de un fichero introduzca su nombre en una cadena, por ejemplo E$, y pásela al programa: CALL Veryfy (E$). si cuando el programa devuelva el control, E$="", entonces dicho fichero no existe. Al contrario, si E$ ="NOmbreFichero" entonces el fichero si existe.

El funcionamiento del programa es muy sencillo. Primero realiza un APPEND del fichero que tiene que investigar, luego lo cierra y lo vuelve a abrir, pero esta vez para la lectura: INPUT. Si cuando lo lea verifica que no contiene nada entonces deduce que dicho fichero no existía y lo borra, colocando F$="". Si no le gusta que sea F$="" cuando no exista, puede hacer que F$ sea igual a cualquier otra cosa, por ejemplo: F$="No existe", de esta manera el subprograma devolverá "No existe" en la variable dek fichero cuando no se encuentra en el disco. Observe la estructura del bucle: se repetirá hasta que encuentre algún dato (entonces F$ existe) o hasta que llegue al final del fichero sin encontrar nada (luego F$ no existe), ambas posibilidades son estudiadas al final con un IF que coloca la respuesta en la propia variable para ahorrar memoria. Por esta razón, si le interesa saber el nombre del fichero aunque no exista, es una buena idea duplicarlo antes de procesarlo con este programa.

Programa VERIFY
' Rutina VERIFY                .236
' (C)1989 BY Alvaro F. Mingo   .552
' (C)1989 BY Commodore World   .456
SUB Verify(F$) STATIC          .658
b%=0                           .565
OPEN "A",#1,F$                 .902
CLOSE 1                        . 56
OPEN "I",#1,F$                 .475
WHILE NOT EOF(1) AND b%=0      .178
LINE INPUT#1,a$                .806
IF a$<>"" THEN b%=1            .444
WEND                           . 89
CLOSE 1                        . 56
IF b%=0 THEN KILL F$:F$=""     .275
END SUB                        .214
Numero de lineas: 15


SITUAR


Es frecuente que al programar se necesite representar datos en una posición concreta de la pantalla. En un ordenador normal esto es muy sencillo, puesto que el formato de la pantalla no cambia. Pero en un Amiga es diferente. Por ello he programado una pequeña utilidad para situar un texto en las posiciones más frecuentes: Arriba, Abajo, Izquierda, Derecha y Centro.

El formato es el siguiente:

     situar [Cadena], [Opciones: HDIVAE0]
  • Horizontal:
    H Centrar horizontalmente
    D Colocar a la derecha
    I Colocar a la izquierda

  • Vertical:
    V Centrar verticalmente
    A Colocar en la última línea
    E Colocar en la primera línea
    O Olvidar nueva posición y colocar el cursor en su posición original

Pueden incluirse hasta tres datos desordenados en las opciones, uno de horizontalidad, otro de verticalidad y otro para que vuelva a colocar el cursor en la posición original (O). Por ejemplo: situar "Hola", "HE" esto coloca Hola en el medio de la primera línea y el cursor se mantendrá al lado de Hola. Para forzar que vuelva a su posición original deberíamos haber puesto la opción O, es decir: situar "Hola", "HEO".

Si colocan varios datos de horizontalidad o de verticalidad, el programa activará el que se encuentre más adentrado en el programa. Por ejemplo, situar "Hola", "HI" o situar "Hola", "IH" producirá un alineamiento a la izquierda (I).

Veamos cómo funciona el programa:

  1. La primera variable que se inicializa es ac%=8. Este es el tamaño de la fuente de caracteres, y permite estimar las posiciones. Su valor más corriente es 8, que es el tamaño de la fuente por defecto TOPAZ 8. Si se utiliza otro tamaño de letra, debe cambiarse.

  2. Seguidamente se asigna la longitud de la cadena a LE% y se convierten a mayúsculas las opciones. De esta forma las opciones podrán entrarse en mayúsculas o en minúsculas.

  3. Luego se calcula el ancho y la altura en caracteres de la ventana, y se memoriza la posición del cursor.

  4. Ahora, gracias a la instrucción INSTR, se localizan las opciones que han sido seleccionadas y se ejecutan.

  5. Se coloca el cursor en la posición deseada.

  6. Se imprime la cadena.

  7. Luego, si se ha activado la opción O, se devuelve el cursor a su posición anterior.

Programa: SITUAR
' Rutina SITUAR   .863
' (c)1989 by Alvaro F. Mingo                .552
' (c)1989 by Commodore World                .456
SUB situar(n$,op$) STATIC                   .166
ac%=8                                       .935
op$=UCASE$(op$:LE%=LEN(n$)                  .871
wi%=WINDOW(2)/ac%:in%=POS(0):oh%=in%        .530
al%=WINDOW(3)/ac%:hi%=CSRLIN:ov%=hi%        .416
IF INSTR (op$,"H"<>0 THEN in%=(wi%-LE%)/2   .175
IF INSTR (op$,"D"<>0 THEN in%=wi%-LE%       .368
IF INSTR (op$,"I"<>0 THEN in%=1             .888
IF INSTR (op$,"V"<>0 THEN hi%=a1%/2         .297
IF INSTR (op$,"A"<>0 THEN hi%=al%           .335
IF INSTR (op$,"E"<>0 THEN hi%=1             .761
LOCATE hi%,in%                              .273
PRINT n$;                                   .631
IF INSTR (op$,"O"<>0 THEN LOCATE ov%,on%    .981
END SUB                                     .214
Numero de lineas: 18


ENMARCAR

Siguiendo la tónica marcada por el anterior programa, he realizado esta rutina para "embellecer" la visualización de los datos. Si ha intentado alguna vez encuadrar texto, habrá visto que no es una tarea muy amena. Hay que calcular el recuadro en el que está comprendido el texto. Para facilitar esta tarea y evitarle el trabajo engorroso puede emplearse la rutina "caja" para enmarcar texto.

El formato es parecido al del comando PRINT. Para encuadrar la cadena "HOLA" se puede hacer: caja "HOLA", o E$="HOLA": caja E$. Como respuesta, el ordenador imprimirá HOLA en la posición del cursor, y lo encerrará dentro de un rectángulo.

A continuación, el funcionamiento del programa, línea a línea:

  1. Esta línea es optativa, y permite que los puntos superior derecho e inferior izquierdo sean mantenidos en memoria para usarlos más tarde en el programa principal. Si no piensa utilizar esta posibilidad eliminela.

  2. Como en el programa anterior, se asigna el valor 8 a la variable del tamaño de las fuentes de caracteres. Se ponen a cero las variables que más adelante indicarán si el cursor está en algún borde de la pantalla.

  3. Se calcula la posición, en pixels, del cursor.

  4. Y se calcula también la longitud, en pixels, de la cadena.

  5. Si el texto va a colocarse a la izquierda, la línea de la izquierda deberá ponerse un píxel más adelante para que no se salga.

  6. Igualmente, si el texto va a colocarse en la primera línea, la línea superior deberá bajarse de un píxel.

  7. Se imprime la cadena.

  8. Si el cursor se encuentra en la última línea, se ajusta el rectángulo al pequeño SCROLL que sufrirá.

  9. Se calculas los puntos superiores e inferiores del rectángulo.

  10. Se dibuja el rectángulo.

  11. Y se avanza el cursor para que lo siguiente que se imprima no se "coma" la línea derecha.

Programa: CAJA
' Rutina CAJA                     .272
' (c)1989 by Alvaro F. Mingo      .552
' (c)1989 by Commodore World      .456
SUB caja(n$) STATIC               .945
SHARED x1%,x2%,y1%,y2%            .  3
fi%=0:bo%=0:ac%=8:t%=0            . 51
ph%=((CSRLIN=-1)*ac%              .317
pa%=((POS(0))-1)*ac%              .729
le%=LEN(n$)*ac%+1                 .869
IF (POS(0)>1 THEN bo%=1           .801
IF crsrlin>1 THEN t%=1            .661
PRINT n$;                         .631
IF hi%+1=crsrlin THEN fi%=ac%-2   .821
x1%=pa%-bo%:y1%=ph%-t%-fi%        .160
x2%=pa%+le%:y2%=ph%+ac%-fi%       .874
LINE (x1%,y1%)-(x2%,y2%),1,b      .798
LOCALE ,(POS(0))+1                .154
END SUB                           .214
Numero de lineas: 18

También se podría introducir una pequeña modificación para determinar el color del recuadro. Por ejemplo permanentemente, sustituyendo la penúltima línea por:

     LINE (x1%,y1%)-(x2%,y2%),2,B

Con lo que las líneas se trazarían en negro. También, se podría añadir una opción de color, como en el listado 4.

Programa: CAJA-2
' Rutina CAJA con opciones        .179
' (c)1989 by Alvaro F. Mingo      .552
' (c)1989 by Commodore World      .456
SUB caja(n$,op%) STATIC           .241
SHARED x1%,x2%,y1%,y2%            .  3
fi%=0:bo%=0:ac%=8:t%=0            . 51
ph%=((CSRLIN)-1)*ac%              .317
pa%=((POS(0))-1)*ac%              .729
le%=LEN(n$)*ac%+1                 .869
IF (POS(0))>1 THEN bo%=1          .801
IF crsrlin>1 THEN t$=1            .661
PRINT n$;                         .631
IF hi%+1=crsrlin THEN fi%=ac%-2   .821
IF op%<0 OR op%>3 THEN op%=1      .372
x1%=pa%-bo%:y1%=ph%-t%-fi%        .160
x2%=pa%+le%:y2%=ph%+ac%-fi%       .874
LINE (x1%,y1%)-(x2%,y2%),op%,b    .550
LOCATE ,(POS(0))+1                .154
END SUB                           .214
Numero de lineas: 19

De esta forma, las instrucciones serían:

caja "Hola",0

Traza el rectángulo en azul.

caja "Hola",1

Traza el rectángulo en blanco.

caja "Hola",2

Traza el rectángulo en negro.

caja "Hola",3

Traza el rectángulo en naranja.

Usando un método parecido al de la rutina se podría incluso indicar el color del texto. ¿Por qué no lo intenta?



CONCLUSIÓN

El listado 5 es una muestra que ilustra estas pequeñas utilidades. Sirve como demostración sobre la utilización al máximo de las posibilidades de las rutinas, indicando el método que se debería seguir para su inclusión en los programas.

No olvide que al principio del programa deberán figurar las tres subrutinas de los listados 1, 2 y 3. Si ya las tiene almacenadas en disco en formato ASCII del Basic (grabando como SAVE"nombre",A), puede cargarlas en memoria una detrás de otra con el comando MERGE.

Programa: DEMO
' Programa de Demostracion                                         .863
' (c)1989 by Alvaro F. Mingo                                       .552
' (c)1989 by Commodore World                                       .456
' Antes del prorgama principal deben                               .491
' colocarse las rutinas de los listados 1-4                        .398
MAIN:                                                              .951
situar "Commodore","EI":situar "la mejor","Ah"                     .526
situar "Word","VI"                                                 .  7
situar "revista","AD":situar "es","ai"                             .898
situar "World","he"                                                .629
situar "es","ed":situar "la mejor","vd"                            .289
PRES:                                                              .564
COLOR 2,0                                                          .839
situar "Lo dudas?","vh"                                            .499
INPUT dud$:PRINT:situar"","H"                                      .606
dud$=UCASE%(dud$)                                                  .392
IF INSTR(dud$),"SI")<>0 THEN caja "Pues me enfado":COLOR 1,0:end   .305
IF INSTR(dud%),"NO")=0 THEN caja "SI o NO":GOTO PREG               .350
caja "Estamos de acuerdo"                                          .171
CLS                                                                .313
COLOR 1,0                                                          .496
FILES                                                              .176
que:                                                               .116
situar "","hv"                                                     .  6
caja "Dime el nombre de un fichero":INPUT"",n$                     .349
situar "FIN para salir","ado"                                      .214
IF UCASE$(n$)="FIN" THEN fin                                       .647
Verify n$                                                          .681
IF n$="" THEN                                                      .185
situar "Este fichero no existe","Ed"                               .439
ELSE                                                               .483
situar "Este fichero existe","ed"                                  .314
END IF                                                             .654
GOTO que                                                           .247
fin:                                                               .  0
CLS:END                                                            .655
Numero de lineas: 36

Envía esta página web a un amigo:
Esta opción está desactivada temporalmente, rogamos disculpen las molestias

Volver a la página anterior

Al menú principal