SET PRINT MARKER

4D - Documentation   Français   English   German   Español   4D v11 SQL, Comandos por temas   4D v11 SQL, Lista alfabética de comandos   4D v11 SQL, Constantes por temas   Regresar   Anterior   Siguiente

versión 2003 (Modificado)


SET PRINT MARKER (markNum; posicion{; *})

ParámetroTipoDescripción
markNumNuméricoNúmero de marcador
posicionNuméricoNueva posición del marcador
**Si se pasa = mover los marcadores siguientes
Si se omite = no mover los marcadores siguientes

Descripción

El comando SET PRINT MARKER permite definir la posición de un marcador durante la impresión. Combinado con los comandos Get print marker, MOVE OBJECT o Print form, este comando le permite ajustar el tamaño de las áreas de impresión.

SET PRINT MARKER puede utilizarse en dos contextos:

durante el evento de formulario On header, en el contexto de los comandos PRINT SELECTION y PRINT RECORD.

durante el evento de formulario On Printing Detail, en el contexto del comando Print form. Esta operación facilita la impresión de informes personalizados (ver ejemplo).

El efecto del comando está limitado a la impresión; ninguna modificación aparece en la pantalla. Las modificaciones realizadas a los formularios no se guardan.

Pase en el parámetro markNum una de las constantes del tema Área de formulario:

ConstanteTipoValor
Form HeaderEntero largo200
Form Header1...10Entero largo201...210
Form DetailEntero largo0
Form Break0...9Entero largo300...309
Form FooterEntero largo100

En posicion, pase la nueva posición deseada, expresada en píxeles.

Si pasa el parámetro opcional *, todos los marcadores ubicados debajo del marcador especificado por markNum se moverán el mismo número de píxeles y en la misma dirección que este marcador cuando se ejecuta el comando. Advertencia: en este caso, los objetos presentes en las áreas situadas debajo del marcador también se mueven.

Cuando el parámetro * se utiliza, es posible posicionar el marcador markNum más allá de la posición inicial de los marcadores que le siguen — estos últimos marcadores se moverán simultáneamente.

Notas:

Este comando modifica sólo la posición de los marcadores existentes. No permite la adición de marcadores. Si designa un marcador que no existe en el formulario, el comando no hará nada.

El funcionamiento de los marcadores de impresión en modo Diseño se conserva: un marcador no puede ir más arriba del que lo precede, ni más abajo del que lo sigue (cuando el parámetro * no se utiliza).

Ejemplo

Este ejemplo completo permite generar la impresión de un informe de tres columnas, la altura de cada línea se calcula de acuerdo a los contenidos de los campos.

El formulario de salida utilizado para la impresión es el siguiente:

El evento de formulario On Printing Detail fue seleccionado para el formulario (recuerde que sin importar en que área se imprima, el comando Print form sólo genera este tipo de evento de formulario).

Para cada registro, la altura de la línea debe estar adaptada de acuerdo a los contenidos de la columna "Actores" o "Resumen" (columna tiene la mayoría del contenido). Este es el resultado deseado:

