Apagada docs

Aprendiendo a programar el pasado

Herramientas de usuario

Herramientas del sitio


es:basic:qbasic:josehlp

JoseHelp / Joseayuda

En 1992 no se había popularizado todavía el hipertexto en España. Pero, viendo la ayuda de algunos programas, tuve la intuición de que pronto se emplearía para algo más que proporcionar ayuda a los usuarios.

En efecto, poco después, al tener acceso a las bibliotecas de shareware en CD-ROM (y sobre todo cuando posteriormente empecé a usar la web), vi que había mucha gente que estaba empleando formatos similares para proporcionar información de diversos temas (como el lector de libros electrónicos DART.EXE, cuya reseña podéis ver aquí) o crear ayudas a la programación residentes en memoria (como INT21.EXE).

Personalmente yo usé este programa para una traducción propia del “Expert Set” de Dungeons & Dragons (la caja azul; en España solo se vendía en la época la caja roja del D&D básico, y ni hablar de conseguir el D&D avanzado), algo para lo que hoy en día usaría HTML.

La sintaxis de los archivos debe mucho a la empleada por la ayuda del DOSSHELL que se incluía en el MS-DOS 5.0.

En mis archivos encuentro dos versiones:

* Versión llamada “Joseayud.a” (1/5/1992):

DECLARE SUB Muestratema (NombreTema$)
DECLARE FUNCTION NumeroTema! (NombreTema$)
DECLARE SUB MueveCursor ()
DECLARE SUB MuestraPantalla ()
DECLARE SUB QuitaCursor (x!, y!)
DECLARE SUB PonCursor (x!, y!)
DECLARE SUB EjecutaTema (x!, y!)
'Información en línea v. 2.0
'Para QBasic
'Por J. G. M. Y.

TYPE Tema
        nombre AS STRING * 3
        localizacion AS LONG
END TYPE

DIM temas(100) AS Tema

DIM Texto$(800)


'Introducción de nombre del fichero
EntraNombre:
INPUT "¿Qué archivo contiene la información a visualizar?"; a$
IF INSTR(a$, "*") > 0 THEN FILES a$: GOTO EntraNombre
IF INSTR(a$, ".") < 1 THEN a$ = a$ + ".ENL"
NombArc$ = a$


'Lectura del archivo

OPEN NombArc$ FOR INPUT AS #1
Linea = 1
TemaActual = 0
DO UNTIL EOF(1)
        INPUT #1, a$
        IF INSTR(a$, "!>") > 0 THEN
                temas(TemaActual).nombre = MID$(a$, INSTR(a$, "!>") + 2, 3)
                temas(TemaActual).localizacion = Linea
                TemaActual = TemaActual + 1
        END IF
        Linea = Linea + 1
LOOP
CLOSE #1

FOR a = 0 TO TemaActual
PRINT temas(a).nombre; temas(a).localizacion
NEXT
SLEEP 0
CLS
Muestratema "T00"

SUB EjecutaTema (x, y)
SHARED Texto$(), PosicionInicioPantalla
Linea = PosicionInicioPantalla + y - 1
a = x
Linea$ = Texto$(Linea)

DO UNTIL a > LEN(Linea$)
        IF MID$(Linea$, a, 1) = CHR$(17) THEN EXIT SUB 'EMPIEZA BOTON NUEVO
        IF MID$(Linea$, a, 1) = CHR$(16) THEN
                NombreTema$ = MID$(Linea$, a + 1, 3)
                Muestratema (NombreTema$)
                EXIT SUB
        END IF
        a = a + 1
LOOP

END SUB

SUB MuestraPantalla
SHARED x, y, NLineaTexto, PosicionInicioPantalla
SHARED Texto$()
lin = 1
max = 20
IF NLineaTexto < 20 THEN max = NLineaTexto
FOR f = PosicionInicioPantalla TO PosicionInicioPantalla + max
        LOCATE lin, 1
        lin = lin + 1
        a = INSTR(Texto$(f), CHR$(16))
        a$ = Texto$(f)
        IF a > 0 THEN MID$(a$, a + 1, 3) = "   "
        PRINT a$
        
NEXT
END SUB

SUB Muestratema (NombreTema$)
SHARED temas() AS Tema, Texto$()
SHARED NombArc$, NLineaTexto

OPEN NombArc$ FOR INPUT AS #1
ntema = NumeroTema(NombreTema$)
Buscar = temas(ntema).localizacion
Linea = 1

DO UNTIL Buscar = Linea
        INPUT #1, a$
        PRINT a$
LOOP
LOCATE 25, 1
PRINT USING "(TEMA:\     \ LOCALIZACION: #####"; temas(ntema).nombre; temas(ntema).localizacion
LOCATE 1, 1
Texto$(0) = a$

NLineaTexto = 1


DO UNTIL EOF(1)
        INPUT #1, a$
        IF INSTR(a$, "!>") > 0 THEN EXIT DO
        Texto$(NLineaTexto) = a$
        NLineaTexto = NLineaTexto + 1
LOOP
CLOSE #1
MuestraPantalla
DO
        MueveCursor
LOOP

END SUB

SUB MueveCursor
SHARED PosicionInicioPantalla, x, y
IN$ = INKEY$
IF y < 1 THEN y = 1
IF x < 1 THEN x = 1
QuitaCursor x, y

SELECT CASE IN$
        CASE CHR$(0) + CHR$(72)
                IF y > 1 THEN y = y + 1
                IF y = 1 AND PosicionInicioPantalla > 0 THEN
                        PosicionInicioPantalla = PosicionInicioPantalla + 1
                        MuestraPantalla
                END IF
        CASE CHR$(0) + CHR$(80)
                IF y < 21 THEN y = y + 1
                IF y = 21 AND PosicionInicioPantalla < NLineaTexto + 21 THEN
                        PosicionInicioPantalla = PosicionInicioPantalla + 1
                        MuestraPantalla
                END IF
        CASE CHR$(0) + CHR$(75)
                IF x > 1 THEN x = x - 1
        CASE CHR$(0) + CHR$(77)
                IF x < 80 THEN x = x + 1
        CASE CHR$(13)
                EjecutaTema x, y
END SELECT
        
        PonCursor x, y
END SUB

FUNCTION NumeroTema (NombreTema$)
SHARED temas() AS Tema

encontrado = 0
FOR a = 0 TO 100
        IF temas(a).nombre = NombreTema$ THEN
                NumeroTema = a
                encontrado = -1
        END IF
NEXT
IF NOT encontrado THEN NumeroTema = 0

END FUNCTION

SUB PonCursor (x, y)
LOCATE y, x
PRINT "_"
END SUB

SUB QuitaCursor (x, y)
SHARED PosicionInicioPantalla, Texto$()

Linea$ = Texto$(PosicionInicioPantalla + y - 1)
Caracter$ = MID$(Linea$, x, 1)
SeEncuentra = INSTR(Linea$, CHR$(16))

IF SeEncuentra > 0 THEN
        IF (x - SeEncuentra) >= 1 AND (x - SeEncuentra) <= 3 THEN Caracter$ = " "
END IF

LOCATE y, x
PRINT Caracter$
END SUB
  • Versión llamada “Josehelp.bas” ()
DECLARE SUB Muestratema (nombretema$)
DECLARE FUNCTION NumeroTema! (nombretema$)
DECLARE SUB Muevecursor ()
DECLARE SUB MuestraPantalla ()
DECLARE SUB QuitaCursor (x!, y!)
DECLARE SUB PonCursor (x!, y!)
DECLARE SUB Ejecutatema (x!, y!)
'Informaci¢n en l¡nea v. 2.0
'Para QBasic
'Por J. G. M. Y.

TYPE tipotema
    tema AS STRING * 3
