• Viernes 8 de Noviembre de 2024, 05:36

Autor Tema:  Imprimir en un punto especifico en VB2005  (Leído 1356 veces)

Vortice

  • Miembro MUY activo
  • ***
  • Mensajes: 135
    • Ver Perfil
Imprimir en un punto especifico en VB2005
« en: Miércoles 8 de Octubre de 2008, 00:47 »
0
Muy buenas noches a todos...tengo q realizar una aplicacion en la cual se debe imprimir unos cheques los cuales estaran en un lugar especifico de la hoja y la verdad nose como hacer eso, sera mas q bien recibida cualquier tipo de ayuda sobre el tema...

..desde ya gracias.
Solo el Bueno muere joven...

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: Imprimir en un punto especifico en VB2005
« Respuesta #1 en: Miércoles 8 de Octubre de 2008, 13:29 »
0
De entrada debes saber que son unas coordenadas, como asumo que si  :D  pasamos a lo siguiente.

Relativizar coordenadas...

Pongamos de ejemplo que tenemos un campo de futbol de 100m x 50m, luego si defino un punto dentro del campo utilizo unas coordenadas que suelen llamarse absolutas X=20 y= 30 define una posición dentro del campo. Bien si deseamos tomar un área necesitamos 4 puntos uno para cada esquina, sin embargo dado que queremos un área completamente cuadrada, para evitar errores (esto que no nos salga un área en forma de rombo o romboide, trapecio, etc..)   lo que haremos será solo definir 1 punto, (2 diagonalmente opuestos ya no darían un trapecio pero todavía darían para un rombo)  y un alto y un ancho, con ello también queda definida un área pero ahora ya sin duda alguna será un área de angulos a 90º. bien entonces ahora que hemos decidido crear un área específica dentro del campo para hacer lo que sea, que es tu caso, entonces puesto que allí vamos a enviar muchas cosas con cordenadas, lo que vamos a hacer es relativizar las coordenadas de ese área, asi en nuestro proyecto que es una clase pongamos FORM de nombre Campo_futbol vamos a crear otra clase llamada AREA
y cuando creemos una instancia de la clase área le pasaremos obligatoriamente un estructura tipo 'area'  para el campo, el área y unos márgenes (si los hubiere sobre el área).

Código: Visual Basic
  1.  
  2. public structure infoArea
  3.     x as long
  4.     y as long
  5.     ancho as long
  6.     alto as long
  7. end structure
  8. public Structure infoMedidas
  9.        ancho as long
  10.        alto as long
  11. end Structure
  12. public Structure infoPosicion
  13.      X as long
  14.      Y as long
  15. end Structure
  16.  
  17.  
  18. private p_Area as infoarea
  19. private p_Campo as infoArea
  20. private p_Margenes as infoMedidas
  21. private p_PosicionActual as infoPosicion  ' desplazamiento actual libre
  22.  
  23. public cheques() as infoArea
  24. public sub New(elArea as infoArea, elCampo as infoArea, margenes as infoMedidas)
  25.     p_Area=elArea
  26.     p_Campo= elCampo
  27.     p_Margenes=margenes
  28.     call Posicionar_Inicio
  29. end sub
  30.  
  31. private sub Posicionar_Inicio()
  32.     p_PosicionActual.X=p_Area.x  + p_Maregenes.Ancho
  33.     p_PosicionActual .Y= p_Area.y + p_Margenes.alto
  34. end sub
  35.  
  36. private sub Actualizar_PosicionVertical(medidas as infoMedidas)
  37.    p_PosicionActual .Y= p_PosicionActual .Y + medidas.alto + p_Margenes.alto
  38. end sub
  39.  
  40.  
Fíjate que necesitamos tanto las medidas del campo de fútbol (el tamaño del papel) como el de la localización y tamaño del área (la posición de los cheques) y unos márgenes si se van a utilizar. No lo he puesto pero habría que comprobar que el área es realmente más pequeño que el campo y que los márgenes también son acordes a las medidas del área.... y comprobar que la sitaución del área queda dentro del campo... eso lo dejo para ti, pero debe hacerse en el sub NEW