El método de proyecto de impresión es el siguiente:

   C_LONGINT(vLaltura_imp;$vLaltura;vLaltura_impreso)
   C_STRING(31;vSprint_area)
   PAGE SETUP([Peliculas];"List_Imp3")
   GET PRINTABLE AREA(vLaltura_imp)
   vLaltura_impreso:=0
   ALL RECORDS([Peliculas])

   vSprint_area:="Encabezado"  `Impresión del área de encabezado
   $vLaltura:=Print form([Peliculas];"List_Imp3";Form Header)
   $vLaltura:=21  `Altura fija
   vLaltura_impreso:=vLaltura_impreso+$vLaltura

   While(Not(End selection([Peliculas])))
      vSprint_area:="Detalle"  `Impresión del área de detalle
      $vLaltura:=Print form([Peliculas];"List_Imp3";Form Detail)
         `El cálculo del detalle se lleva a cabo en el método de formulario
      vLaltura_impreso:=vLaltura_impreso+$vLaltura
      If(OK=0)  `CANCEL ha sido ejecutado en el método de formulario 
         PAGE BREAK
         vLaltura_impreso:=0
         vSprint_area:="Encabezado"  `Reimpresión del área de encabezado
         $vLaltura:=Print form([Peliculas];"List_Imp3";Form Header)
         $vLaltura:=21
         vLaltura_impreso:=vLaltura_impreso+$vLaltura
         vSprint_area:="Detalle"
         $vLaltura:=Print form([Peliculas];"List_Imp3";Form Detail)
         vLaltura_impreso:=vLaltura_impreso+$vLaltura
      End if
      NEXT RECORD([Peliculas])
   End while
   PAGE BREAK   `Asegúrese de que la última página se imprima

El método de formulario List_Imp3 es el siguiente:

   C_LONGINT($l;$t;$r;$b;$fixed_wdth;$exact_hght;$l1;$t1;$r1;$b1)
   C_LONGINT($final_pos;$i)
   C_LONGINT($detalle_pos;$encabezado_pos;$altura_a_imprimir;$altura_restante)

   Case of
      : (vSprint_area="Detalle")   `Impresión del detalle en proceso
         GET OBJECT RECT([Peliculas]Actores;$l;$t;$r;$b) 
         $largo_fijo:=$r-$l   `Cálculo del tamaño del campo tipo texto Actores
         $altura_exact:=$b-$t
         BEST OBJECT SIZE([Peliculas]Actores;$largo;$alto;$largo_fijo)
            `Tamaño óptimo del campo de acuerdo a su contenido 
         $movimiento:=$alto-$altura_exact
   
         GET OBJECT RECT([Peliculas]Resumen;$l1;$t1;$r1;$b1)
         $largo_fijo:=$r1-$l1   `Cálculo del tamaño del campo tipo texto Resumen
         $altura_exact1:=$b1-$t1
         BEST OBJECT SIZE([Peliculas]Resumen;$largo1;$alto1;$largo_fijo)
            `Tamaño óptimo del campo de acuerdo a su contenido
         $movimiento1:=$alto1-$altura_exact1
         If($movimiento1>$movimiento) 
               `Determinamos el campo más alto
            $movimiento:=$movimiento1
         End if
   
         If($movement>0)
            $posicion:=Get print marker(Form Detail) 
            $final_pos:=$posicion+$movimiento
               `Nos movemos al marcador Detalle y a los que siguen
            SET PRINT MARKER(Form Detail ;$final_pos;*)
               `Redimensionamiento de las áreas de texto
            MOVE OBJECT([Peliculas]Actores;$l;$t;$r;$hght+$t;*)
            MOVE OBJECT([Peliculas]Resumen;$l1;$t1;$r1;$alto1+$t1;*)
   
               `Redimensionamiento de las líneas de división
            GET OBJECT RECT(*;"H1Linea";$l;$t;$r;$b)
            MOVE OBJECT(*;"H1Line";$l;$final_pos-1;$r;$final_pos;*)
            For ($i;1;4;1)
               GET OBJECT RECT(*;"VLinea"+Cadena($i);$l;$t;$r;$b)
               MOVE OBJECT(*;"VLinea"+Cadena($i);$l;$t;$r;$final_pos;*)
            End for 
         End if 
   
            `Cálculo del espacio disponible
         $detalle_pos:=Get print marker(Form Detail)
         $encabezado_pos:=Get print marker(Form Header)
         $altura_a_imprimir:=$detalle_pos-$encabezado_pos
         $altura_restante:=altura_impreso-vLaltura_impreso
         If($altura_restante<$altura_a_imprimir)   `Altura insuficiente
            CANCEL   `Pasar la línea a la siguiente página
         End if 
   End case

Ver también

BEST OBJECT SIZE, GET OBJECT RECT, Get print marker, MOVE OBJECT, PAGE BREAK, Print form, PRINT RECORD, PRINT SELECTION.


4D - Documentation   Français   English   German   Español   4D v11 SQL, Comandos por temas   4D v11 SQL, Lista alfabética de comandos   4D v11 SQL, Constantes por temas   Regresar   Anterior   Siguiente