¿Cómo puedo obtener el valor de un elemento en un array en modo gráfico utilizando pascal?

Quiero saber la función que en turbo pascal me permite emitir el valor de un elemento de un array en cierto punto(x, y) de la pantanlla, estando en modo gráfico.
1

1 respuesta

Respuesta
1
La función que buscas puede o no existir dependiendo de dos cosas: el tipo de elementos del Array y el modo gráfico.
Si estás en modo 320x200 o 640x480 a 16 colores (EGA), tenés la función TextOutXY para sacar strings, pero vas a tener que adaptar los datos del Array a formato String.
Si estás trabajando con VESA, ya pasa a ser laburo manual tuyo.
Si la función esa no te sirve, aclarame más respecto al tipo del Array y el modo gráfico y te contesto, a mí la programación gráfica me encanta y tengo algunas cositas hechas en http://personales.ciudad.com.ar/amodelaobscuridad
Estoy en modo 640x480 y quiero saber como adaptar los datos del array a strings. Te aclaro, tengo un array en forma de tabla con valores constantes y reales (son números decimales)
Para transformar cualquier valor numérico tenés la función VAL, le pasas el número y una variable de tipo String en donde te deja la transcripción de numero a String.
Disculpame si no me acuerdo los nombres de las funciones de memoria, pero te sugiero un par de cosas: si el Array es una tabla (2 dimensiones), asígnale un ancho fijo a cada columna en pantalla, porque sino te vas a enloquecer. Digamos que le das 70 pixels a cada columna.
Fíjate en la ayuda del Turbo Pascal, poné Graph y dale enter, ahí te salen todas las funciones de gráficos. Cuando tengas que imprimir es importante respetar la alineación y el formato, digamos 6 caracteres, la coma, y dos decimales, ¿no?.
O sea, en vez de imprimir:
128,67
12
45,8
Hay que imprimir (uso guiones bajos para representar espacios):
128,67
_12,00
_45,80
Para lograr esto hay que tomar en cuenta dos factores: la longitud del string y la posición del punto.
La longitud del String la obtenés con LENGTH y la posición del punto con POS, eso ni que decirlo. Ahora, en las funciones de la unidad Graph busca que hay una función que te retorna el ancho en pixels de un carácter. Usando esa función multiplicada por el length del string podes hallar los pixels necesarios para imprimir el número y ver si en vez del número imprimís algún carácter como hace el Excel que pone #### cuando no le alcanza el ancho de la columna.
Después hay otra función que calcula la altura de la fuente, fíjate que éstas dos funciones en realidad te calculan la altura y ancho de un carácter, por lo que para calcular el ancho en pixels tener que hacer un FOR para cada carácter del string y sumar el ancho de cada uno, mientras que para el alto, te conviene usar un carácter en mayúsculas y que ocupe todo el alto, como la L o I.
Te conviene implementar lo siguiente:
Function AnchoString(S : String) : Integer
Function AltoString:Integer
Donde la primera te retorna el ancho haciendo la sumatoria de los anchos de cada letra y la segunda que devuelva la función del alto con la L, por ejemplo.
Ahora bien, sería bueno que hagas una función imprimir celda de este modo:
Function ImprimirCelda (colVisible, filVisible : Integer; valor : Real) : Integer;
Te explico lo de colVisible y FilVisible, dado no sé las dimensiones de tu tabla, supongamos que tiene 15 columnas, a 70 pixels, no te alcanza la pantalla!, bueno eso se soluciona fácil con buena modularización. La idea que me ronda la cabeza es la siguiente, si implementamos algún modo de scroll, en la pantalla sólo se muestran columnas enteras, que no varían más que en el contenido, ¿me seguís?
Bueno, la rutina que visualiza algo en determinada posición de la pantalla no tiene por qué variar por más que el contenido de la celda en la una posición determinada corresponda a una u otra columna en la matriz de datos.
Entonces se podría hacer una función (ImprimirCelda) en donde le digas que imprima un valor en la celda visible (colVisible, filVisible). Con esto es como que la pantalla es como una "matriz de visualización" que puede moverse en tu matriz de datos.
La idea sería tener dos constantes (o variables, vos elegís): una de ANCHO_CELDA y otra de ALTO_CELDA, que sean las que tengan las medidas reales de cada celda. Luego, la función ImprimirCelda lo único que haría sería multiplicar colVisible por ANCHO_CELDA para hallar la coordenada POR y filVisible por ALTOCELDA para la coordenada Y.
Después validaría que el ancho del valor a imprimir no exceda el ANCHO_CELDA y:
- Si lo excede imprimiría tantos caracteres # como el ANCHO_CELDA le permita.
- Si entra, imprimiría el valor; para esto transcribe el valor a un formato con dos decimales (por decir algo) e imprime el string en la posición correcta.
- posiblemente dibujar un rectángulo con las coordenadas (X,Y,X+ANCHO_CELDA,y+ALTO_CELDA)
Te queda definir el proceso principal, pero creo que ya te darás cuenta:
Definir dos variables (primerColVisible y primerFilVisible) que cuando presiones las flechitas se incrementen/dismuniyan en 1 y llamar a ImprimirCelda haciendo:
For c := 1 TO 640/ANCHO_CELDA DO
For f := 1 TO 480/ALTO_CELDA DO
ImprimirCelda(c,f,Matriz[c+primerColVisible,f+primerFilVisible])
Bueno, espero haber sido claro, sin embargo te agradecería mucho que asignes puntos a mis respuestas antes de seguir charlando, puesto que la gente me consulta en base a esa puntuación y no tengo aún una valoración alta. A parte mi esfuerzo en contestar es a cambio de lograr un buen nivel dentro del foro.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas