Fecha actual Vie Mar 29, 2024 10:26 am

Todos los horarios son UTC + 1 hora [ DST ]




Nuevo tema Responder al tema  [ 6 mensajes ] 
Autor Mensaje
NotaPublicado: Sab Ene 11, 2014 5:52 pm 
Avatar de Usuario

Registrado: Mar Oct 11, 2005 6:58 pm
Mensajes: 135
Ubicación: España
Bruno;
Tal como me has indicado en e-mail que me has mandado, de que te hiciese la consulta atraves del foro pues bien aqui la tienes:

He construido un programa con C3 y funciona perfectamente, pero a la hora de imprimir los datos de un campo MEMO, necesito una funcion que me justifique el TEXTO, por la decha y por la izquierda al mismo tiempo con cualquier tipo de letra que utilice igual que lo hace el Word.

Ya que con la función DRAWTEXT() solo puedo justificar el texto, ala DERECHA, IZQUIERDA o CENTRADO y yo necesito que me lo justifique en ambos lados.

Esta consulta ya la hice aqui en el foro y algunos compañeros me dieron una solución, pero solo servia para un determinado tipo de letras y yo necesito que sea para cualquier tipo de letra.

Aqui te adjunto una ficha para que veas lo que hace el programa y como puedes comprovar en el campo MEMO no me justifica el texto en ambos lados.

Esperando tu respuesta te saluda:

Fraguibo


Adjuntos:
Violetas Imperiales.jpg [171.81 KiB]
245 veces
Arriba
 Perfil  
Responder citando  
NotaPublicado: Dom Ene 12, 2014 10:22 am 
Site Admin
Avatar de Usuario

Registrado: Jue Oct 06, 2005 10:49 pm
Mensajes: 655
Ubicación: España - Salamanca
El cálculo no es tan directo como cabría esperar, hay que hacerlo en varios pasos:

- Concatenar todo el texto del memo de forma que no haya saltos de línea, es decir, obtener cada uno de los párrafos.
- Partiendo de una cadena vacía vamos añadiendo las palabras del párrafo que queremos justificar y cada vez que añadimos una palabra comprobamos su longitud real con la fuente seleccionada. Si entra en el espacio en el que queremo imprimir añadimos la siguiente palabra y repetimos el proceso. Cuando ya no entre en nuestro espacio descartamos la última palabra añadida y con esa parte de cadena que ha entrado en el hueco la añadimos a un array de líneas, inicializamos nuestra cadena de nuevo y empezamos a añadir palabras y comprobar que entra en el hueco. Con esto obtenemos una lista de cadenas que si caben en nuestra anchura.
- Vamos imprimiendo todas las líneas de este array justificado a ambos lados menos la última, que la justificamos a la izquierda.

Para obtener la longitud real de una cadena al imprimirla usaremos la llamada al API GetTextExtentPoint32 que nos da la altura y anchura exactas.

Para cambiar la justificación usaremos la llamada al API SetTextJustification indicándole el espacio extra que nos sobra en cada cadena, que es cero al justificar a la izquierda, a la derecha y al centro, y para justificar a ambos lados es la diferencia entre la anchura real del hueco y la anchura real de la cadena a imprimir.

Como ves es una tarea algo complicada, yo ya la tengo implementada en mi copia particular de C3, el problema es que esta copia no coincide con la que tenéis vosotros y tengo que trasladar este código al objeto TPrinter que tenéis vosotros. Voy a revisarlo a ver si puedo hacerlo y publicar un archivo OBJ con los cambios.

_________________
Un saludo,
Bruno Cantero
www.c3compiler.com


Arriba
 Perfil  
Responder citando  
NotaPublicado: Vie Ene 31, 2014 6:07 pm 
Avatar de Usuario

Registrado: Mar Oct 11, 2005 6:58 pm
Mensajes: 135
Ubicación: España
Bruno;
Gracias por tu respuesta y por lo que te explicas parece ser un poco complicado pero no imposible.

