De entrada debes saber que son unas coordenadas, como asumo que si
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).
public structure infoArea
x as long
y as long
ancho as long
alto as long
end structure
public Structure infoMedidas
ancho as long
alto as long
end Structure
public Structure infoPosicion
X as long
Y as long
end Structure
private p_Area as infoarea
private p_Campo as infoArea
private p_Margenes as infoMedidas
private p_PosicionActual as infoPosicion ' desplazamiento actual libre
public cheques() as infoArea
public sub New(elArea as infoArea, elCampo as infoArea, margenes as infoMedidas)
p_Area=elArea
p_Campo= elCampo
p_Margenes=margenes
call Posicionar_Inicio
end sub
private sub Posicionar_Inicio()
p_PosicionActual.X=p_Area.x + p_Maregenes.Ancho
p_PosicionActual .Y= p_Area.y + p_Margenes.alto
end sub
private sub Actualizar_PosicionVertical(medidas as infoMedidas)
p_PosicionActual .Y= p_PosicionActual .Y + medidas.alto + p_Margenes.alto
end 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.
' suponemos que todos los cheques son del mismo tamaño
public 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...