A ver que no me explicado bien, si ejecutais el programa, vereis que tiene una letra predeterminada y un tamaño de fuente tambien predeterminado, pero el ancho de cada una de las lineas que se va escribiendo, es decir que las lineas tienen un ancho que viene determinado por una variable o bucle que no localizo lo unico que se es que es en cm y que son aproximandamente 7 con algo aunque no estoy muy seguro, o sea que no hay contador de letras ni palabras que haga saltar de una linea a otra cuando llega a un determinado punto, lo que quiero saber es, en el codigo donde hace referencia a esa variable o que bucle gestiona que me salte de linea a la siguiente. Esa es mi pregunta.
Un poco tarde, pero seguro que alguien más necesita saber lo que preguntas...
Veamos, el largo de una línea de texto viene limitado por visual basic, en la versión 6.0 creo recordar que era de 65536 caracteres...
Entonces para saber la longitud de un línea hacen falta dos cosas saber el número de caracteres que lo componen con la instrucción Len(cadenaDeTexto) y multiplicándolo por el factor de tamaño de letra, esto lo controla la propiedad textHeight(caracter), ahora bién esto sólo funciona correctamente si la fuente es 'monoespaciada' esto es, si todos los caracteres tienen el mismo ancho. Si no es el caso (que es lo normal) entonces, efectivamente hay que hacer un bucle para determinar el largo total de la cadena, tomando uno a uno los caracteres... Se pone el código para ambos casos.
Caso 1: fuente monoespaciada:
public function largo_Cadena(cadena as string) as long
largo_Cadena= len(cadena) * textwidth("W")
end function
Caso 2: fuentes no monoespaciadas
public function largo_Cadena(cadena as string) as long
dim tam as long
for n=1 to len(cadena)
tam=tam + textwidth(mid$(cadena,n,1))
next n
largo_Cadena= tam
end function
Por tanto si quieres dar formato de tamaño a una línea, puedes usar la 2ª función como base y modificarla. Por ejemplo sea que quieres que el largo de las líneas no superen un tamaño específico de unidades... entonces se envía la 'cadena' desde la que se tomarán los caracteres, se proporciona un puntero de avance que varía a medida que se va leyendo la cadena, cuando entremos una cadena nueva deberíamos poner el puntero a -1 desde nPosicion, largo indica el tamaño que queremos que no sobrepase, la función nos devuelve una cadena emepezando por el carácter que indica puntero con tantos caracteres como de largo no superen el 'largo' indicado.
public function setLargo_Cadena(cadena as string, largo as long, optional nPosicion as long=-1) as string
dim tam as long
static puntero as long
if nPosicion=-1 then
puntero=1
else
if puntero=len(cadena) then
setLargo_Cadena= vbcrlf
puntero=1
exit function
end if
end if
for n=puntero to len(cadena)
tam=tam + textwidth(mid$(cadena,n,1))
if tam>largo then exit for
next n
largo_Cadena= mid$(cadena,n-1,puntero)
puntero=n
end function
Para apoyar a esta función se debería usar otra que haría las veces de iterador que iría despedazando la cadena original en trozos de cadenas del tamaño que hemos ido especificando. El código podría ser más o menos así:
public function dividir_CadenasSegunTamaño(cadena as string) as string()
dim s as string
dim cad() as string
dim t as long
dim largos(0 to 9)
largos=set_Largos
redim cad(0 to 65535) as string
do while s<>vbcrlf
s= setLargo_Cadena(cadena,largos(t mod 9))
cad(t)=s
t=t +1
loop
redim preserve cad(0 to t)
dividir_CadenasSegunTamaño=cad
end function
' entrega una matriz de tamaños...
private function set_Largos() as long
dim lg(0 to 8)
lg(0)= 120 : lg(1)= 140 : lg(2)= 160
lg(3)= 180 : lg(4)= 200 : lg(5)= 220
lg(6)= 240 : lg(7)= 260 : lg(8)= 280
Largos=lg
end function
Si se le pasa una cadena suficientemente larga irá creando cadenas de diferentes largos (como se especificó en 'lg'.
Otra cosa a tener en cuenta es que el tamaño deberá ser consecuente con el tamaño de la fuente, es decir si tomamos un tamaño de fuente muy grande y el largo solicitado es menor que el de un carácter nos devolvería una cadena vacía, y entraríamos en un bucle infinito (en el código expuesto no entraría en bucle infinito sino que al llegar daría error al llegar al límite superior de un long de la variable 't'). Remediar esta situación así como proveer palabras enteras en cada línea se deja como ejercicio para el interesado.
Por último decir que el control richtextbox, provee mucha funcionalidad de modo que ahorrará mucho trabajo si os acostumbrais a usarlo y a conocerlo en profundidad.
Saludos.