END TYPE
'$STATIC
DIM Texto$(800)
DIM temaanterior(100) AS tipotema
punterotema = 0
COLOR 7, 1: CLS
'Introducci¢n de nombre del fichero
EntraNombre:
INPUT "¨Qu‚ archivo contiene la informaci¢n a visualizar?"; a$
IF INSTR(a$, "*") > 0 THEN FILES a$: GOTO EntraNombre
IF INSTR(a$, ".") < 1 THEN a$ = a$ + ".ENL"
NombArc$ = a$

CLS
Muestratema "T00"
DO
    Muevecursor
LOOP

SUB Ejecutatema (x, y)
SHARED Texto$(), PosicionInicioPantalla
SHARED temaanterior() AS tipotema, punterotema
Linea = PosicionInicioPantalla + y - 1
a = x
Linea$ = Texto$(Linea)

DO UNTIL a > LEN(Linea$)
    IF MID$(Linea$, a, 1) = CHR$(17) THEN EXIT SUB 'EMPIEZA BOTON NUEVO
    IF MID$(Linea$, a, 1) = CHR$(16) THEN
        nombretema$ = MID$(Linea$, a + 1, 3)
        temaanterior(punterotema).tema = nombretema$
        punterotema = punterotema + 1
        Muestratema (nombretema$)

        EXIT SUB
    END IF
    a = a + 1
LOOP


END SUB

SUB MuestraPantalla
SHARED x, y, NLineaTexto, PosicionInicioPantalla
SHARED Texto$()

lin = 1
max = 20
IF NLineaTexto < 20 THEN max = NLineaTexto
FOR f = PosicionInicioPantalla TO PosicionInicioPantalla + max
    LOCATE lin, 1
    lin = lin + 1
    a = INSTR(Texto$(f), CHR$(16))
    a$ = Texto$(f)
    IF LEN(a$) < 80 THEN a$ = a$ + SPACE$(80 - LEN(a$))
    IF a > 0 THEN MID$(a$, a + 1, 3) = "   "
    PRINT a$
    IF INSTR(a$, CHR$(16)) > 0 OR INSTR(a$, CHR$(17)) > 0 THEN
        FOR n = 1 TO 80
            IF MID$(a$, n, 1) = CHR$(16) THEN
                COLOR 2, 1
                LOCATE lin - 1, n
                PRINT CHR$(16)
                IF n - 3 < 80 THEN LOCATE lin - 1, n + 1: PRINT STRING$(3, "   ")
                COLOR 7, 1
            END IF
            IF MID$(a$, n, 1) = CHR$(17) THEN
                COLOR 2, 1
                LOCATE lin - 1, n
                PRINT CHR$(17)
                COLOR 7, 1
            END IF
        NEXT
    END IF
NEXT
END SUB

SUB Muestratema (nombretema$)
SHARED Texto$()
SHARED NombArc$, NLineaTexto, PosicionInicioPantalla
OPEN NombArc$ FOR INPUT AS #1

ERASE Texto$
Linea = 1

DO UNTIL INSTR(a$, "!>" + nombretema$) > 0
    LINE INPUT #1, a$
    'PRINT a$
LOOP


LOCATE 1, 1
Texto$(0) = a$

NLineaTexto = 1


DO UNTIL EOF(1)
    LINE INPUT #1, a$
    IF INSTR(a$, "!>") > 0 THEN EXIT DO
    Texto$(NLineaTexto) = a$
    NLineaTexto = NLineaTexto + 1
LOOP
CLS
CLOSE #1
PosicionInicioPantalla = 0
MuestraPantalla

END SUB

SUB Muevecursor
SHARED PosicionInicioPantalla, x, y, NLineaTexto
SHARED temaanterior() AS tipotema, punterotema, Texto$()
IN$ = INKEY$
IF y < 1 THEN y = 1
IF x < 1 THEN x = 1
QuitaCursor x, y
LOCATE 23, 60
IF NLineaTexto > 21 + PosicionInicioPantalla THEN PRINT "(SIGUE ABAJO)" ELSE PRINT SPACE$(14)
LOCATE 1, 60
IF PosicionInicioPantalla > 1 THEN PRINT "(SIGUE ARRIBA)" ELSE PRINT SPACE$(15)

