Programación General > Visual Basic 6.0 e inferiores

 Tengo Un Programa Y No Logro Descifralo

(1/1)

Jamaicol:
Lo dicho, que no logro encontrar en el programa la linea que hace que salte cuando llega a un determinado punto, lo paso a ver si lo lograis descifrar.... :ph34r:

cpmario:
Explica que quieres decir con

--- Citar ---la linea que hace que salte cuando llega a un determinado punto
--- Fin de la cita ---

Te refieres a una línea de texto o de código, y cual es el 'determinado punto'.

De preferencia da un ejemplo de como reproducir lo que dices.

 <_<

Jamaicol:
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.

ebolo:
Hola Jamaicol, si miras el form_load, verá donde le da todas las propiedad al richtextbox, lo que hace es que le da un margen derecho de 7.3 cm, bueno miralo...


--- Código: Text --- Private Sub Form_Load()'Crea el formulario con todas las cosillas dentro    'colocacion de el el cuadro de texto    'margen derecho el tamaño del parrafo o columna    txtBox.RightMargin = 7.3    'para que vaya centrada la letra    txtBox.SelAlignment = 2    'para que tenga margen a la parte izquierda    txtBox.SelIndent = 2    mnuEditDeshacer.Enabled = False    txtBox.AutoVerbMenu = True    If SendMessage(txtBox.hWnd, EM_CANUNDO, 0&, ByVal 0&) Then            mnuEditDeshacer.Enabled = True            cmdDeshacer.Enabled = mnuEditDeshacer.Enabled            End If    txtBox.Top = 0 + tbHerramientas.Height    txtBox.Left = 0    '''''''''''''''''''''''''''''''''''''''''''''''    txtBox.Font.size = 11    filename = &#34;&#34;    fullname = &#34;&#34;    Actualizado = True    mnuSearchFindnext.Enabled = False    start = 1End Sub  
Saludos.

Nebire:

--- Cita de: "Jamaicol" ---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.
--- Fin de la cita ---
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:

--- Código: Text ---  public function largo_Cadena(cadena as string) as long        largo_Cadena= len(cadena) * textwidth(&#34;W&#34;) end function  
Caso 2: fuentes no monoespaciadas

--- Código: Text ---  public function largo_Cadena(cadena as string) as long       dim tam as long       for n=1 to len(cadena)          tam=tam + textwidth(mid&#036;(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.


--- Código: Text ---   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&#036;(cadena,n,1))          if tam&#62;largo then exit for      next n      largo_Cadena= mid&#036;(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í:


--- Código: Text ---   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&#60;&#62;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.

Navegación

[0] Índice de Mensajes

Ir a la versión completa