Ahora todo lo que tenemos que hacer es relativizar coordenadas cuando se nos pasen parámetros, para ello usaremos métodos tal como posicionar_Cheque, que para el caso sería un 'cheque'. Relativizar es usar coordenadas relativas, para ello fíjate bien en que si el área de colocación lleva márgenes o no, yo pondré un ejemplo para situar 1 cheque sobre la posición actual, con un margen de separación vertical .

Se supone que hay una matriz de cheques, y se supone que existen propiedades para modificar los cheques. Por tanto situarcheque ya sería una lllamada para asignarle una posición.
Código: Visual Basic
  1.  
  2. ' suponemos que todos los cheques son del mismo tamaño
  3. public sub Situar_Cheque(IndexCheque as integer)
  4.         dim tam as infoMedidas
  5.  
  6.       if indexCheque < 0 or indexcheque> cheque.length then
  7.              throw new exception "No existe el índice de cheque " & indexcheque & vbcrlf & "Imposible continuar..."
  8.              exit sub
  9.       end if        
  10.  
  11.        tam.ancho=cheque(indexCheque).ancho
  12.        tam.alto=cheque(indexCheque).alto
  13.  
  14.         ' 1º una comprobación para  verificar si realmente cabe en el área
  15.        if Verificar_Tamaño(tam)=true then
  16.             if Verificar_TieneSitio(tam)=true then
  17.                    Cheque(indexcheque).x= p_PosicionActual.x
  18.                   Cheque(indexcheque).y= p_PosicionActual.y
  19.                   call Actualizar_Posicion(tam)
  20.            else
  21.                  msgbox "no se ha ubicado el cheque actual con referencia " & algun_dato_que_lo_referencie  & " No cabe en la página actual"
  22.            end if
  23.        else
  24.             msgbox "No se pudo situar el cheque su tamaño es mayor que el área destinada al efecto..."
  25.           ' u otra acción que interese según el caso, por ejemplo enviar la página a la impresora, y luego pedir que se introduzca una nueva hoja...
  26.        end if  
  27. end sub
  28.  
  29. private function Verificar_Tamaño(tam as infoMedidas) as boolean
  30.      return  (tam.ancho <= p_Area.ancho) and  tam.Alto <= p_Area.alto)
  31. end function
  32.  
  33. private function Verificar_TieneSitio(tam as infomedidas) as boolean
  34.      return (( p_PosicionActual.x + tam.Ancho) <= p_Area.ancho) and (( p_PosicionActual.Y + tam.alto) <= p_Area.alto)
  35.      ' nota no se ha considerado margen derecho ni margen inferior....
  36. end function
  37.  
  38.  
  39.  
  40.  

Nota importante: fíjate que lo que se debe ajusta bien es la llamada a la función Actualizar_Posición yo te he incluído una llamada Actualizar_posiciónVertical  y una llamada posicion_Inicio que situaría al inicio de la página, esta debería invocarse cada nueva página..

Actualizar al ancho dependerá por tanto si hay más cosas a lo ancho o sólo 1 si un cheque tiene diferente alto y ancho al llamar a actualizar posición al final de la inserción queda la posición para recibir los siguientes. fíjate que posicion_Inicial ya relativiza el posicionamiento del resto de 'objetos' restringido al área + el margen de ese área....
Si hay margen entre cheques verticalmente , al actualizar posicion vertical debes añadir siempre el margen alto. (que será la misma o distinta del tope). En el ejemplo damos por supuesto que todos los márgenes son del mismo tamaño y que se especificaron al crear la instancia.

En fin  es jugar con la actualización de posiciones según el caso... pero ya tienes por donde tomarlo...
«Ma non troppo»
----> ModoVacaciones = False<----