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

[0] Índice de Mensajes

Ir a la versión completa