SELECT CASE IN$
    CASE CHR$(27)
        temaanterior(punterotema).tema = "T00"
        punterotema = punterotema + 1
        Muestratema "T00" 'Muestra el tema-cero (Indice, normalmente)
    CASE CHR$(0) + CHR$(71) 'inicio
        x = 1
    CASE CHR$(0) + CHR$(79) 'fin
        x = LEN(Texto$(y + PosicionInicioPantalla - 1))
        IF x = 0 THEN x = 1
    CASE CHR$(9) 'Tab: retroceder
        IF punterotema = 0 THEN
            PLAY "A32"
        ELSE
            punterotema = punterotema - 1
            Muestratema temaanterior(punterotema).tema
        END IF
    CASE CHR$(0) + CHR$(73) 'ReP g
        IF PosicionInicioPantalla > 21 THEN
            PosicionInicioPantalla = PosicionInicioPantalla - 21
        ELSE
            PosicionInicioPantalla = 1
        END IF
        MuestraPantalla
    CASE CHR$(0) + CHR$(72) 'Arriba
        IF y > 1 THEN y = y - 1
        IF y = 1 AND PosicionInicioPantalla > 0 THEN
            PosicionInicioPantalla = PosicionInicioPantalla - 1
            MuestraPantalla
        END IF
    CASE CHR$(0) + CHR$(81) 'AvP g
        IF PosicionInicioPantalla + 21 < NLineaTexto THEN
            PosicionInicioPantalla = PosicionInicioPantalla + 21
        ELSE
            PosicionInicioPantalla = NLineaTexto - 20
        END IF
        MuestraPantalla
    CASE CHR$(0) + CHR$(80) 'Abajo
        IF y < 21 THEN y = y + 1
        IF y = 21 AND PosicionInicioPantalla + 21 <= NLineaTexto THEN
            PosicionInicioPantalla = PosicionInicioPantalla + 1
            MuestraPantalla
        END IF
    CASE CHR$(0) + CHR$(75)
        IF x > 1 THEN x = x - 1
    CASE CHR$(0) + CHR$(77)
        IF x < 80 THEN x = x + 1
    CASE CHR$(13)
        Ejecutatema x, y
END SELECT
PonCursor x, y
END SUB

SUB PonCursor (x, y)
LOCATE y, x
PRINT CHR$(219)
END SUB

SUB QuitaCursor (x, y)
SHARED PosicionInicioPantalla, Texto$()

Linea$ = Texto$(PosicionInicioPantalla + y - 1)
caracter$ = MID$(Linea$, x, 1)
SeEncuentra = INSTR(Linea$, CHR$(16))
IF caracter$ = "" OR caracter$ = CHR$(0) THEN caracter$ = CHR$(32)
IF SeEncuentra > 0 THEN
    IF x <= 4 THEN
        cad1$ = MID$(Linea$, 1, x)
    ELSE
        cad1$ = MID$(Linea$, x - 4, 4)
    END IF
    IF INSTR(cad1$, CHR$(16)) > 1 THEN caracter$ = " "
    '(x - SeEncuentra) >= 1 AND (x - SeEncuentra) <= 3 THEN caracter$ = " "
END IF

LOCATE y, x
IF caracter$ = CHR$(16) OR caracter$ = CHR$(17) THEN COLOR 2, 1
PRINT caracter$
COLOR 7, 1
END SUB
Este sitio web utiliza cookies. Al utilizar el sitio web, usted acepta almacenar cookies en su computadora. También reconoce que ha leído y entendido nuestra Política de privacidad. Si no está de acuerdo abandone el sitio web.Más información
es/basic/qbasic/josehlp.txt · Última modificación: 2020/03/07 03:34 por nepenthes