Página 5 de 6
Re: Motor de texto en basic.
Publicado: 13 Mar 2019, 15:45
por jordigahan
tengo diseñada una interface, asi que lo unico que necesito es poder imprimir texto en esa zona , y que si no cabe el texto cuando llegue al limite, salte automaticamente a la siguiente linea .
si llega al final del cuadro de texto, tiene que borrar las lineas y volver a empezar en la parte de arriva, nada de scroll.
Re: Motor de texto en basic.
Publicado: 14 Mar 2019, 01:18
por javu61
A ver, le he quitado lo que no es imprescindible, las primeras líneas es para que veas como se utiliza, das valor a L1, L2, C1, C2 y a$, con ello llamas a la rutina en 2515. Si hubiese algo en esa zona de la pantalla antes debes llamar a la rutina en 2615 para limpiarla.
► Mostrar Spoiler
10 REM ***********************
20 REM * Impresion de textos *
30 REM ***********************
40 LET l1=3: REM primera linea
50 LET c1=5: REM primera columna
60 LET l2=7: REM ultima linea
70 LET c2=25: REM ultima columna
80 REM esta es la cadena a imprimir
90 LET a$="Hola! soy Tessa, te recibo con gusto en la casa de Atreides, "
100 LET a$=a$+"donde moran los habitantes del circulo de Seldon en Trantor, "
110 LET a$=a$+"luz a luz, agua al agua, y para beber un buen vino."
120 PAPER 0: INK 6: CLS
130 GO SUB 2515: REM Impresion
140 STOP
2500 REM ***********************
2505 REM ** motor de impresion *
2510 REM ***********************
2515 LET l=l1: LET c=c1: GO SUB 2565
2520 FOR i=1 TO LEN a$
2530 PRINT AT l,c;a$(i)
2535 LET c=c+1
2540 IF (c>c2) OR (i=m) THEN LET c=c1: LET l=l+1: GO SUB 2565
2545 IF l>l2 THEN LET l=l1: GO SUB 2605
2550 NEXT i
2555 RETURN
2560 REM ------------- Busco espacio
2565 LET m=i+c2-c1+1
2570 IF m>LEN a$ THEN LET m=LEN a$: RETURN
2575 FOR z=m TO i STEP -1
2580 IF a$(z)=" " THEN RETURN
2585 LET m=m-1
2590 NEXT z
2595 RETURN
2600 REM ------------- Esperar tecla
2605 IF INKEY$="" THEN GO TO 2605
2610 REM ------------- Limpiar
2615 FOR w=l1 TO l2
2620 FOR y=c1 TO c2
2625 PRINT AT w,y;" ";
2630 NEXT y
2635 NEXT w
2640 RETURN
Y si lo quieres mas sencillo, pero menos bonito sin cortar por palabras completas sino donde caida, la rutina sería esta:
► Mostrar Spoiler
2500 REM ***********************
2505 REM ** motor de impresion *
2510 REM ***********************
2515 LET l=l1: LET c=c1
2520 FOR i=1 TO LEN a$
2530 PRINT AT l,c;a$(i)
2535 LET c=c+1
2540 IF (c>c2) THEN LET c=c1: LET l=l+1
2545 IF l>l2 THEN LET l=l1: GO SUB 2605
2550 NEXT i
2555 RETURN
2600 REM ------------- Esperar tecla
2605 IF INKEY$="" THEN GO TO 2605
2610 REM ------------- Limpiar
2615 FOR w=l1 TO l2
2620 FOR y=c1 TO c2
2625 PRINT AT w,y;" ";
2630 NEXT y
2635 NEXT w
2640 RETURN
Re: Motor de texto en basic.
Publicado: 15 Mar 2019, 04:16
por jordigahan
este es el codigo que mejor me funciona, hace exactamente lo que necesito, pero cuando termina de imprimir siempre me marca error de subindice incorrecto en la linea 1570 sin importar lo largo o corto que sea el texto.
alguna forma de poder hacer copy/paste para ir probando los codigos y no tener que teclearlos...
Re: Motor de texto en basic.
Publicado: 15 Mar 2019, 09:25
por wilco2009
Cuando terminas el bucle que hay entre 1555 y 1565 c acaba valiendo uno más que len(a$), por lo que en 1570 te da error de subíndice.
Añade simplemente:
1568 return
Re: Motor de texto en basic.
Publicado: 15 Mar 2019, 13:40
por javu61
Tienes que añadir esto al inicio para llamar bien a la rutina
1501 GO SUB 1505
1502 STOP
El error que te da se resuelve añadiendo esta línea
1523 IF c > LEN a$ THEN RETURN
Pero para que borre bien la pantalla debes cambiar la línea 1540, dejándola así:
1540 IF b=15 THEN LET b=1: PRINT AT 7,28;"-": GO SUB 1586
y añadir estas otras
1586 IF INKEY$="" THEN GO TO 1586
1596 RETURN
Tu rutina lo que hace es imprimir entre la línea 1 y la 14, entre las columnas 1 y 23, el texto que le digas en a$ caracter a caracter, partiendo las líneas donde le toque, y cuando llega a la línea 15 espera una tecla, borra ese trozo de pantalla y vuelve a la 1 para seguir imprimiendo. En lo que yo te puse puedes elegir que líneas impirme y en que columnas, y corta por palabras.
Te pongo tu código completo
► Mostrar Spoiler
1500 GO SUB 2000
1501 GO SUB 1505
1502 STOP
1505 LET b=1
1510 FOR a=0 TO LEN a$/22
1512 PRINT AT 7,28;"-": PAUSE 5
1515 LET d=1
1520 FOR c=1+23*a TO 23+23*a
1522 PRINT AT 7,28;"*"
1523 IF c>LEN a$ THEN RETURN
1525 GO SUB 1570
1530 NEXT c
1535 LET b=b+1
1540 IF b=15 THEN LET b=1: PRINT AT 7,28;"-": GO SUB 1586
1545 NEXT a
1550 LET d=1
1555 FOR c=1+10*a TO LEN a$
1560 GO SUB 1570
1565 NEXT c
1570 PRINT AT b,d;a$(c)
1580 LET d=d+1
1585 RETURN
1586 IF INKEY$="" THEN GO TO 1586
1590 LET z=1
1592 FOR x=1 TO 14
1593 PRINT AT z,1;" "
1594 LET z=z+1
1595 NEXT x
1596 RETURN
2000 LET a$="Hola! soy Tessa, te recibo con gusto en la casa de Atreides, "
2010 LET a$=a$+"donde moran los habitantes del circulo de Seldon en Trantor, "
2020 LET a$=a$+"luz a luz, agua al agua, y para beber un buen vino."
2030 LET a$=a$+"Hola! soy Tessa, te recibo con gusto en la casa de Atreides, "
2040 LET a$=a$+"donde moran los habitantes del circulo de Seldon en Trantor, "
2050 LET a$=a$+"luz a luz, agua al agua, y para beber un buen vino."
3000 RETURN
Re: Motor de texto en basic.
Publicado: 16 Mar 2019, 00:21
por jordigahan
ahora lo unico que falta es hacer que si la ultima palabra de la linea no cabe, la pase a la siguiente linea y continue con el texto.
Re: Motor de texto en basic.
Publicado: 20 Mar 2019, 18:13
por jordigahan
Siguiendo un poco con el hilo, aunque cambiando de tema, necesitaria hacer un input, pero en cualquier lugar de la pantalla, parece ser que la solucion pasa por usar un poke, pero no tengo ni idea de como averiguarlo, alguna idea ?
Re: Motor de texto en basic.
Publicado: 20 Mar 2019, 20:53
por elfoscuro
jordigahan escribió: ↑20 Mar 2019, 18:13
Siguiendo un poco con el hilo, aunque cambiando de tema, necesitaria hacer un input, pero en cualquier lugar de la pantalla, parece ser que la solucion pasa por usar un poke, pero no tengo ni idea de como averiguarlo, alguna idea ?
Creo que no puedes hacer lo que quieres con INPUT, porque siempre sale en la parte baja de la pantalla (#1 creo recordar, pero vete a saber). El Poke que dices, sólo sirve si tienes la pantalla en blanco, porque lo que hace es agrandar esas dos líneas (23 y 24) para que "suban", por lo que se borra lo que haya en la pantalla "principal" (22 primeras líneas).
Para hacer lo que quieres, necesitas más código, y tienes que hacerte tu propio INPUT, a base de INKEY$. No te queda otra. En mis tiempos (lease con voz de viejo archivero) hice esa rutina, y permitía usar DELETE, cursores y demás. Pero vete a saber "ande andará".
Un saludo.
Re: Motor de texto en basic.
Publicado: 21 Mar 2019, 00:48
por jordigahan
falsa alarma, al final creo que he encontrado otra forma de hacerlo menos complicada.
de todas formas, no sabia que eso fuera tan complicado de hacer...
Re: Motor de texto en basic.
Publicado: 22 Mar 2019, 00:06
por otivax
Puedes hacerlo con PAUSE 0, INKEY$ y PRINT AT
En la página 1 de este hilo tienes más o menos como hacerlo.