haber cuando tienes un poco de tiempo y haces esta función, ya que yo no puedo terminar el trabajo hasta que no disponga de ella.

Atentamente te saluda.

Fraguibo


Arriba
 Perfil  
Responder citando  
NotaPublicado: Mié Feb 26, 2014 10:23 am 
Site Admin
Avatar de Usuario

Registrado: Jue Oct 06, 2005 10:49 pm
Mensajes: 655
Ubicación: España - Salamanca
Fraguibo, descarga la última versión del foro de Novedades y puedes probar la justificación de los campos memo, su uso es el siguiente:

- el contenido del texto debe ser estar seguido, párrafos completos, los saltos de línea separan los párrafos.
Código:
cTexto := "Texto que se debe imprimir en un espacio determinado y justificado. Todo el texto debe estar seguido ya que las líneas se calcularán en función del recuadro a justificar."


- usamos el método SplitText del objeto Printer y le indicamos la achura deseada en milímetros, nos devuelve un array de las líneas ya ajustadas:
Código:
aLineas := Printer:SplitText( cTexto, 150 ) // 15 centímetros de ancho


- Mostramos todas las líneas del array menos la última justificadas:
Código:
nLinea := 10 // empezamos a un centímetro de altura de la hoja
for nI := 1 to Len( aLineas )
   Printer:DrawText( aLineas[ nI ], { 10, nLinea, 160, nLinea + 10 }, TA_JUSTIFY )
   nLinea += 5 // aumentamos el interlineado en medio centímetro
next


- Mostramos la última línea del párrafo justificada a la izquierda:
Código:
Printer:DrawText( ATail( aLineas), { 10, nLinea, 160, nLinea + 10 }, TA_LEFT )


El contenido de la variable cTexto no se modifica, se devuelven copias de las líneas ajustadas a la achura especificada. Repetimos el proceso por cada párrafo que queramos justificar. Dependiendo de la fuente seleccionada el número de líneas calculadas variará.

_________________
Un saludo,
Bruno Cantero
www.c3compiler.com


Arriba
 Perfil  
Responder citando  
NotaPublicado: Vie Feb 28, 2014 7:05 pm 
Avatar de Usuario

Registrado: Mar Oct 11, 2005 6:58 pm
Mensajes: 135
Ubicación: España
Bruno gracias por el aporte, pues desde el IDE funciona bien, a un que le he tenido que hacer una pequeña corrección, ya que la ultima linea NO me la escribia bien, aqui te adjunto el codigo corregido que funciona bien.

Tambien te comento que la ultima version del C3-3 desde la linea de comandos NO puedo compilar el programa, ya que al linkarlo me da error.

Atentamente te saluda:

Fraguibo


Adjuntos:
Justificar Texto.txt [772 Bytes]
264 veces
Arriba
 Perfil  
Responder citando  
NotaPublicado: Vie Feb 28, 2014 7:27 pm 
Site Admin
Avatar de Usuario

Registrado: Jue Oct 06, 2005 10:49 pm
Mensajes: 655
Ubicación: España - Salamanca
Es verdad, escribí el código aquí directamente y no lo probé, aunque en las instrucciones te decía que se muestran todas menos la última justificadas y la última justificada a la izquierda, en el código no disminuí el número de líneas en uno. Lo importante es que entiendas el funcionamiento.

_________________
Un saludo,
Bruno Cantero
www.c3compiler.com


Arriba
 Perfil  
Responder citando  
Mostrar mensajes previos:  Ordenar por  
Nuevo tema Responder al tema  [ 6 mensajes ] 

Todos los horarios son UTC + 1 hora [ DST ]


No puede abrir nuevos temas en este Foro
No puede responder a temas en este Foro
No puede editar sus mensajes en este Foro
No puede borrar sus mensajes en este Foro
No puede enviar adjuntos en este Foro

Buscar:
Saltar a:  
cron