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 :
Constante |
Tipo |
Valor |
Form break0 |
Inteiro longo |
300 |
Form break1 |
Inteiro longo |
301 |
Form break2 |
Inteiro longo |
302 |
Form break3 |
Inteiro longo |
303 |
Form break4 |
Inteiro longo |
304 |
Form break5 |
Inteiro longo |
305 |
Form break6 |
Inteiro longo |
306 |
Form break7 |
Inteiro longo |
307 |
Form break8 |
Inteiro longo |
308 |
Form break9 |
Inteiro longo |
309 |
Form detail |
Inteiro longo |
0 |
Form footer |
Inteiro longo |
100 |
Form header |
Inteiro longo |
200 |
Form header1 |
Inteiro longo |
201 |
Form header10 |
Inteiro longo |
210 |
Form header2 |
Inteiro longo |
202 |
Form header3 |
Inteiro longo |
203 |
Form header4 |
Inteiro longo |
204 |
Form header5 |
Inteiro longo |
205 |
Form header6 |
Inteiro longo |
206 |
Form header7 |
Inteiro longo |
207 |
Form header8 |
Inteiro longo |
208 |
Form header9 |
Inteiro longo |
209 |
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).
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:
C_LONGINT(vLaltura_imp;$vLaltura;vLaltura_impresso)
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"
$vLaltura:=Print form([Filmes];"List_Imp3";Form header)
$vLaltura:=21  
vLaltura_impreso:=vLaltura_impresso+$vLaltura
While(Not(End selection([Filmes])))
vSprint_area:="Detalhe"
$vLaltura:=Print form([Filmes];"List_Imp3";Form detail)
vLaltura_impreso:=vLaltura_impreso+$vLaltura
If(OK=0)
PAGE BREAK
vLaltura_impreso:=0
vSprint_area:="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
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")
OBJECT GET COORDINATES([Peliculas]Actores;$l;$t;$r;$b)
$largo_fijo:=$r-$l
$altura_exact:=$b-$t
OBJECT GET BEST SIZE([Peliculas]Actores;$largo;$alto;$largo_fijo)
$movimiento:=$alto-$altura_exact
OBJECT GET COORDINATES([Peliculas]Resumen;$l1;$t1;$r1;$b1)
$largo_fijo:=$r1-$l1
$altura_exact1:=$b1-$t1
OBJECT GET BEST SIZE([Peliculas]Resumen;$largo1;$alto1;$largo_fijo)
$movimiento1:=$alto1-$altura_exact1
If($movimiento1>$movimiento)
$movimiento:=$movimiento1
End if
If($movement>0)
$posicion:=Get print marker(Form detail)
$final_pos:=$posicion+$movimiento
SET PRINT MARKER(Form detail;$final_pos;*)
OBJECT MOVE([Peliculas]Actores;$l;$t;$r;$hght+$t;*)
OBJECT MOVE([Peliculas]Resumen;$l1;$t1;$r1;$alto1+$t1;*)
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
$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)
CANCEL
End if
End case