Saltar para o conteúdo principal
Versão: Próximo

SET PRINT MARKER

SET PRINT MARKER ( markNum ; posiçao {; *} )

ParâmetroTipoDescrição
markNumIntegerNúmero do marcador
posiçaoIntegerNova posição do marcador
*OperadorSe passado = mover marcadores seguintes; se omitido = não move os marcadores seguintes

Esse comando não é seguro para thread e não pode ser usado em código adequado.

Descrição

O comando SET PRINT MARKER permite definir a posição de um marcador durante a impressão. Combinado com os comandos Get print marker, OBJECT MOVE ou Print form, este comando lhe permite ajustar o tamanho das áreas de impressão.

SET PRINT MARKER pode ser utilizado em dois contextos:

  • durante o evento de formulário On header, no contexto de os comandos PRINT SELECTION e PRINT RECORD.
  • durante o evento de formulário On Printing Detail, no contexto do comando Print form.. Esta operação facilita a impressão de informes personalizados (ver exemplo).
  • O efeito do comando está limitado à impressão; nenhuma modificação aparece na tela. As modificações realizadas os formulários não são guardados.

Passe no parâmetro markNum una das constantes do tema :

ConstanteTipoValor
Form break0Inteiro longo300
Form break1Inteiro longo301
Form break2Inteiro longo302
Form break3Inteiro longo303
Form break4Inteiro longo304
Form break5Inteiro longo305
Form break6Inteiro longo306
Form break7Inteiro longo307
Form break8Inteiro longo308
Form break9Inteiro longo309
Form detailInteiro longo0
Form footerInteiro longo100
Form headerInteiro longo200
Form header1Inteiro longo201
Form header10Inteiro longo210
Form header2Inteiro longo202
Form header3Inteiro longo203
Form header4Inteiro longo204
Form header5Inteiro longo205
Form header6Inteiro longo206
Form header7Inteiro longo207
Form header8Inteiro longo208
Form header9Inteiro longo209

Em posição, passe a nova posição desejada, expressada em píxels.

Se passa o parâmetro opcional *, todos os marcadores localizados em baixo do marcador especificado por markNum se moverão o mesmo número de píxels e na mesma direção que este marcador quando se executa o comando. Advertência: neste caso, os objetos presentes nas áreas situadas abaixo do marcador também se movem.

Quando o parâmetro * se utiliza, é possível posicionar o marcador markNum alem da posição inicial dos marcadores que o seguem, estes últimos marcadores serão movidos simultaneamente.

Notas:

• Este comando modifica só a posição de os marcadores existentes. Não permite a adição de marcadores. Se atribuir um marcador que não existe no formulário, o comando não fará nada.
• O funcionamento dos marcadores de impressão em modo Desenho se conserva: um marcador não pode ir mais acima do que o antecede, nem mais abaixo do que o que segue (quando o parâmetro * não se utiliza).

Exemplo

Este exemplo completo permite gerar a impressão de um relatório de três colunas, a altura de cada linha se calcula de acordo com os conteúdos dos campos.

O formulário de saída utilizado para a impressão é o seguinte:

O evento de formulário On Printing Detail foi selecionado para o formulário (recorde que sem importar em que área se imprima, o comando Print form só gera este tipo de evento de formulário).
Para cada registro, a altura da linha deve estar adaptada de acordo aos conteúdos da coluna "Atores" ou "Resumo" (coluna tem a maioria do conteúdo). Este é o resultado desejado:

O método de projeto de impressão é o seguinte:

 var vLaltura_imp;$vLaltura;vLaltura_impresso : Integer
 C_STRING(31;vSprint_area)
 PAGE SETUP([Filmes];"List_Imp3")
 GET PRINTABLE AREA(vLaltura_imp)
 vLaltura_impreso:=0
 ALL RECORDS([Filmes])
 vSprint_area:="Cabeçalho" //Impressão da área de cabeçalho
 $vLaltura:=Print form([Filmes];"List_Imp3";Form header)
 $vLaltura:=21   //Altura fixa
 vLaltura_impreso:=vLaltura_impresso+$vLaltura
 
 While(Not(End selection([Filmes])))
    vSprint_area:="Detalhe" //Impressão da área de detalhe
    $vLaltura:=Print form([Filmes];"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:

 var $l;$t;$r;$b;$fixed_wdth;$exact_hght;$l1;$t1;$r1;$b1 : Integer
 var $final_pos;$i : Integer
 var $detalle_pos;$encabezado_pos;$altura_a_imprimir;$altura_restante : Integer
 
 Case of
    :(vSprint_area="Detalle") //Impresión del detalle en proceso
       OBJECT GET COORDINATES([Peliculas]Actores;$l;$t;$r;$b)
       $largo_fijo:=$r-$l  //Cálculo del tamaño del campo tipo texto Actores
       $altura_exact:=$b-$t
       OBJECT GET BEST SIZE([Peliculas]Actores;$largo;$alto;$largo_fijo)
  //Tamaño óptimo del campo de acuerdo a su contenido
       $movimiento:=$alto-$altura_exact
 
       OBJECT GET COORDINATES([Peliculas]Resumen;$l1;$t1;$r1;$b1)
       $largo_fijo:=$r1-$l1  //Cálculo del tamaño del campo tipo texto Resumen
       $altura_exact1:=$b1-$t1
       OBJECT GET BEST 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
          OBJECT MOVE([Peliculas]Actores;$l;$t;$r;$hght+$t;*)
          OBJECT MOVE([Peliculas]Resumen;$l1;$t1;$r1;$alto1+$t1;*)
 
  //Redimensionamiento de las líneas de división
          OBJECT GET COORDINATES(*;"H1Linea";$l;$t;$r;$b)
          OBJECT MOVE(*;"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 também

Get print marker
OBJECT GET BEST SIZE
OBJECT GET COORDINATES
OBJECT MOVE
PAGE BREAK
Print form
PRINT RECORD
PRINT SELECTION