• Domingo 28 de Abril de 2024, 00:02

Autor Tema:  Tengo Un Programa Y No Logro Descifralo  (Leído 2002 veces)

Jamaicol

  • Nuevo Miembro
  • *
  • Mensajes: 22
    • Ver Perfil
Tengo Un Programa Y No Logro Descifralo
« en: Jueves 13 de Octubre de 2005, 22:55 »
0
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:
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.

cpmario

  • Miembro HIPER activo
  • ****
  • Mensajes: 629
    • Ver Perfil
    • http://www.cpimario.com
Re: Tengo Un Programa Y No Logro Descifralo
« Respuesta #1 en: Jueves 13 de Octubre de 2005, 23:08 »
0
Explica que quieres decir con
Citar
la linea que hace que salte cuando llega a un determinado punto

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

  • Nuevo Miembro
  • *
  • Mensajes: 22
    • Ver Perfil
Re: Tengo Un Programa Y No Logro Descifralo
« Respuesta #2 en: Domingo 16 de Octubre de 2005, 18:59 »
0
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

  • Miembro MUY activo
  • ***
  • Mensajes: 188
    • Ver Perfil
Re: Tengo Un Programa Y No Logro Descifralo
« Respuesta #3 en: Lunes 17 de Octubre de 2005, 20:43 »
0
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
  1.  
  2. Private Sub Form_Load()
  3. 'Crea el formulario con todas las cosillas dentro
  4.     'colocacion de el el cuadro de texto
  5.     'margen derecho el tamaño del parrafo o columna
  6.     txtBox.RightMargin = 7.3
  7.     'para que vaya centrada la letra
  8.     txtBox.SelAlignment = 2
  9.     'para que tenga margen a la parte izquierda
  10.     txtBox.SelIndent = 2
  11.     mnuEditDeshacer.Enabled = False
  12.     txtBox.AutoVerbMenu = True
  13.     If SendMessage(txtBox.hWnd, EM_CANUNDO, 0&, ByVal 0&) Then
  14.             mnuEditDeshacer.Enabled = True
  15.             cmdDeshacer.Enabled = mnuEditDeshacer.Enabled
  16.             End If
  17.     txtBox.Top = 0 + tbHerramientas.Height
  18.     txtBox.Left = 0
  19.     '''''''''''''''''''''''''''''''''''''''''''''''
  20.     txtBox.Font.size = 11
  21.     filename = ""
  22.     fullname = ""
  23.     Actualizado = True
  24.     mnuSearchFindnext.Enabled = False
  25.     start = 1
  26. End Sub
  27.  
  28.  

Saludos.

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: Tengo Un Programa Y No Logro Descifralo
« Respuesta #4 en: Martes 22 de Abril de 2008, 19:06 »
0
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.
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
  1.  
  2.  public function largo_Cadena(cadena as string) as long
  3.        largo_Cadena= len(cadena) * textwidth("W")
  4.  end function
  5.  
  6.  

Caso 2: fuentes no monoespaciadas
Código: Text
  1.  
  2.  public function largo_Cadena(cadena as string) as long
  3.       dim tam as long
  4.       for n=1 to len(cadena)
  5.           tam=tam + textwidth(mid$(cadena,n,1))
  6.       next n
  7.       largo_Cadena= tam
  8.  end function
  9.  
  10.  
  11.  

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
  1.  
  2.   public function setLargo_Cadena(cadena as string, largo as long, optional nPosicion as long=-1) as string
  3.       dim tam as long
  4.       static puntero as long
  5.  
  6.       if nPosicion=-1 then
  7.             puntero=1
  8.       else
  9.            if puntero=len(cadena) then
  10.                 setLargo_Cadena= vbcrlf
  11.                 puntero=1
  12.                 exit function
  13.            end if
  14.       end if
  15.       for n=puntero to len(cadena)
  16.           tam=tam + textwidth(mid$(cadena,n,1))
  17.           if tam>largo then exit for
  18.       next n
  19.       largo_Cadena= mid$(cadena,n-1,puntero)
  20.       puntero=n
  21.  end function
  22.  
  23.  

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
  1.  
  2.   public function dividir_CadenasSegunTamaño(cadena as string) as string()
  3.       dim s as string
  4.       dim cad() as string
  5.      dim t as long
  6.       dim largos(0 to 9)
  7.       largos=set_Largos
  8.       redim cad(0 to 65535) as string
  9.       do  while s<>vbcrlf
  10.            s= setLargo_Cadena(cadena,largos(t mod 9))
  11.            cad(t)=s
  12.            t=t +1
  13.       loop
  14.       redim preserve cad(0 to t)
  15.       dividir_CadenasSegunTamaño=cad
  16.   end function
  17.   
  18. ' entrega una matriz de tamaños...
  19.   private function set_Largos() as long
  20.       dim lg(0 to 8)
  21.       lg(0)= 120 : lg(1)= 140 : lg(2)= 160
  22.       lg(3)= 180 : lg(4)= 200 : lg(5)= 220
  23.       lg(6)= 240 : lg(7)= 260 : lg(8)= 280
  24.       Largos=lg
  25.   end function
  26.  
  27.  

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.
«Ma non troppo»
----> ModoVacaciones = False<----