CLR: .Net / Mono / Boo / Otros CLR > VB .NET
Imprimir en un punto especifico en VB2005
(1/1)
Vortice:
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.
Nebire:
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 --- public structure infoArea x as long y as long ancho as long alto as long end structurepublic Structure infoMedidas ancho as long alto as longend Structurepublic Structure infoPosicion X as long Y as longend Structure private p_Area as infoareaprivate p_Campo as infoAreaprivate p_Margenes as infoMedidasprivate p_PosicionActual as infoPosicion ' desplazamiento actual libre public cheques() as infoAreapublic sub New(elArea as infoArea, elCampo as infoArea, margenes as infoMedidas) p_Area=elArea p_Campo= elCampo p_Margenes=margenes call Posicionar_Inicioend sub private sub Posicionar_Inicio() p_PosicionActual.X=p_Area.x + p_Maregenes.Ancho p_PosicionActual .Y= p_Area.y + p_Margenes.altoend sub private sub Actualizar_PosicionVertical(medidas as infoMedidas) p_PosicionActual .Y= p_PosicionActual .Y + medidas.alto + p_Margenes.altoend sub 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 --- ' suponemos que todos los cheques son del mismo tamañopublic sub Situar_Cheque(IndexCheque as integer) dim tam as infoMedidas if indexCheque < 0 or indexcheque> cheque.length then throw new exception "No existe el índice de cheque " & indexcheque & vbcrlf & "Imposible continuar..." exit sub end if tam.ancho=cheque(indexCheque).ancho tam.alto=cheque(indexCheque).alto ' 1º una comprobación para verificar si realmente cabe en el área if Verificar_Tamaño(tam)=true then if Verificar_TieneSitio(tam)=true then Cheque(indexcheque).x= p_PosicionActual.x Cheque(indexcheque).y= p_PosicionActual.y call Actualizar_Posicion(tam) else msgbox "no se ha ubicado el cheque actual con referencia " & algun_dato_que_lo_referencie & " No cabe en la página actual" end if else msgbox "No se pudo situar el cheque su tamaño es mayor que el área destinada al efecto..." ' 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... end if end sub private function Verificar_Tamaño(tam as infoMedidas) as boolean return (tam.ancho <= p_Area.ancho) and tam.Alto <= p_Area.alto)end function private function Verificar_TieneSitio(tam as infomedidas) as boolean return (( p_PosicionActual.x + tam.Ancho) <= p_Area.ancho) and (( p_PosicionActual.Y + tam.alto) <= p_Area.alto) ' nota no se ha considerado margen derecho ni margen inferior....end function
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...
Navegación
Ir a la versión completa