// BLATTDRVG.prg         - gibt eine Druckseite (mit Vorschau) aus
// BlattDRG() heiát die Funktion aus historischen Grnden (Button-Activates)
// 06.11.2005 Auftrnr statt 6 jetzt 7-stellig bei MengX
// 06.11.2005: E ersetzt 6: aus StrX(1->auftrnr,6,0) wird StrX(1->auftrnr,E,0)
// Einige Funktionen sind ausgelagert nach DbDruSys.prg^
//+vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
//+23.01.2011 11:47 aPoSZ ist schon immer PUBLIC, wurde aber in einigen Funktionen zur LOCAL
//+                  jetzt wurde aPoSZ in der ParameterKlammer zu aPoSZ_Local, also lahmgelegt
//+                  das scheint positive Auswirkung auf die berflssigen Formfeeds am Ende zu haben
//+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
#include "Gra.ch"
#include "Xbp.ch"
#include "Appevent.ch"
#include "Appedit.ch"
#include "Appbrow.ch"
#include "Font.ch"
#include "FileIO.ch"
#include "Common.ch"
#include "Thread.ch"
**
// 3.5.2004 : nOrientierung = 1 (Portrait) oder = 2 (Landscape):
FUNCTION BlattDRG( cDatei, cTitle, oDlg1, nXsize, nYsize, cLPTSCR_Loc, cCP, nAnzahl, nt, nOrientierung )
LOCAL oPrinterPS, oFont, oBitMap, aBitSize, aBitRect, nRec
LOCAL nOldArea := Select(), cKommaOld := cKomma
LOCAL aBlattG := {}, aBlattZ := {}, i, aParamG := {}
LOCAL cSeite, cNa, cPrompt, cText, nTFont, cBereich, cFeld, nFFont, aRep := {}
LOCAL c, aDateien := {"bl_v","bl_r","bl_ra","bl_vr","bl_ru","bl_rh","bl_vrh", ;
                     "bl_r1","bl_r2","bl_r3","bl_ra1","bl_ra2","bl_n","bl_vr1","bl_vr2", ;
                     "bl_a","bl_a1","bl_r1o","bl_r2o",;
                     "bl_m","bl_m1","bl_m2","bl_m3","bl_m14","bl_m24","bl_m34",;
                     "bl_firm","bl_rent","bl_ord", ;
                     "bl_albr","bl_alb2","bl_hell","bl_krem"} // 05.04.2006 : zoom-Vorschau
PRIVATE cB, cF, cT, bT, nZei, nSpa , nSpaG
PRIVATE nMSum := nGS := nS1 := nS2 := nS3 := nS4 := nS5 := 0, nF := xFaktor
PRIVATE nS10 := nS11 := nS12 := nS13 := nS20 := nS21 := nS22 := nS23 := 0
PRIVATE nGSA := nGSN := nGRSA := nGRS := nSv := 0
PRIVATE nMSumh := nGSh := nS1h := nS2h := nS3h := nS4h := nS5h := 0
PRIVATE nGSAh := nGSNh := nGRSAh := nGRSh := nSvh := 0
PRIVATE aS := { 0, 0, 0, 0, 0 }
cCP := IIf(SET(43)==0,"A",cCP)  //03.12.2006 22:07
FOR i := 11 TO 30          // Dummy-Variablen fr Berechnungen in Formularen
   &("i"+Str(i,2,0)) := "0"
NEXT
FOR i := 11 TO 30          // Dummy-Variablen fr Berechnungen in Formularen
   &("ci"+Str(i,2,0)) := "0"
NEXT
PRIVATE nISum := 0, cISum := "0", nAnz := IIf(Empty(nAnzahl),1,nAnzahl)
PRIVATE cNt := "0", cAnz := "1" , cMwstjn := "n" , cHgwjn := "n", cZweiseitjn := "a" //a=automat.
PRIVATE cEigen := "n", lEigen := .F., lFremd := .F., nLetzteZeile := 0, hDA := DtoC(DATE())  //20.04.2007 18:20
PRIVATE cAuf := StrX( (1->auftrnr),E,0 )
PRIVATE cZeiMax := "65", cZwiSpalte := "50", cZeiZ := "70" //+14.11.2010 10:57 cZeiZ von 70 zu "70"
PRIVATE cZwi := "Im Rechnungsbetrag ist die gesetzliche Mehrwertsteuer"
PRIVATE nA := Alias(), cZwiSaldo := "n"
PRIVATE aSchrift := {}, aSeitZ := {}, cBK1, cBK2, hA1, hA2, hA3, hA4, hA5, hAN0, hAN1, hAN11, hAN2, hAN3, hAN4
PRIVATE cDru := cDatei  //16.09.2006 10:56 Dateiname der Druckdatei, zB. bl_brq2
PRIVATE cDummyNr := 0   //+20.02.2018 21:41 ist PUBLIC!!!   , nKomma := 0   //09.05.2007 08:35
PRIVATE aVZ := {}       //03.07.2007 22:01 in V3 bernimmt die aktuellen Zahlungen fr nt
DEFAULT nOrientierung TO 1    //02.10.2006 15:48
PRIVATE l180 := IIf( nOrientierung>2, .T., .F. )   //02.10.2006 15:55 fr gedrehten Ausdruck 3,4 statt 1,2
PRIVATE aEZ := AFill(Array(41),0), aFZ := AFill(Array(30),0)      //08.07.2007 22:21 Auftragsbogen BergX
PRIVATE aET := AFill(Array(41),""), aFT := AFill(Array(30),"")      //08.07.2007 22:21 Auftragsbogen BergX
PUBLIC cFormular := "N"      //+11.01.2009 18:10   'J'->damit Formulare 1:1 gedruckt werden
PRIVATE lReset := .T., lLesen := .T.      //+27.04.2009 22:13
PRIVATE cDN := Upper(cDruckerName)     //+10.09.2009 18:24
PRIVATE cBKpf, cVD := "j"      //+10.05.2011 20:14 wenn = n , dann kein cBriefkopf - siehe BPreview
PRIVATE cMailadresse := ""		//+12.07.2019 18:40 zum Einbauen ins Formular

PRIVATE t_Html := ""			//09.01.2026 10:29 
PRIVATE cHtml := ""				//09.01.2026 10:25 

//+14.11.2010 11:30 nachstehende Zeile war n”tig, weil nach bl_.tak-Žnderung der Prflauf vergessen wurde !!!
nOrientierung := IIf( nOrientierung<3, nOrientierung, nOrientierung-2 ) //02.10.2006 15:55
cBriefKopf := IIf( Empty(cBriefKopf),"n", cBriefKopf )   //14.11.2006 12:44 
cGoX := "" ; cGoY := "" ; cGuX := "" ; cGuY := ""     //+17.09.2009 20:34

cLPTSCR := IIf( !Empty(cLPTSCR_Loc), cLPTSCR_Loc, "P" )
c := cZoom  // 04.04.2006
IF AScan( aDateien, {|x| Upper(x)=Upper(cDatei) } ) = 0   // 05.04.2006
   cZoom := "{1,0,0}"
ENDIF
DbSuspendNotifications()
nRec := (nOldArea)->(RecNo())    //25.09.2007 17:45
IF Empty(cDruckerName)  // 10.04.2006
   cDruckerName := DruckerWahl()
   cDN := Upper(cDruckerName)       //+12.09.2009 15:05
ENDIF
SELECT 20
   IF Upper(AppName())$"VELLX.EXE"	// 22.01.2022 erstmal nur fr VellX
		//+10.02.2022 09:20 von MuellX.ineux. kopiert:
		//+25.08.2009 19:35 testet, ob irgendwo im Netz das Programm l„uft:
		nHandle := FOpen( "c:\hdbe\drubef.dbf", FO_EXCLUSIVE )
		IF nHandle = -1
		   //+ FormularVerwaltung() l„uft irgendwo im Netz: abbrechen
		   msgbox("Die Formular-Verwaltung l„uft bereits irgendwo im Netz! Sp„ter nochmal versuchen!")
		   RETURN .F.
		ELSE
		   FClose(nHandle)
		ENDIF
	   USE c:\hdbe\drubef		// wegen c:\hdbe sollte es eigentlich nie eine Kollision geben drfen ...
	ELSE
		USE Drubef
	ENDIF
IF "EPSON"$Upper(cDruckerName)   // 10.04.2006
   GO 2
ELSE
   GO BOTTOM
ENDIF

IF (Upper( cDrucker ) = "HP" .OR. "MI"$Upper(cDruckerName) .OR. "OK"$Upper(cDruckerName) .OR. "BR"$Upper(cDruckerName)) ;
         .AND. !"EPSON"$Upper(cDruckerName) //29.04.2006 17:05
   AAdd( aSchrift, Trim( 20->hpnorm ) )
   Aadd( aSchrift, Trim( 20->hp12p ) )
   Aadd( aSchrift, Trim( 20->hp14p ) )
   Aadd( aSchrift, Trim( 20->hpres1 ) )
   Aadd( aSchrift, Trim( 20->hpres2 ) )
   Aadd( aSchrift, Trim( 20->hpres3 ) )
   Aadd( aSchrift, Trim( 20->hpres4 ) )
   nPoffY := Val( Substr( 20->hpres5, 1, 3 ) )
   nPoffX := Val( Substr( 20->hpres5, 4, 3 ) )
   nPpZ := Val( Substr( 20->hpres5, 7, 3 ) )
   nPpS := Val( Substr( 20->hpres5, 10, 3 ) )
ELSE
   Aadd( aSchrift, Trim( 20->epnorm ) )
   Aadd( aSchrift, Trim( 20->ep12p ) )
   Aadd( aSchrift, Trim( 20->ep14p ) )
   Aadd( aSchrift, Trim( 20->epres1 ) )
   Aadd( aSchrift, Trim( 20->epres2 ) )
   Aadd( aSchrift, Trim( 20->epres3 ) )
   Aadd( aSchrift, Trim( 20->epres4 ) )
   nPoffY := Val( Substr( 20->epres5, 1, 3 ) )
   nPoffX := Val( Substr( 20->epres5, 4, 3 ) )
   nPpZ := Val( Substr( 20->epres5, 7, 3 ) )
   nPpS := Val( Substr( 20->epres5, 10, 3 ) )
ENDIF
USE
//+07.04.2017 21:34 fr die Offsets des Kyocera Ecosys P2040DN von Nolte
IF Upper(AppName())$"NOLTEX.EXE" .AND. "2040"$cDruckerName
   nPoffY := 30
   nPoffX := 50
ENDIF

//16.05.2007 18:48 aus FDrG()/DbDruDys.prg hierher verschoben:
   IF Len(aSchrift[1]) = 0             //16.05.2007 18:47 falls Drubef.dbf leer ist...
      aSchrift := {  "12.COURIER NEW" , ;
                     "10.ARIAL" , ;
                     "10.ARIAL FETT"  , ;
                     "12.COURIER NEW FETT" , ;
                     "10.TIMES NEW ROMAN"  , ;
                     "10.TIMES NEW ROMAN FETT"    , ;
                     "12.TIMES NEW ROMAN FETT KURSIV"  ;
                  }
   ENDIF

cDRnorm := aSchrift[1]
//++///////////////////////////////////////////////////////////////////////
//+01.05.2009 18:48 wenn dieses Blatt bereits einmal mit Ende+Druck gespeichert wurde,
//+ dann wird zuerst die SAFE_BL gelesen und mit dem NeuStart-Knopf ein Reset gemacht
DO WHILE lReset == .T.
   lReset := .F.
   SELECT 20
//++///////////////////////////////////////////////////////////////////////
   IF File( cDatei+"p.dbf" )
      IF 1->(IsFieldVar("perskz")) .AND. !Upper(AppName())$"WERNERX.EXE" .AND. !("MENG"$Upper(AppName()).AND.cSystem="S") //Upper(AppName())$"MUELLX.EXE-AX.EXE-BX.EXE"           // 8.2.2005
   // Experiment, damit der Aufbau aus bl_.tak statt aus bl_*.dbf erfolgt:
         DbUseArea( ,"SDFNTX", "bl_.tak", "bv", .T. )           // bereits in Area 20
         OrdListAdd("xBlFName")          // 9.2.2005: weil schon in ineux geindext
         DbSetScope( SCOPE_BOTH, PadR(Upper(cDatei+"p"),8) )
         DbGotop()
      ELSEIF Upper(AppName())$"RUDOX.EXE-BERGX.EXE"       //19.11.2006 14:55 10.02.2007 18:22
   // damit der Aufbau aus bl_.tak statt aus bl_*.dbf erfolgt:
         DbUseArea( ,"SDFNTX", "bl_.tak", "bv", .T. )           // bereits in Area 20
         OrdListAdd("xBlFName")          // 8.2.2005: weil schon in ineux geindext
         DbSetScope( SCOPE_BOTH, PadR(Upper(cDatei+"p"),8) )
         DbGotop()
      ELSEIF cSystem="S" .AND. "MENG"$Upper(AppName())  // 12.11.2005  MengX mit s-t-a
         DbUseArea( ,"SDFNTX", "C"+SubStr(cDatver,2)+"bl_.tak", "bv", .T. )           // bereits in Area 20
         OrdCreate( "C:\HDBE\xBlFName",, "Upper(fname)" )    // 8.2.2005
         DbSetScope( SCOPE_BOTH, PadR(Upper(cDatei+"p"),8) )
         DbGotop()
      ELSE
         USE &(cDatei+"p")          // die bisherige Originalzeile // 8.2.2005
      ENDIF
      DO WHILE .NOT. Eof()
         cSeite := Trim( 20->seite )  // s=Rckseite, b=neues Blatt, n=neue Bildmaske
         cNa := Trim( 20->na )       // t=Text „nderbar, f=Feldinhalt „nderbar
         cPrompt := Trim( 20->prompt )        // Bildschirm: Text fr Eingabe
         IF 20->Text[1]=="&" .AND. Empty(20->tfont) //23.07.2006 19:24   // 16.4.2005
            cT := IIf(SET(43)==0,ConvToAnsiCP(Trim(SubStr(20->Text,2))),Trim(SubStr(20->Text,2)))
            cT := &cT
            IF ValType(cT)=="C" .AND. "{|"$cT
               bT := &cT
               cText := Eval(bT)
            ELSE
               cText := cT
            ENDIF
         ELSE
            cText := IIf(SET(43)==0,ConvToAnsiCP(Trim(20->text)),Trim(20->text))
         ENDIF
         nTFont := 20->tfont         // Schriftart 1...7
         cBereich := 20->bereich      // Area des Feld-Files
         cFeld := Trim( 20->feld )   // Feldbezeichnung        ist doch Variable, also kein ConvCP?
         nFFont := 20->ffont         // Schriftart 1...7
         nZei := 20->zeile           // 0..80 = Zeilen, >80 = Pixel
         nSpa := 20->spalte          // Angabe in Spalten/Pixel je nach nZei
           IF !Empty( cFeld )
               cF := cFeld      // PRIVATE Variable als Parameter fr das Blatt
               &cF := IIf(cText="&",&(SubStr(cText,2)),cText)  //23.07.2006 19:24
           ENDIF
         AAdd( aParamG, { cSeite, cNa, cPrompt, cText, nTFont, ;
                              cBereich, cFeld, nFFont, nZei, nSpa }) //, RecNo() )  // 8.2.2005
         skip
      ENDDO
   ELSE
      cBriefkopf := ""     //17.05.2007 10:37
   ENDIF
      cBrNe5 := PadR(cBrNe5,1)    //29.06.2007 13:18
   //System-Variable entweder Standardwert oder Wert aus aParamG :
   nt := Val( cNt )
   nAnz := IIf( Val(cAnz)!=0, Val( cAnz ), IIf(nAnzahl!=NIL,nAnzahl,0) )
   //////// 10.12.2005: nPoffX/Y ergeben sich aus Val(cPoffX/Y) sp„ter in FDrG() (k”nnte geremt werden!?):
   //////nPoffX := IIf( Val( cPoffX )!=0, Val( cPoffX ), IIf(nPoffX!=NIL,nPoffX,0) )
   //////nPoffY := IIf( Val( cPoffY )!=0, Val( cPoffY ), IIf(nPoffY!=NIL,nPoffY,0) )
   //////// Bemerkung vom 10.12.2005: nPpS/Z bzw. cPpS/Z sind absolut, also entweder/oder nicht plus!
   //////nPpS := IIf( Val( cPpS )!=0, Val( cPpS ), IIf(nPpS!=NIL,nPpS,0) )
   //////nPpZ := IIf( Val( cPpZ )!=0, Val( cPpZ ), IIf(nPpZ!=NIL,nPpZ,0) )

   cBriefKopf := IIf(Empty(cBriefKopf),"  ",cBriefKopf)  //23.09.2006 17:40
   IF cBriefKopf[1] == "_"                                  // 12.6.2005 (fr Hanel)
      aBlattG := Formular( aBlattG, SubStr(cBriefKopf,2) )  // druckt bl_fbk zus„tzlich aus
   ELSEIF cBriefKopf[1] == "j" .AND. !Upper(AppName())$"AX.EXE-KREMERX.EXE"   // j bedeutet: l„dt bl_fbk
      aBlattG := Formular( aBlattG, "bl_fbk" )              // aber druckt nur bei "_"
      cBriefKopf := "n"
   ELSEIF !Upper(cDru)$"BL_TERM-BL_BRF0-BL_BRF1-BL_BRF2-BL_FOTO-BL_KAS-BL_KAST-BL_KASK-BL_KATX-BL_CHEC-BL_GRKR-BL_SFN-BL_GRUE" .AND. Upper(AppName())$"NOLTEX.EXE-MUELLX.EXE-BLEINX.EXE-KLUCKX.EXE-SONNEX.EXE-VELLX.EXE"  //+31.01.2022 11:45
   				 // 			Vorzeile: 04.12.2019 15:58: KLUCKX mit upper(cDru) - fr Trauerdrucksachen
      aBlattG := Formular( aBlattG, "bl_fbk" )
   ENDIF

   IF 1->(IsFieldVar("perskz")) .AND. !Upper(AppName())$"WERNERX.EXE" .AND. !("Meng"$Upper(AppName()).AND.cSystem="S") //Upper(AppName())$"MUELLX.EXE-AX.EXE-BX.EXE"           // 8.2.2005
// Experiment, damit der Aufbau aus bl_.tak statt aus bl_*.dbf erfolgt:
      DbUseArea( ,"SDFNTX", "bl_.tak", "bv", .T. )           // bereits in Area 20
      OrdListAdd("xBlFName")          // 8.2.2005: weil schon in ineux geindext
      DbSetScope( SCOPE_BOTH, PadR(Upper(cDatei),8) )
      DbGotop()
   ELSEIF Upper(AppName())$"RUDOX.EXE-BERGX.EXE-LANGEX.EXE-KREMERX.EXE"       //19.11.2006 14:55 10.02.2007 18:22
// damit der Aufbau aus bl_.tak statt aus bl_*.dbf erfolgt:
      DbUseArea( ,"SDFNTX", "bl_.tak", "bv", .T. )           // bereits in Area 20
      OrdListAdd("xBlFName")          // 8.2.2005: weil schon in ineux geindext
      DbSetScope( SCOPE_BOTH, PadR(Upper(cDatei),8) )
      DbGotop()
   ELSEIF cSystem="S" .AND. "MENG"$Upper(AppName())      // 12.11.2005  MengX mit s-t-a
      DbUseArea( ,"SDFNTX", "C:\HDBE\bl_.tak", "bv", .T. )           // bereits in Area 20
      OrdCreate( "C:\HDBE\xBlFName",, "Upper(fname)" )    // 8.2.2005
      DbSetScope( SCOPE_BOTH, PadR(Upper(cDatei),8) )
      DbGotop()
   ELSE
      USE &cDatei          // die bisherige Originalzeile // 8.2.2005
   ENDIF
   nA := Alias()
   DO WHILE .NOT. Eof()
      cSeite := Trim( &nA->seite )  // s=Rckseite, b=neues Blatt, n=neue Bildmaske
      cNa := Trim( &nA->na )       // t=Text „nderbar, f=Feldinhalt „nderbar
      cPrompt := Trim( &nA->prompt )        // Bildschirm: Text fr Eingabe
      cText := &nA->text
      nTFont := &nA->tfont         // Schriftart 1...7
      cBereich := &nA->bereich      // Area des Feld-Files
      cFeld := Trim( IIf(SET(43)==0,ConvToAnsiCP(&nA->feld),&nA->feld) )   // Feldbezeichnung
      nFFont := &nA->ffont         // Schriftart 1...7
      nZei := &nA->zeile           // 0..80 = Zeilen, >80 = Pixel
      nSpa := &nA->spalte          // Angabe in Spalten/Pixel je nach nZei
         IF cNa = "t"                 // Text ist zu ver„ndern
         ELSEIF cNa = "f"             // Feldinhalt soll editiert werden
            cB := cBereich ; cF := cFeld
            xF := ( (&cB)->(&cF) )      //Feldinhalt
            DO CASE
               CASE Valtype( xF ) == "C"
                  cFeld := xF
               CASE ValType( xF ) == "N"
                  cFeld := Str( xF )
               CASE ValType( xF ) == "D"
                  cFeld := DtoC( xF )
            ENDCASE
            cNa := "t"
            cText := cFeld
            nTFont := nFFont
            nFFont := 0
            cBereich := ""
            cFeld := ""
         ELSEIF cNa = "v" .AND. cBereich = "v" .AND. Upper(cSeite)!="V"// Variable soll editiert werden
            IF cFeld = "#"       // speziell fr bl_grue
               cFeld := SubStr(cFeld,2)
            ELSE
               cF := cFeld
               xF := &(cF)      //Variableninhalt
               DO CASE
                  CASE xF == NIL
                     cFeld := "&(" + cF + ")"
                  CASE Valtype( xF ) == "C"
                     cFeld := xF
                  CASE ValType( xF ) == "N"
                     cFeld := Str( xF )
                  CASE ValType( xF ) == "D"
                     cFeld := DtoC( xF )
               ENDCASE
               cNa := "t"
               cText := cFeld
               nTFont := nFFont
               nFFont := 0
               cBereich := ""
   *************
                  cFeld := IIf( !":="$cF,"", SubStr( cF,1,At(":=",cF)-1) ) // =Name der Variablen
   *************
            ENDIF
         ELSEIF cNA = "x"        // fhrt eine Funktion wie z.B. DbSeek() aus   //":="$cFeld
            cF := cFeld
            IF !Empty(&(cF))      //Variableninhalt   (Empty(&(cF)) fhrt den Ausdruck cFeld aus)
               cFeld := SubStr(cFeld,1,At(":=",cFeld)-1)
            ENDIF
         ELSEIF cNA = "X"        // fhrt eine Funktion wie z.B. DbSeek() aus 
            cF := cFeld
            &(cF)      //Variableninhalt   &(cF) fhrt den Ausdruck cFeld aus)
         ELSEIF cNA = "!"  // 18.04.2006 belegt Variable vor dem ':=' mit String danach
            cF := SubStr(cFeld,1,At(":=",cFeld)-1)
            IF !Empty(cF) .AND. cF != "IIf"
               &cF := &(SubStr(cFeld,At(":=",cFeld)+2))  // Gleichung aufl”sen
            ELSE
            ENDIF
            cNA := "v"
            cText := cFeld    // Ausdruck konservieren fr oVorschau:Update()
         ELSEIF cNA = "M" .AND. cText = "!" // 13.07.2006 22:05 belegt Variable vor dem ':=' mit String danach
            cF := SubStr(cFeld,1,At(":=",cFeld)-1)
            IF !Empty(cF) .AND. cF != "IIf"
               &cF := &(SubStr(cFeld,At(":=",cFeld)+2))  // Gleichung aufl”sen
            ELSE
            ENDIF
            cText := cFeld    // Ausdruck konservieren fr oVorschau:Update()
         ENDIF
      AAdd( aBlattG, { cSeite, cNa, cPrompt, cText, nTFont, ;
                           cBereich, cFeld, nFFont, nZei, nSpa }) //, RecNo() )  // 8.2.2005
      SKIP
   ENDDO

      20->(DbCloseArea())                     // 8.2.2005 vor Preview gezogen
      SELECT &nOldArea                        // 8.2.2005

// nKomma ist die Anzahl der Kommas in cPicture und bestimmt die Verl„ngerung der ---/===
   nKomma := 0 //+20.02.2018 21:31
//09.05.2007 08:33 sowie die Stellenzahl, die ein Zahlenwert nach rechts verschoben werden muss:
   FOR i := 1 TO Len(cPicture)
      IIf(cPicture[i]=="," .AND. cKomma==",", ++nKomma,)
   NEXT

//+21.06.2010 20:44vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
//+ Test: Erzeugen einer html-Datei
//+ hier wird die Datei erzeugt: ( nHandle muss PRIVATE sein wegen FdrG! )
   cNrImg := "01" //+ schon mal hier erkl„rt fr Blatt_Aufbau()
   IF Upper(AppName())$"MUELLX.EXE-BLEINX.EXE"
      IF Len(cBriefKopf) > 100
         oBitmap    := XbpBitmap():new():create( PrinterPS(cDruckerName,nOrientierung) )
         oBitmap:setbuffer(cBriefKopf)
         oBitmap:savefile( cBGImg := cDatver + 'Temp'+StrX(1->auftrnr)+'00.jpg', XBPBMP_FORMAT_JPG )
      ELSE
         cBGImg := IIf(!cBriefKopf[1]$"n_","file:///"+cDatver+IIf("."$cBriefKopf,cBriefKopf,cBriefKopf+".BMP"),"")
      ENDIF
      t_File := "Temp"+StrX(1->auftrnr)+".html"
      nHandle_html := FCreate( t_File )
//08.01.2026 13:40      cHtml := '<html><head></head><body>'+CRLF
//// 08.06.2019 12:24 stattdessen: (bernommen von KSOX/best4p)
//// 25.06.2019 08:50 ... HTML muss aber noch mal neu durchdacht werden
	   cHtml := ;
         '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">'+CRLF+;
         '<HTML>'+CRLF+;
         '<HEAD>'+CRLF+;
         '	<META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1252">'+CRLF+;
         '	<TITLE>'+'Druckdatei.HTML'+'</TITLE>'+CRLF+;
         '	<META NAME="GENERATOR" CONTENT="KSOX.EXE">'+CRLF+;
         '	<META NAME="CHANGEDBY" CONTENT="' + AppName() + '">'+CRLF+;
         '	<STYLE TYPE="text/css">'+CRLF+;
         '	<!--'+CRLF+;
         '		@page { margin: ' + '0cm 0cm 0cm 0cm' + ' }'+CRLF+;
         '		P { margin-bottom: 0.21cm }'+CRLF+;
         '		P#cour { font-family: "Courier New, monospace" }'+CRLF+;
         '		PRE { font-family: ' + 'Courier New' + '; font-size: ' + '13pt' + '; }'+CRLF+;
         '	-->'+CRLF+;
         '	</STYLE>'+CRLF+;
         '</HEAD>'+CRLF+;
         '<BODY LANG="de-DE" >'	//09.02.2026 18:43 +CRLF+;
       //09.02.2026 18:43  '<PRE>'

      IF Len(cBGImg) > 1
         cHtml += '<div style="position:relative; z-index:1; margin-left:0; margin-top:0; '+ CRLF		//08.01.2026 13:42 := -> +=
         cHtml += IIf(nOrientierung==1,'width:210mm; height:297mm;">','width:297mm; height:210mm;">') + CRLF
         cHtml += '<img src='+cBGImg+' width=100% height=100%></div>'+CRLF
      ENDIF
      cHtml += '<div style="position:relative; z-index:2; width:210mm: height:297mm;">' + CRLF
 //		FSeek( nHandle_html,0, FS_SET )
 //     FWrite( nHandle_html, cHtml )
//      cHtml := ""
   ENDIF
//+ in FdrG() wird mit FWrite html-Code generiert
//+ vor dem Verlassen von BlattDrVGw wird die Datei wieder geschlossen
//+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

//////////////////////////////////////////////////////////////
   cBKpf := cBriefkopf    //+10.05.2011 20:26 zwischensichern - siehe BPreview
   
 //09.02.2026 11:38  oDlg1:hide()    //+08.02.2009 15:37
   IF cLPTSCR = "A"
      oEdit:ABVorschau( aBlattG, oDlg1, cCP, aSchrift, aParamG, nOrientierung ) //17.10.2006 18:33
      IF cLPTSCR = "AB"
         oEdit:ABVorschau:print()   //28.10.2006 19:13   Druck auf Papier
      ENDIF
      SELECT &nOldArea     // fr alle F„lle
      cKomma := cKommaOld
      (nOldArea)->(DbGoto(nRec))    //25.09.2007 17:45
      DbResumeNotifications()
//24.01.2008 22:15 erst am Ende des TD! :      cLPTSCR := "S"
   	oDlg1:show()    //+08.02.2009 15:37
      //+21.06.2010 20:44vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
      //+ Temp*.html wird geschlossen:
      IF Upper(AppName())$"MUELLX.EXE-BLEINX.EXE"
         cHtml += t_Html + '</div></body></html>'
         FWrite( nHandle_html, cHtml )
         FClose(nHandle_html)
			HTML_Brief_1("Temp"+StrX(1->auftrnr)+".html",,cSchriftname,cPt,"0cm 0cm 0cm 0cm","0.42")
      ENDIF
      //+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      RETURN NIL
   ELSEIF cLPTSCR = "T"    // fr die Vorschau beim Trauerdruck
      oEdit:TDVorschau( aBlattG, oDlg1, cCP, aSchrift, aParamG, nOrientierung ) //17.10.2006 18:33
      IF cLPTSCR = "TD"
         oEdit:TDVorschau:print()   //28.10.2006 19:13   Druck auf Papier
      ENDIF
      SELECT &nOldArea     // fr alle F„lle
      cKomma := cKommaOld
      (nOldArea)->(DbGoto(nRec))    //25.09.2007 17:45
      DbResumeNotifications()
//24.01.2008 22:15 erst am Ende des TD! :      cLPTSCR := "S"
      oDlg1:show()    //+08.02.2009 15:37
      cLPTSCR := "T"                //+17.07.2010 14:33
      oEdit:TDVorschau:drawPage()
      //+21.06.2010 20:44vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
      //+ Temp*.html wird geschlossen:
      IF Upper(AppName())$"MUELLX.EXE-BLEINX.EXE"
         //cHtml += '</div></body></html>'
         //FWrite( nHandle_html, cHtml )
         //FClose(nHandle_html)
      ENDIF
      //+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      RETURN NIL
   ELSE
      BPreview( aBlattG, oDlg1, cCP, aSchrift, aParamG, nOrientierung ) // 3.5.2004
		//+21.06.2010 20:44vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
		//+ Temp*.html wird geschlossen:
	   IF Upper(AppName())$"MUELLX.EXE-BLEINX.EXE" .AND. Upper(cMwStJN) = "Y"
	      cHtml += ConvToAnsiCP(t_Html) + '</div></body></html>'
	      FWrite( nHandle_html, cHtml )
	      FClose(nHandle_html)
	      sleep(200)
	      Tone(600)
	      cFileHtml := "Temp"+StrX(1->auftrnr)+".html"
	   // 	RunShell ( '&cFileHtml',"c:\Program Files\LibreOffice\program\swriter.exe",.T.)	//01.09.2023 .T.

			IF AppKeyState(65553)=1						//Ctrl-Taste bei Ende+Druck
				cCommand := ' &cFilehtml macro:///Standard.Module1.xRechPDF '
				RunShell (' &cFilehtml macro:///Standard.Module1.xRechPDF ', 'C:\Program Files\LibreOffice\program\swriter.exe',.T.)
			ENDIF

/*			cBuero := "Essen"		//08.01.2026 13:58
			cPt := LTrim(Str(Val(aSchrift[1])))+"pt"
			cSchriftname := SubStr(aSchrift[1],At(".",aSchrift[1])+1)
			HTML_Brief_1("Temp"+StrX(1->auftrnr)+".html",,cSchriftname,cPt,"0cm 0cm 0cm 0cm","0.42")*/
	   ENDIF
		//+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   ENDIF
//++///////////////////////////////////////////////////////////////////////


  ENDDO        //+01.05.2009 18:46 lReset-Schleife
//++///////////////////////////////////////////////////////////////////////
   cZoom := c  // 04.04.2006
   IF Empty( aBlattG )                                    //
      SELECT &nOldArea                                      // fr alle F„lle
      cKomma := cKommaOld
      (nOldArea)->(DbGoto(nRec))    //25.09.2007 17:45
      (nOldArea)->(DbResumeNotifications())                 //
      cLPTSCR := "S"                                        //
   oDlg1:show()    //+08.02.2009 15:37
      RETURN NIL                                            //
   ENDIF                                                    //
   IF Upper(AppName())$"HANELX.EXE-RAGUSEX.EXE-SONNEX.EXE-BUCKX.EXE-FLUESX.EXE-BERGX.EXE-KOMPAKTX.EXE-MUELLX.EXE-BLEINX.EXE-NOLTEX.EXE-KLUCKX.EXE-VELLX.EXE-GUDDX.EXE-RUDOX.EXE-VOGELX8.EXE-BARTX.EXE-SONNEX.EXE"+cAc
      nGS := 0
   ELSE
      nGS := BlattDruck( aBlattG, oDlg1, cCP, aSchrift, nOrientierung ) // 3.5.2004
   ENDIF
//////////////////////////////////////////////////////////////
	//das scheint nur zum Testen zu sein: (09.02.2026 11:19)
   IF Upper(AppName())$"MUELLX.EXE-BLEINX.EXE"
		IF AppKeyState(65554)==1	// zusammen mit ALT-Taste
			cBuero := "Essen"		//08.01.2026 13:58
			cPt := LTrim(Str(Val(aSchrift[1])))+"pt"
			cSchriftname := SubStr(aSchrift[1],At(".",aSchrift[1])+1)
			cFSize := "0000011122233444555666777"[Val(cPt)]
			cHtml += t_Html
	      FWrite( nHandle_html, cHtml )
	      FClose(nHandle_html)

			HTML_Brief_1("Temp"+StrX(1->auftrnr)+".html",,cSchriftname,cPt,"0cm 0cm 0cm 0cm","0.42")
		ENDIF
	ENDIF

SELECT &nOldArea     // fr alle F„lle
cKomma := cKommaOld
(nOldArea)->(DbGoto(nRec))    //25.09.2007 17:45
DbResumeNotifications()
cLPTSCR := "S"
   oDlg1:show()    //+08.02.2009 15:37
RETURN nGS

FUNCTION ISumme()
   nISum := 0
   FOR i := 11 TO 30             // Summe der Dummy-Variablen fr Berechnungen in Formularen
      nISum := nISum + Val( &("i"+Str(i,2,0)) )
   NEXT
RETURN Str( nISum,8,2 )
FUNCTION cISumme()
   nISum := 0
   FOR i := 11 TO 30             // Summe der Dummy-Variablen fr Berechnungen in Formularen
      nISum := nISum + Val( &("ci"+Str(i,2,0)) )
   NEXT
RETURN Str( nISum,8,2 )

// 20.09.2006 17:47  um im Formular die Spalte/Zeile abzufragen, bzw. zu setzen
FUNCTION Spalte(s)    
   IF !Empty(s) .AND. s < 100 .AND. s >= 0
      aPoSZ[1] := s
   ENDIF
RETURN aPoSZ[1]
FUNCTION Zeile(z)
   IF !Empty(z) .AND. z < 100 .AND. z >= 0
      aPoSZ[2] := z
   ENDIF
RETURN aPoSZ[2]
/*
GraQueryTextBox() may return invalid metrics w/ segments
Description:

The GraQueryTextBox()-function returns incorrect text metrics when
used on a PS whose segment drawing mode is "GRA_DM_RETAIN".

This behaviour is by design. In "GRA_DM_RETAIN" mode, calls to graphics
primitives are stored in the segment. Normally, the Presentation Space's
properties remain unchanged (ie. the actual primitive is not executed)
until the segment is rendered using GraSegDraw(). Therefore, the current
font to use with GraQueryTextBox() is undefined and/or does not
correspond to the font set within the segment.

The Presentation Space's sets its error code (obtainable via
XbpPresSpace:lastError()) to "GRA_ERR_PS_CONTEXT" in such situations.


Solution:

Either (temporarily reset the segment drawing mode to either
"GRA_DM_DRAW" or "GRA_DM_DRAWANDRETAIN", or use a another PS
to compute the text metrics.
*/
FUNCTION Vorschau_Ausgabe( oPrinterPS, aSegments, aBlatt, cCP, aSchrift, nOrientierung, cVonWo )	//06.12.2022 18:53 von wo aufgerufen
   LOCAL dummy2 := GraSegDrawMode( oPrinterPS, GRA_DM_RETAIN )
   LOCAL nSegment := GraSegOpen( oPrinterPS, GRA_SEG_MODIFIABLE ) //+13.11.2012 17:14 , GRA_SEG_MODIFIABLE
   LOCAL aPrinterPS := { oPrinterPS, PrinterPS(cDruckerName,nOrientierung) } //;
   LOCAL aPaper := aPrinterPS[2]:DEVICE():paperSize() //, aPoSZ := {0,0}   20.09.2006 17:43
   LOCAL aFont := { XbpFont():new(aPrinterPS[1]), XbpFont():new(aPrinterPS[2]) }
   LOCAL i := 0, j := 0
   PRIVATE aVZ := {}       //03.07.2007 22:01 in V3 bernimmt die aktuellen Zahlungen fr nt
   
//   IF cVonWo == "::create"
//   	RETURN aSegments
//   ENDIF
   
   aPoSZ[1] := 0 ; aPoSZ[2] := 0 // 20.09.2006 17:43  aPoSZ ist Public
   aFont[1]:CREATE("12.COURIER NEW")
   aFont[2]:CREATE("12.COURIER NEW")
   ASize( aSegments, 0 )
//   fr BitMap-Druck siehe XbpPreview:printpage()
   nAnz := IIf( !Empty(cAnz), Val( cAnz ), nAnzahl )
         ThreadObject():setPriority(PRIORITY_TIME_CRITICAL)    //+15.12.2008 16:07
// 29.02.2008 08:37  DO WHILE --nAnz >= 0
   Blatt_Aufbau( aPrinterPS, aFont, aPaper, aPoSZ, aSchrift, aBlatt, cCP, aSegments, @nSegment )
   GraSegClose( aPrinterPS[1] )
   AAdd( aSegments, nSegment )
// aSeitZ[1]=len(aSegments) / aSeitZ[2]=aPoSZ / aSeitZ[3]=TEXT / aSeitZ[4]=FONT :
   IF !Empty( aSeitZ )     // GesamtSeitenZahl - Seitenzahlen bei Statistik-Drucken
      FOR i := 1 TO j := aSeitZ[1]  // aSeitZ[1] = Anzahl Segmente
         GraSegOpen( aPrinterPS[1], GRA_SEG_MODIFIABLE, aSegments[i] )
         FdrG( aPrinterPS, aFont, aPaper, AClone(aSeitZ[2]), ;
                        Trim( aSeitZ[3] ), aSeitZ[4], aSchrift )
         GraSegClose( aPrinterPS[1] )
      NEXT
   ENDIF
// 29.02.2008 08:38  ENDDO
   GraSegDrawMode( oPrinterPS, GRA_DM_DRAWANDRETAIN )
         ThreadObject():setPriority(PRIORITY_NORMAL)    //+15.12.2008 16:07
RETURN aSegments

// aktiv, wenn in der Vorschau "ENDE+Druck" angew„hlt wird:
FUNCTION BlattDruck( aBlatt, oDlg1, cCP, aSchrift, nOrientierung )   // 3.5.2004
   LOCAL oBitMap, aBitSize, aBitRect, nRec, i
   LOCAL aPrinterPS := { PrinterPS(cDruckerName, nOrientierung), PrinterPS(cDruckerName,nOrientierung) } //;
   LOCAL aPaper := aPrinterPS[2]:DEVICE():paperSize() // , aPoSZ := {0,0}  20.09.2006 17:42
   LOCAL aFont := { XbpFont():new(aPrinterPS[1]), XbpFont():new(aPrinterPS[2]) }
   PRIVATE xR  // damit nur beim "Ende+Druck" ggf. eine neue Rechnungsnr vergeben wird
   PRIVATE xD, xM  // damit nur beim "Ende+Druck" ggf. das Rg-Datum gespeichert wird (ttmm)
   aPoSZ[1] := 0 ; aPoSZ[2] := 0 // 20.09.2006 17:43 aPoSZ ist Public!
   nAnz := IIf( !Empty(cAnz), Val( cAnz ), nAnzahl )
   aFont[1]:CREATE("12.COURIER NEW")
   aFont[2]:CREATE("12.COURIER NEW")
   cBriefKopf := IIf( Len( cBriefKopf ) > 100, cBriefKopf, Trim(cBriefKopf) ) // vorsichtshalber wg Grafik
      IF Len(cBriefKopf)>100 .OR. (cBriefKopf != "n" .AND. cBriefKopf != "_") //22.07.2006 17:34
         IF Len(cBriefkopf)>100 .AND. Len("oEdit:TxBd11")>100 // 23.07.2006 18:03
            cBriefkopf := oEdit:TxBd11    // ist reserviert fr Briefpapier
         ELSE
            cBriefkopf := IIf( cBriefkopf="&",&(SubStr(cBriefkopf,2)),cBriefkopf)
            cBriefkopf := IIf("."$cBriefkopf,Trim(cBriefkopf),Trim(cBriefkopf)+".BMP")
         ENDIF
         oBitmap    := XbpBitmap():new():create( aPrinterPS[1] )
         aBitSize      := aPrinterPS[1]:device():paperSize()
         aBitRect      := { 0, 0, aBitSize[5]-aBitSize[3], aBitSize[6]-aBitSize[4] }
         IF Len(cBriefKopf)>100      //22.07.2006 11:47 >50 heiát:in cGrafik ist die Grafik
            oBitmap:setbuffer( cBriefKopf )          // Bitmap laden
         ELSEIF (cDatver[1]+":")$cBriefKopf          //+19.11.2008 09:45
            oBitmap:loadFile( cBriefKopf )          // Bitmap laden   18.11.2008 14:56
         ELSE                    //22.07.2006 11:47 <50 heiát:in cGrafik ist der GrafikdateiName
            oBitmap:loadFile( cDatver+cBriefKopf )          // Bitmap laden 18.11.2008 14:55
         ENDIF
      ENDIF
      aPrinterPS[1]:device():startdoc()
   DO WHILE --nAnz >= 0
      IF nPB1 != nPB2   //22.12.2006 13:21 Papiereinzug umschalten (StappX)
         IIf( nAnz > 0, aPrinterPS[1]:device():setPaperBin(nPB2), aPrinterPS[1]:device():setPaperBin(nPB1) )
      ENDIF
      IF Len(cBriefKopf)>100 .OR. (cBriefKopf != "n" .AND. cLPTSCR != "B")  //22.07.2006 17:37
         oBitmap:draw( aPrinterPS[1], aBitRect,,, GRA_BLT_BBO_IGNORE )  //21.10.2007 18:26
      ENDIF
      IF "TEST"$Upper(AppName()) .OR. IsMemVar("xDemo")  // Eindruck des Schriftzugs "DEMO"
         IF Empty(oBitmap)
            oBitmap    := XbpBitmap():new():create( aPrinterPS[1] )
            aBitSize      := aPrinterPS[1]:device():paperSize()
            aBitRect      := { 0, 0, aBitSize[5]-aBitSize[3], aBitSize[6]-aBitSize[4] }
         ENDIF
         IF FExists( cDatver+"MUSTER.DLL" )
            oBitmap:load( "MUSTER.DLL", 1020 )     // aus der RES-Datei 10.09.2006 13:50
         ELSE
            oBitmap:load( , 1020 )     // aus der RES-Datei
         ENDIF
         oBitmap:draw( aPrinterPS[1], aBitRect,,, GRA_BLT_BBO_IGNORE )  //21.10.2007 18:27
      ENDIF
      IF nAnz=0 .AND. IsMemVar("xKopie")     // Eindruck des Schriftzugs "KOPIE"
         IF Empty(oBitmap)
            oBitmap    := XbpBitmap():new():create( aPrinterPS[1] )
            aBitSize      := aPrinterPS[1]:device():paperSize()
            aBitRect      := { 800, 800, 200, 100 }
         ENDIF
         IF FExists( cDatver+"MUSTER.DLL" )
            oBitmap:load( "MUSTER.DLL", 1035 )     // aus der RES-Datei 10.09.2006 13:50
         ELSE
            oBitmap:load( , 1035 )     // aus der RES-Datei
         ENDIF
         oBitmap:draw( aPrinterPS[1], aBitRect,,, GRA_BLT_BBO_IGNORE )  //21.10.2007 18:27
      ENDIF
      Blatt_Aufbau( aPrinterPS, aFont, aPaper, aPoSZ, aSchrift, aBlatt, cCP )
// aSeitZ[1]=len(aSegments) / aSeitZ[2]=aPoSZ / aSeitZ[3]=TEXT / aSeitZ[4]=FONT :
      IF !Empty( aSeitZ )     // GesamtSeitenZahl - Seitenzahlen bei Statistik-Drucken
         FdrG( aPrinterPS, aFont, aPaper, AClone(aSeitZ[2]), ;
                        Trim( aSeitZ[3] ), aSeitZ[4], aSchrift )
      ENDIF
      IF nAnz > 0
         aPrinterPS[1]:device():newPage()
      ENDIF
   ENDDO
      aPrinterPS[1]:device():endDoc()
      DestroyDevice( aPrinterPS[1] )
      DestroyDevice( aPrinterPS[2] )
      IF Len(cBriefKopf)>100 .OR. (cBriefKopf != "n" .AND. cBriefKopf != "_")    // 12.6.2005
         oBitmap:destroy()
      ENDIF
RETURN nGS

//////verzogen nach DbDruSys.prg: (wie alle anderen grunds„tzlichen Druckfunktionen)
//////FUNCTION PrinterPS( cPrinterObjectName, nOrientierung )

//////verzogen nach DbDruSys.prg: (wie alle anderen grunds„tzlichen Druckfunktionen)
//////PROCEDURE DestroyDevice( oPS )

//////verzogen nach DbDruSys.prg: (wie alle anderen grunds„tzlichen Druckfunktionen)
//////FUNCTION FdrG( aPrinterPS, aFont, aPaper, aPoSZ, cText, nFont, aSettings, cAusR )

//+23.01.2011 11:51 aPoSZ_Local
FUNCTION RepDruck1G( aRep, cNa, cArea, cCP, nt, cRAV, aPrinterPS, aFont, aPaper, aPoSZ_Local, ;
                           aSchrift, aBlatt, aSegments, nSegment, cS, loBMP, cFileName )
   LOCAL nOldArea := Select(), nRec, nZeiold, nSpaold
   LOCAL cSeite, cPrompt, cText, nTFont, cBereich, cFeld, nFFont, cF, cAusR   // 7.7.2005 Ausrichtung
   LOCAL nZwiFont := 1 //+09.01.2010 15:36
   LOCAL aAttr := ARRAY( GRA_AA_COUNT )	//+23.06.2019 19:11
   PRIVATE nSumme := 0  // wird gebraucht fr VellX-Zwischensumme // 14.1.2005
   PRIVATE nTeilSum := 0 // wird gebraucht fr VellX-Zwischensummen   // 13.1.2005
   PRIVATE cB, cFd, k   // wegen Makros      K:04.07.2007 10:05
   PRIVATE aZS := {} // wird gebraucht fr VellX-Zwischensummen   // 14.1.2005
   PRIVATE nZeile := -1
   aS := { 0, 0, 0, 0, 0 }   // PRIVATE aus der vorigen Ebene
   lFremd := .F.        // PRIVATE der vorigen Ebene
   nMSum := 0
         IF Upper(AppName()) == "AX.EXE"     // 25.9.2004
            rn := Str(nt,1,0)
         ENDIF
   cAuf := StrX( (1->auftrnr),E,0 )
   SELECT &cArea
   nRec := RecNo()      //******
   IF Val( cArea ) < 10
      FIND &cAuf         // wenn Index
   ELSE
      GO TOP             // wenn kein Index (bei TEMP-Dateien:Vers/Rng/Aufst)
   ENDIF

   DO WHILE auftrnr = Val(cAuf) .AND. .NOT. Eof()
      IF Upper( cRAV ) == "R" // steht in cSeite (nicht in cNt!)
         lFremd := IIf( kennz = "2" .OR. kennz = "3" .AND. nt=Val(rn), .T., lFremd ) // beim 1.Durchlauf setzen!
         lEigen := IIf( kennz = "1" .AND. nt=Val(rn), .T., lEigen ) // beim 1.Durchlauf setzen!
// 22.6.2004: wenn nt<0 (z.B. cNt in bl_ ="-1"), dann nehme alle Rg.- und NRg.-Werte
         IF cNA <> kennz .OR. ( nt <> Val( rn ) .AND. nt >= 0 )
            SKIP
            LOOP
         ENDIF
         nMSum := nMSum + IIf( mwst_schl="3", ;
                                 &b_g/(100+zschl_voll)*zschl_voll, 0 )
      ENDIF
      IF Upper( cRAV ) == "A"
         IF Upper( rn ) == "A"
            SKIP
            LOOP
         ENDIF
      ENDIF
      IF cDrucker = "HP"
      ELSE
         SetPrc( PRow()+1, 0 )
      ENDIF
      FOR k := 1 to Len( aRep )
         aBlattZ := aRep[k]
         cSeite := aBlattZ[1]
         cNa := aBlattZ[2]
         cPrompt := aBlattZ[3]
         cAusR := IIf(!Empty(cPrompt).AND.cPrompt[1]$">^:",cPrompt[1], ;
                  IIf(IsMemVar("cAR").AND.!Empty(cAR).AND.cAR[1]$"><^:",cAR[1], ;
                  "<")) // 16.09.2006 13:43 Ausrichtung: wenn in cPrompt oder in cAR, sonst: links
         cText := aBlattZ[4]
         nTFont := aBlattZ[5]
         cBereich := aBlattZ[6]
         cFeld := aBlattZ[7]
         nFFont := aBlattZ[8]
         cB := cBereich ; cFd := cFeld
         Satzsp(oCB)                //+17.11.2008 18:53 wg. KremerX
         IF cBereich = "v"
            cF := &cFd
         ELSE
            cF := ((&cB)->(&cFd))
         ENDIF
         DbRUnlock()                //+17.11.2008 18:53 wg. KremerX
// wenn cF leer ist -> keine Bewegung von Zeile/Spalte:
         IF Len(aRep)>1
            aPoSZ[2] := IIf( !Empty( cF ) .OR. (Empty(nFFont) .AND. Empty(nTFont)), ;
                        IIf( aBlattZ[9]<0.1, aPoSZ[2]-aBlattZ[9], aBlattZ[9] ), ;
                        aPoSZ[2] )
            aPoSZ[1] := IIf( !Empty( cF ) .OR. (Empty(nFFont) .AND. Empty(nTFont)), ;
                        IIf( aBlattZ[10]<0.1, aPoSZ[1]-aBlattZ[10], aBlattZ[10] ), ;
                        aPoSZ[1]+1 )
            nSpalte := aBlattZ[10]     //15.04.2007 07:42
         ENDIF
         IF aPoSZ[2] > Val( cZeimax ) .AND. nSumme<>0    // 24.10.2005              // Test fr Hanel!!!!!!!!!!!!!!!!!!!!!!
            nZeiOld := aPoSZ[2]
            nSpaOld := aPoSZ[1]
            aPoSZ[2] := aPoSZ[2] + 2
            aPoSZ[1] := IIf(Empty(cZwiSpalte),50,Val(cZwiSpalte)-16)  // 29.1.04
            //+ nZwiFont ersetzt 1 in diesem IF-ENDIF-Block:   09.01.2010 15:36
            nZwiFont := IIf( nTFont==8 .OR. nFFont==8, 8, 1 )  //+09.01.2010 15:35
            FdrG( aPrinterPS, aFont, aPaper, aPoSZ, ;
                  "Zwischensumme", nZwiFont, aSchrift ) // Betragspalte - 16 30.04.2007 11:47
            aPoSZ[1] := IIf(Empty(cZwiSpalte),50,Val(cZwiSpalte))  // 29.1.04
            FdrG( aPrinterPS, aFont, aPaper, aPoSZ, ;
                  StrP( nSumme,8,2 ), nZwiFont, aSchrift ) // Betragspalte 30.04.2007 11:47

//03.06.2019 17:40            Kopf2( aPrinterPS, aFont, aPaper, aPoSZ, aSchrift, aBlatt, aSegments, @nSegment ) /////////////////////
            Kopf2( aPrinterPS, aFont, aPaper, aPoSZ, aSchrift, aBlatt, aSegments, @nSegment, , loBMP, cFileName ) //03.06.2019 17:41///////////////////

            aPoSZ[2] := aPoSZ[2] + 2
            aPoSZ[1] := IIf(Empty(cZwiSpalte),50,Val(cZwiSpalte)-16)  // 29.1.04
            FdrG( aPrinterPS, aFont, aPaper, aPoSZ, ;
                  "šbertrag", nZwiFont, aSchrift ) // Betragspalte - 16 30.04.2007 11:47
            aPoSZ[1] := IIf(Empty(cZwiSpalte),50,Val(cZwiSpalte))  // 29.1.04
            FdrG( aPrinterPS, aFont, aPaper, aPoSZ, ;
                  StrP( nSumme,8,2 ), nZwiFont, aSchrift ) // Betragspalte 30.04.2007 11:47
            aPoSZ[2] := aPoSZ[2] + 2
            aPoSZ[1] := nSpaOld
         ENDIF
         DO CASE
            CASE Valtype( cF ) == "C"
               IIf( nFFont>0, FdrG( aPrinterPS, aFont, aPaper, aPoSZ, ;
                                    Trim( cF ), nFFont, aSchrift, cAusR ), )
            CASE Valtype( cF ) == "N"
               IF cF <> 0 .AND. ( Upper( cRAV ) = "R" .OR. Upper( cRAV ) = "V" )
                  IF Upper( AppName() ) $ "DOENNEX.EXE" .or. cKomma = ","
                     IIf( nFFont>0, FdrG( aPrinterPS, aFont, aPaper, aPoSZ, ;
                                          Trim( Transform( cF, cPicture ) ), nFFont, aSchrift, cAusR ), )
                  ELSE
                     IIf( nFFont>0, FdrG( aPrinterPS, aFont, aPaper, aPoSZ, ;
                                          Trim( Str( cF,8,2 ) ), nFFont, aSchrift, cAusR ), )
                  ENDIF
               ENDIF
///////////////////////////////////////////////////////////////////////////////////////
// Wenn in der Rechnung eine Trennung in 19/7% MwSt gefordert wird:
// nSumme entsteht aus allen numerischen cFs, soll aber nur aus dem einen Preis entstehen,
// daher drfen die "aS[]"-enthaltenden Felder nicht mitaddiert werden:
               nSumme := nSumme + IIf("aS["$cFeld.OR."aEZ["$cFeld.OR."aFZ["$cFeld,0,cF)  //*****************************
// diese 5 Zeilen sind in den EL-Teil der Rechnung einzufgen (als "r 1"-Zeilen, siehe Dischleid):
//               aS[1] := aS[1] + IIf( 13->mwst_schl="3", Round(cF/(1+zschl_voll/100),2), 0 )
//               aS[2] := aS[2] + IIf( 13->mwst_schl="3", cF-Round(cF/(1+zschl_voll/100),2), 0 )
//               aS[3] := aS[3] + IIf( 13->mwst_schl="2", Round(cF/(1+zschl_halb/100),2), 0 )
//               aS[4] := aS[4] + IIf( 13->mwst_schl="2", cF-Round(cF/(1+zschl_halb/100),2), 0 )
//               aS[5] := nSumme
// aS[1]: Netto zu 16%, aS[2]: MwSt-Betrag zu 16%, aS[3]: Netto zu 7%, aS[4]: MwSt-Betrag zu 7% 
////////////////////////////////////////////////////////////////////////////////////////
            CASE Valtype( cF ) == "D"
               IIf( nFFont>0, FdrG( aPrinterPS, aFont, aPaper, aPoSZ, ;
                                    DtoC( cF ), nFFont, aSchrift, cAusR ), )
         ENDCASE
      NEXT
      SKIP
   ENDDO

   aS[1] := Round(aS[1],2)
   aS[2] := Round(aS[2],2)
   aS[3] := Round(aS[3],2)
   aS[4] := Round(aS[4],2)
   GO nRec     //********
   SELECT &nOldArea
RETURN nSumme

FUNCTION ZwiSu_EL( ckennz )   // 14.1.2005 nur fr VellX.exe!
   LOCAL nGesSum := nSumme // Private der vorigen Ebene, darf nicht beeinflusst werden
   LOCAL nZwiSum := 0    // auszugebende Zwischensumme = nGesSum-nTeilsum(vorher)
//    in bl_r muá das Feld noch "aS[" als Dummy enthalten, damit nTeilSum nicht zu nSumme addiert wird
//////   LOCAL ckennz:=aZS[1], nGesSum:=aZS[2], aPrinterPS:=aZS[4], aFont:=aZS[5], ;
//////            aPaper:=aZS[6], aPoSZ:=aZS[7], nFFont:=aZS[8], aSchrift:=aZS[9]
//////   nTeilSum:=aZS[3]
//   ckennz ist 13->kennzart der bisherigen Art
//   nGesSum ist das bisher aufgelaufene nS1, also nSumme
//   nTeilSum ist die bis zur letzten Zwischensumme aufgelaufene nS1, Private vorige Ebene
//
//     Start mit ckennz = "0", nGesSum = 0 und nTeilSum = 0
//   Artikel1           100,--      // hier wird ckennz = 13->kennzart gesetzt, nGesSum wird = 100
//   Artikel2           150,--      // ckennz bleibt, nGesSum wird = 250
//   Artikel3            50,--      // ckennz bleibt, nGesSum wird = 300
//     z.B.: nach dem Druck von Artikel3 „ndert sich 13->kennzart
//     dann wird die Zwischensumme ausgegeben als nGesSum-nTeilSum, wenn != 0
//                               300,--   // nTeilSum wird = nGesSum
//   Artikel4            60,--      // hier wird ckennz = 13->kennzart gesetzt, nGesSum wird = 360
//   Artikel5           140,--      // ckennz bleibt, nGesSum wird = 500
//     nach dem Druck von Artikel5 „ndert sich wieder 13->kennzart, oder die EL/FL-Gruppe ist zu Ende
//     => Zwischensumme
   IF nGesSum != nTeilSum .AND. nGesSum != 0
      13->(DbSkip())
      IF 13->kennzart != ckennz .OR. 13->(Eof())
         13->(DbSkip(-1))
         nZwiSum := nGesSum - nTeilSum
         nTeilSum := nGesSum  // da nTeilsum PRIVATE ist, „ndert es sich auch in der vorigen Ebene!
      ELSE
         13->(DbSkip(-1))
      ENDIF
   ENDIF
RETURN IIf(nGesSum==nTeilSum, nZwiSum, 0 )

//+23.01.2011 11:51  aPoSZ_Local
//03.06.2019 17:42PROCEDURE Kopf2( aPrinterPS, aFont, aPaper, aPoSZ_Local, aSchrift, aBlatt, aSegments, nSegment, cS )
PROCEDURE Kopf2( aPrinterPS, aFont, aPaper, aPoSZ_Local, aSchrift, aBlatt, aSegments, nSegment, cS, loBMP, cFileName )	//03.06.2019 17:42
   LOCAL cFK, nFFont, nTFont, cText, cFeld, cBereich, ccFeld, i
   LOCAL aBlattZ, cSeite, cNa, cPrompt, cAusR   // 7.7.2005 Ausrichtung
   LOCAL aBitSize, aBitRect, aSourceRect, cGrafik
   LOCAL aAttr := ARRAY( GRA_AA_COUNT )	//+04.06.2019 10:31
   cS := IIf(Empty(cS),"2",cS)   // 17.10.2005 cS="F" fr Firmenbriefkopf
   aPoSZ[2] := 0
      FOR i := 1 to Len( aBlatt )
         aBlattZ := aBlatt[i]
         cSeite := aBlattZ[1]
         IF cSeite != cS      // 17.10.2005	cSeite="F" im gesamten Firmenbriefkopf
            LOOP
         ENDIF
         cNa := aBlattZ[2]
         cPrompt := aBlattZ[3]
// 
         cAusR := IIf(!Empty(cPrompt).AND.cPrompt[1]$">^:",cPrompt[1], ;
                  IIf(IsMemVar("cAR").AND.!Empty(cAR).AND.cAR[1]$"><^:",cAR[1], ;
                  "<")) // 16.09.2006 13:43 Ausrichtung: wenn in cPrompt oder in cAR, sonst: links
         cText := aBlattZ[4]
         nTFont := IIf( !Empty(nStandardFont) .AND. aBlattZ[5] != 0, ;
                              aBlattZ[5] := nStandardFont, aBlattZ[5] )
         cBereich := aBlattZ[6]
         cFeld := aBlattZ[7]
         nFFont := IIf( !Empty(nStandardFont) .AND. aBlattZ[8] != 0, ;
                              aBlattZ[8] := nStandardFont, aBlattZ[8] )
            aPoSZ[2] := IIf( aBlattZ[9]<0.1, aPoSZ[2]-aBlattZ[9], aBlattZ[9] )
            aPoSZ[1] := IIf( aBlattZ[10]<0.1, aPoSZ[1]-aBlattZ[10], aBlattZ[10] )
            nSpalte := aBlattZ[10]     //15.04.2007 07:43
            IF Upper( cNa ) = "Z"
               IF !Empty(nSegment)
//							//+02.06.2019 21:17 * * * T E S T * * *  fr Seite speichern
							//+28.06.2020 12:05 damit bei Trauerdruck nicht gemailt wird: "BL_BRF0-BL_BRF1-BL_BRF2-BL_FOTO"
							IF !Upper(cDru)$"BL_TERM-BL_BRF0-BL_BRF1-BL_BRF2-BL_FOTO-BL_KAS-BL_KAST-BL_KASK-BL_KATX" .AND. Upper(AppName())$"NOLTEX.EXE-MUELLX.EXE-BLEINX.EXE-KLUCKX.EXE-SONNEX.EXE-VELLX.EXE"
							   IF ValType(cFilename)=="C"
							 		cFilenameX := Stuff(cFilename,At(".",cFilename),1,LTrim(Str(nsegment))+"K.")
									FErase(cDatver+cFilenameX)
									loBmp:SaveFile( cDatver+cFilenameX , XBPBMP_FORMAT_JPG, XBPBMP_DEF_COMPRESSION)
									AAdd(aFileName, cFilenameX)
							   ENDIF
							ENDIF
//							//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
						GraSegClose( aPrinterPS[1] )
                  AAdd( aSegments, nSegment )
                  nSegment := GraSegOpen( aPrinterPS[1], GRA_SEG_MODIFIABLE )
//							//+23.06.2019 19:05 		//+28.06.2020 12:05 damit bei Trauerdruck nicht gemailt wird: "BL_BRF0-BL_BRF1-BL_BRF2-BL_FOTO"
							//+28.06.2020 12:05 damit bei Trauerdruck nicht gemailt wird: "BL_BRF0-BL_BRF1-BL_BRF2-BL_FOTO"
							IF !Upper(cDru)$"BL_TERM-BL_BRF0-BL_BRF1-BL_BRF2-BL_FOTO-BL_KAS-BL_KAST-BL_KASK-BL_KATX" .AND. Upper(AppName())$"NOLTEX.EXE-MUELLX.EXE-BLEINX.EXE-KLUCKX-EXE" .AND. ValType(cFilename) == "C"
////								loBmp := XbpBitmap():New():Create(aPrinterPS[1])
////			               loBMP:PresSpace(aPrinterPS[1])    // Bind the presentation space to the BMP
////								loBmp:Make( aPaper[1], aPaper[2],,24 )  // Set the size that you want it to be.
         aAttr[GRA_AA_COLOR] := GRA_CLR_WHITE
         aAttr[GRA_AA_BACKCOLOR] := GRA_CLR_BLACK
         GraSetAttrArea( aPrinterPS[1], aAttr )
         GraBox( aPrinterPS[1], {0,0}, {aPaper[1],aPaper[2]}, GRA_OUTLINEFILL )
	                  ENDIF
               ELSE
                  IF !Empty( aSeitZ )     // GesamtSeitenZahl - Seitenzahlen bei Statistik-Drucken
                     FdrG( aPrinterPS, aFont, aPaper, AClone(aSeitZ[2]), ;
                                    Trim( aSeitZ[3] ), aSeitZ[4], aSchrift, cAusR )
                  ENDIF
                  aPrinterPS[1]:device():newPage()    // [1]!
               ENDIF

					//+07.06.2019 22:03 neue Seite:
					IF Upper(AppName())$"MUELLX.EXE-BLEINX.EXE"
			         cHtml += '</div><p style="margin: 0cm; page-break-before:always;">Seitentrennung-Kopf2</p>' + CRLF
			         cHtml += '<div style="position:absolute; z-index:2; width:210mm: height:297mm;">' + CRLF
				      //FWrite( nHandle_html, cHtml )
				   ENDIF

               ++nSeitNr
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>  hier wird der Briefkopf eingefgt  17.10.2005
//03.06.2019 17:42            Kopf2( aPrinterPS, aFont, aPaper, aPoSZ, aSchrift, aBlatt, aSegments, @nSegment, "F" ) /////////////////////
            Kopf2( aPrinterPS, aFont, aPaper, aPoSZ, aSchrift, aBlatt, aSegments, @nSegment, "F", loBMP, cFileName ) //03.06.2019 17:42///////////////////
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>
               LOOP
            ENDIF
            IF Upper( cNa ) = "G"   // 17.10.2005 Grafik im Briefkopf
               IF ":"$cText   //22.07.2006 11:45 in cText steht Membervariable
                  cGrafik := IIf( cText="&",&(SubStr(cText,2)),&cText)
               ELSE
                  cText := IIf( cText="&",&(SubStr(cText,2)),cText)   // 17.09.2005
                  cGrafik := IIf("."$cText,Trim(cText),Trim(cText)+".BMP")
               ENDIF
               oBitmap    := XbpBitmap():new():create( aPrinterPS[1] )
               aBitSize      := &cFeld
            // 19.02.2008 21:18 Lagekorrektur, damit Grafik so liegt wie Text („hnlich TDruck)
//Arrayelemente von :paperSize()       Element:    Bedeutung:
//   LOCAL nXSize := aPaper[1]        //  1        Papierbreite  in 1/10 mm (= nXsize)
//   LOCAL nYSize := aPaper[2]        //  2        Papierh”he    in 1/10 mm (= nYsize)
//   LOCAL nLeftMargin := aPaper[3]   //  3        Linker Rand   in 1/10 mm (= nLeftMargin)
//   LOCAL nBottomMargin := aPaper[4] //  4        Unterer Rand  in 1/10 mm (= nBottomMargin)
//   LOCAL nRightMargin := aPaper[5]  //  5        Rechter Rand  in 1/10 mm (= nRightMargin)
//   LOCAL nTopMargin := aPaper[6]    //  6        Oberer Rand   in 1/10 mm (= nTopMargin)
//Die Werte fr die nicht bedruckbaren R„nder beziehen sich auf die linke,
//untere Ecke des Papiers. Fr das Papierformat A4 (2100, 2970) k”nnten die
//R„nder also folgende Koordinaten haben: 50, 50, 2050, 2920. In diesem
//Fall w„re der nicht bedruckbare Rand auf dem Papier ringsherum 5 mm breit.
               IF nTFont+nFFont==18
                  aBlattZ[10] := aBlattZ[10] + aPaper[3]
                  aBlattZ[9] := aBlattZ[9] + aPaper[2] - aPaper[6]
                  aBitSize[1] := aBitSize[1] + aPaper[3]
                  aBitSize[2] := aBitSize[2] + aPaper[2] - aPaper[6]
               ENDIF
               aBitRect      := IIf( aBlattZ[10]<0 .AND. aBlattZ[9]<0, &cFeld, ;
                                 { aBlattZ[10], aBlattZ[9], aBitSize[1], aBitSize[2] } ) //17.09.2005
               IF Len(cGrafik)>100      //22.07.2006 11:47 >50 heiát:in cGrafik ist die Grafik
                  oBitmap:setbuffer( cGrafik )          // Bitmap laden
               ELSEIF (cDatver[1]+":")$cGrafik          //+19.11.2008 09:45
                  oBitmap:loadFile( cGrafik )          // Bitmap laden   18.11.2008 14:56
               ELSE                    //22.07.2006 11:47 <50 heiát:in cGrafik ist der GrafikdateiName
                  oBitmap:loadFile( cDatver+cGrafik )          // Bitmap laden   18.11.2008 14:56
               ENDIF
               aSourceRect      := { 0, 0, oBitmap:xSize, oBitmap:ySize }  // hierher 21.10.2007 11:05
               //+09.01.2018 17:23 von Blattaufbau() hierherkopiert, wegen der Folgeseiten: vvvvvvvvvvvvvvvvvvvvvvv
               IF Upper(AppName())$cAc .AND. "PDF"$cDruckerName    //+03.06.2017 20:36
                  IF "PDF"$cDruckerName   //29.01.2018 20:47
                     aBitRect[1] += 10
                     aBitRect[2] += 42
                     aBitRect[3] += 10
                     aBitRect[4] += 42
                  ELSE
                     aBitRect[1] -= 12     //    10
                     aBitRect[2] += 10     //    42
                     aBitRect[3] -= 12     //    10
                     aBitRect[4] += 10     //    42
                  ENDIF                                  
               ENDIF                                  
               IF Upper(AppName())$"VELLX.EXE" .AND. "VellX_neu"$cGrafik    //+09.01.2018 09:38
                  aBitRect[1] -= aPaper[3]      // damit das Briefpapier als Grafik
                  aBitRect[2] -= aPaper[4]      // in Originalgr”áe
                  aBitRect[3] -= aPaper[3]      // ausgedruckt wird
                  aBitRect[4] -= aPaper[4]      //
               ENDIF                                  
               //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
               oBitmap:draw( aPrinterPS[1], aBitRect, aSourceRect,, GRA_BLT_BBO_IGNORE )  //21.10.2007 18:27
               LOOP
            ENDIF
            IF cFeld <> NIL
                  IF Upper( AppName() ) $ "DOENNEX.EXE" .or. cKomma = ","
                  ccFeld := IIf( Valtype( cFeld ) == "C", ;
                         IIf( cFeld="&", ;
                         IIf( Valtype( &(substr( cFeld,2,len(cFeld)-1 )))=="N", ;
                         Transform( &(substr( cFeld,2,len(cFeld)-1 )), cPicture ), ;
                         &(substr( cFeld,2,len(cFeld)-1 )) ), ;
                         cFeld ), cFeld )
                ELSE
                  ccFeld := IIf( Valtype( cFeld ) == "C", ;
                         IIf( cFeld="&", ;
                         IIf( Valtype( &(substr( cFeld,2,len(cFeld)-1 )))=="N", ;
                         Str( &(substr( cFeld,2,len(cFeld)-1 )),8,2 ), ;
                         &(substr( cFeld,2,len(cFeld)-1 )) ), ;
                         cFeld ), cFeld )
                ENDIF
               DO CASE
                  CASE Valtype( ccFeld ) == "C"
                     IIf( Len(Trim(cText))>0 .AND. cText <> "&" .AND. nTFont>0, ;
                                FdrG( aPrinterPS, aFont, aPaper, aPoSZ, ;
                                       Trim( cText ), nTFont, aSchrift, cAusR ), )
                     IIf( nFFont>0, FdrG( aPrinterPS, aFont, aPaper, aPoSZ, ;
                                          Trim( ccFeld ), nFFont, aSchrift, cAusR ), )
                  CASE Valtype( ccFeld ) == "N"
                     IIf( Len(Trim(cText))>0 .AND. cText <> "&" .AND. nTFont>0, ;
                                FdrG( aPrinterPS, aFont, aPaper, aPoSZ, ;
                                       Trim( cText ), nTFont, aSchrift, cAusR ), )
                  IF Upper( AppName() ) $ "DOENNEX.EXE" .or. cKomma = ","
                        IIf( nFFont>0, FdrG( aPrinterPS, aFont, aPaper, aPoSZ, ;
                                             Trim( Transform( ccFeld, cPicture ) ), &nA->FFont, aSchrift, cAusR ), )
                     ELSE
                        IIf( nFFont>0, FdrG( aPrinterPS, aFont, aPaper, aPoSZ, ;
                                             Trim( Str( ccFeld,8,2 ) ), nFFont, aSchrift, cAusR ), )
                     ENDIF
                  CASE Valtype( ccFeld ) == "D"
                     IIf( Len(Trim(cText))>0 .AND. cText <> "&" .AND. nTFont>0, ;
                                FdrG( aPrinterPS, aFont, aPaper, aPoSZ, ;
                                       Trim( cText ), nTFont, aSchrift, cAusR ), )
                     IIf( nFFont>0, FdrG( aPrinterPS, aFont, aPaper, aPoSZ, ;
                                          DtoC( ccFeld ), nFFont, aSchrift, cAusR ), )
                  CASE ccFeld == NIL   // es soll sich nichts bewegen, wenn nichts zu drucken
                     nZei := IIf( nZeile<1, nZei+nZeile, nZei )
               ENDCASE
            ELSE
               IIf( nTFont>0, FdrG( aPrinterPS, aFont, aPaper, aPoSZ, ;
                                    Trim( cText ), nTFont, aSchrift, cAusR ), )
            ENDIF
      NEXT
RETURN

//23.01.2011 11:51   aPoSZ_Local
FUNCTION RepDruck2G( aRep, cNa, cArea, cCP, nt, cRAV, cBedingung, ;
                  aPrinterPS, aFont, aPaper, aPoSZ_Local, aSchrift, aBlatt, aSegments, nSegment, cS, loBMP, cFileName )
   LOCAL nOldArea := Select(), nRec, k, nZeiold, nSpaold
   LOCAL cSeite, cPrompt, cText, nTFont, cBereich, cFeld, nFFont, cF, cAusR  // 7.7.2005 Ausrichtung
   LOCAL nSumme := 0 , nZeile := -1, cHeute := "XX.XX."
   LOCAL aAttr := ARRAY( GRA_AA_COUNT )	//+23.06.2019 19:11
   PRIVATE cB, cFd   // wegen Makros
   PRIVATE cFilter := IIf(!Empty(cBedingung),cBedingung,"") // weil Makro PRIVATE braucht!
   nMSum := 0
   ASize(aSum,Len(aRep))
   AFill(aSum,0)
   cAuf := StrX( (1->auftrnr),E,0 )
   SELECT &cArea
   nRec := RecNo()      //******
   DbSetFilter( {||&cFilter} )
   DbGotop()
   DO WHILE !Eof()
      IF (cArea)->(IsFieldVar("rn")) //21.01.2007 17:57 als Kennzeichen fr Auftragsdatei
         IF cNA <> kennz .AND. cNA != "0"  //25.01.2007 21:26 1=EL, 2=FL oder 0=alles
            SKIP
            LOOP
         ENDIF
      ENDIF
      FOR k := 1 TO Len( aRep )
         aBlattZ := aRep[k]
         cSeite := aBlattZ[1]
         cNa := aBlattZ[2]
         cPrompt := aBlattZ[3]
         cAusR := IIf(!Empty(cPrompt).AND.cPrompt[1]$">^:",cPrompt[1], ;
                  IIf(IsMemVar("cAR").AND.!Empty(cAR).AND.cAR[1]$"><^:",cAR[1], ;
                  "<")) // 16.09.2006 13:43 Ausrichtung: wenn in cPrompt oder in cAR, sonst: links
//         cAusR := IIf(!Empty(cPrompt).AND.cPrompt[1]$">^",cPrompt[1],"<") // 7.7.2005 Ausrichtung
         cText := IIf( cCP="A", ConvToAnsiCP( aBlattZ[4] ), aBlattZ[4] )
         nTFont := aBlattZ[5]
         cBereich := aBlattZ[6]
         cFeld := IIf( cCP="A" .AND. ValType( aBlattZ[7] ) = "C", ;
                      ConvToAnsiCP( aBlattZ[7] ), aBlattZ[7] ) // Feldinhalt
         nFFont := aBlattZ[8]
         IF !cFeld[1]$"|%_"
            cB := cBereich ; cFd := cFeld
            IF cBereich = "v"
               IF cFd[1]="&"
                  cFd := &(SubStr(cFd,2))
                  cF := &cFd
               ELSE
               cF := &cFd
               ENDIF
            ELSE
               IF cFd[1]="&"
                  cFd := &(SubStr(cFd,2))
                  cF := &cB->&cFd
               ELSE
               cF := ((&cB)->(&cFd))
               ENDIF
            ENDIF
         ELSE
            cF := cFeld[1]+IIf(cFeld[2]="&",&(SubStr(cFeld,3,Len(cFeld)-2)),SubStr(cFeld,2,Len(cFeld)-1))
         ENDIF
// wenn cF leer ist -> keine Bewegung von Zeile/Spalte:
         aPoSZ[2] := IIf( !Empty( cF ) .OR. (Empty(nFFont) .AND. Empty(nTFont)), ;
                        IIf( aBlattZ[9]<0.1, aPoSZ[2]-aBlattZ[9], aBlattZ[9] ), ;
                        aPoSZ[2] )
         aPoSZ[1] := IIf( !Empty( cF ) .OR. (Empty(nFFont) .AND. Empty(nTFont)), ;
                        IIf( aBlattZ[10]<0.1, aPoSZ[1]-aBlattZ[10], aBlattZ[10] ), ;
                        aPoSZ[1]+1 )
         nSpalte := aBlattZ[10]     //15.04.2007 07:43
         IF (cArea)->(IsFieldVar("datum"))
//         IF k=3 .AND. cHeute != cF .AND. cZwiSaldo = "j"  // wenn anderes Datum als Vorzeile****
            IF k=1 .AND. !cHeute$DtoC((cArea)->datum)+"XX.XX." .AND. Upper(cZwiSaldo) = "J"  // wenn anderes Datum als Vorzeile****
               nZeiOld := aPoSZ[2] + 1
               nSpaOld := aPoSZ[1]
//							//+02.06.2019 21:17 * * * T E S T * * *  fr Seite speichern
							//+28.06.2020 12:05 damit bei Trauerdruck nicht gemailt wird: "BL_BRF0-BL_BRF1-BL_BRF2-BL_FOTO"
							IF !Upper(cDru)$"BL_TERM-BL_BRF0-BL_BRF1-BL_BRF2-BL_FOTO-BL_KAS-BL_KAST-BL_KASK-BL_KATX" .AND. Upper(AppName())$"NOLTEX.EXE-MUELLX.EXE-BLEINX.EXE-KLUCKX-EXE"
							   IF ValType(cFilename)=="C"
							 		cFilenameX := Stuff(cFilename,At(".",cFilename),1,LTrim(Str(nsegment))+"G2a.")
									FErase(cDatver+cFilenameX)
									loBmp:SaveFile( cDatver+cFilenameX , XBPBMP_FORMAT_JPG, XBPBMP_DEF_COMPRESSION)
									AAdd(aFileName, cFilenameX)
							   ENDIF
							ENDIF
//							//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
							IF !Upper(cDru)$"BL_TERM-BL_BRF0-BL_BRF1-BL_BRF2-BL_FOTO-BL_KAS-BL_KAST-BL_KASK-BL_KATX"	//+13.07.2020 12:47
						GraSegClose( aPrinterPS[1] )
                  AAdd( aSegments, nSegment )
                  nSegment := GraSegOpen( aPrinterPS[1], GRA_SEG_MODIFIABLE )
//							//+23.06.2019 19:05
							//+28.06.2020 12:05 damit bei Trauerdruck nicht gemailt wird: "BL_BRF0-BL_BRF1-BL_BRF2-BL_FOTO"
							ENDIF
							IF !Upper(cDru)$"BL_TERM-BL_BRF0-BL_BRF1-BL_BRF2-BL_FOTO-BL_KAS-BL_KAST-BL_KASK-BL_KATX" .AND. Upper(AppName())$"NOLTEX.EXE-MUELLX.EXE-BLEINX.EXE-KLUCKX.EXE-SONNEX.EXE-VELLX.EXE" .AND. ValType(cFilename) == "C"
////								loBmp := XbpBitmap():New():Create(aPrinterPS[1])
////			               loBMP:PresSpace(aPrinterPS[1])    // Bind the presentation space to the BMP
////								loBmp:Make( aPaper[1], aPaper[2],,24 )  // Set the size that you want it to be.
         aAttr[GRA_AA_COLOR] := GRA_CLR_WHITE
         aAttr[GRA_AA_BACKCOLOR] := GRA_CLR_BLACK
         GraSetAttrArea( aPrinterPS[1], aAttr )
         GraBox( aPrinterPS[1], {0,0}, {aPaper[1],aPaper[2]}, GRA_OUTLINEFILL )
	                  ENDIF
               Zwischen( aPrinterPS, aFont, aPaper, @aPoSZ, aSchrift, aBlatt, aSegments, @nSegment, , loBMP, cFileName ) //11.06.2019 14:49///////////////////
               aPoSZ[2] := aPoSZ[2] + 2
               aPoSZ[1] := nSpaOld
            ENDIF
            cHeute := IIf( "DtoC"$cFeld, cF, cHeute )    // demn„chst: das Datum der vorigen Zeile****
         ENDIF
         IF aPoSZ[2] > Val( cZeimax )  // 10.09.2005 damit auch FL mehrseitig geht
            nZeiOld := aPoSZ[2]
            nSpaOld := aPoSZ[1]
//							//+02.06.2019 21:17 * * * T E S T * * *  fr Seite speichern
							//+28.06.2020 12:05 damit bei Trauerdruck nicht gemailt wird: "BL_BRF0-BL_BRF1-BL_BRF2-BL_FOTO"
							IF !Upper(cDru)$"BL_TERM-BL_BRF0-BL_BRF1-BL_BRF2-BL_FOTO-BL_KAS-BL_KAST-BL_KASK-BL_KATX" .AND. Upper(AppName())$"NOLTEX.EXE-MUELLX.EXE-BLEINX.EXE-KLUCKX.EXE-SONNEX.EXE-VELLX.EXE"
							   IF ValType(cFilename)=="C"
							 		cFilenameX := Stuff(cFilename,At(".",cFilename),1,LTrim(Str(nsegment))+"G2b.")
									FErase(cDatver+cFilenameX)
									loBmp:SaveFile( cDatver+cFilenameX , XBPBMP_FORMAT_JPG, XBPBMP_DEF_COMPRESSION)
									AAdd(aFileName, cFilenameX)
							   ENDIF
							ENDIF
//							//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
							IF !Upper(cDru)$"BL_TERM-BL_BRF0-BL_BRF1-BL_BRF2-BL_FOTO-BL_KAS-BL_KAST-BL_KASK-BL_KATX"	//+13.07.2020 12:47
						GraSegClose( aPrinterPS[1] )
                  AAdd( aSegments, nSegment )
                  nSegment := GraSegOpen( aPrinterPS[1], GRA_SEG_MODIFIABLE )
                  	ENDIF
//							//+23.06.2019 19:05
							//+28.06.2020 12:05 damit bei Trauerdruck nicht gemailt wird: "BL_BRF0-BL_BRF1-BL_BRF2-BL_FOTO"
							IF !Upper(cDru)$"BL_TERM-BL_BRF0-BL_BRF1-BL_BRF2-BL_FOTO-BL_KAS-BL_KAST-BL_KASK-BL_KATX" .AND. Upper(AppName())$"NOLTEX.EXE-MUELLX.EXE-BLEINX.EXE-KLUCKX.EXE-SONNEX.EXE-VELLX.EXE" .AND. ValType(cFilename) == "C"
////								loBmp := XbpBitmap():New():Create(aPrinterPS[1])
////			               loBMP:PresSpace(aPrinterPS[1])    // Bind the presentation space to the BMP
////								loBmp:Make( aPaper[1], aPaper[2],,24 )  // Set the size that you want it to be.
         aAttr[GRA_AA_COLOR] := GRA_CLR_WHITE
         aAttr[GRA_AA_BACKCOLOR] := GRA_CLR_BLACK
         GraSetAttrArea( aPrinterPS[1], aAttr )
         GraBox( aPrinterPS[1], {0,0}, {aPaper[1],aPaper[2]}, GRA_OUTLINEFILL )
	                  ENDIF
//03.06.2019 17:43            Kopf2( aPrinterPS, aFont, aPaper, aPoSZ, aSchrift, aBlatt, aSegments, @nSegment ) /////////////////////
            Kopf2( aPrinterPS, aFont, aPaper, aPoSZ, aSchrift, aBlatt, aSegments, @nSegment, , loBMP, cFileName ) //03.06.2019 17:43///////////////////
            aPoSZ[2] := aPoSZ[2] + 2
            aPoSZ[1] := nSpaOld
         ENDIF
         DO CASE
            CASE "MEMODRUCK"$Upper(cPrompt)  //17.05.2007 17:53
               MemoDruck( aPrinterPS, aFont, aPaper, aPoSZ, IIf(Empty(cFeld),1->notiz,&cF), ;
                           Max(nFFont,1), aSchrift, @aSegments, @nSegment, aBlatt, ;
                           Val(IIf(cText[1]="&",&(SubStr(cText,2)),cText)), ;
                           cAusR, nTFont, loBMP, cFileName )		//+06.08.2019 09:44	, loBMP, cFileName
            CASE Valtype( cF ) == "C"
               IIf( nFFont>0, FdrG( aPrinterPS, aFont, aPaper, aPoSZ, ;
                                    Trim( cF ), nFFont, aSchrift, cAusR ), )
               aSum[k] = IIf( Val(cF)!=0, aSum[k]+Val(cF), aSum[k] )
            CASE Valtype( cF ) == "N"
               IF cF <> 0 .AND. ;
                     ( Upper( cRAV ) = "R" .OR. Upper( cRAV ) = "V" .OR. Upper( cRAV ) = "K" )
                  IF Upper( AppName() ) $ "DOENNEX.EXE" .or. cKomma = ","
                     IIf( nFFont>0, FdrG( aPrinterPS, aFont, aPaper, aPoSZ, ;
                                          Trim( Transform( cF, cPicture ) ), nFFont, aSchrift, cAusR ), )
                  ELSE
                     IIf( nFFont>0, FdrG( aPrinterPS, aFont, aPaper, aPoSZ, ;
                                          Trim( Str( cF,8,2 ) ), nFFont, aSchrift, cAusR ), )
                  ENDIF
               ENDIF
               aSum[k] := aSum[k] + cF
            CASE Valtype( cF ) == "D"
               IIf( nFFont>0, FdrG( aPrinterPS, aFont, aPaper, aPoSZ, ;
                                    DtoC( cF ), nFFont, aSchrift, cAusR ), )
               aSum[k] = "D"
         ENDCASE
      NEXT
      SKIP
   ENDDO
   DbClearFilter()
   GO nRec     //********
   SELECT &nOldArea
RETURN aSum

//+23.01.2011 11:51  aPoSZ_Local 
// wird fr RepDruck2 gebraucht (Statistik-Listings)
PROCEDURE Zwischen( aPrinterPS, aFont, aPaper, aPoSZ_Local, aSchrift, aBlatt, aSegments, nSegment, cS, loBMP, cFileName )
   LOCAL cFK, nFFont, nTFont, cText, cFeld, cBereich, ccFeld, cAusR  // 7.7.2005 Ausrichtung
   LOCAL aBlattZ, cSeite, cNa, cPrompt
   LOCAL aAttr := ARRAY( GRA_AA_COUNT )	//+23.06.2019 19:11
      FOR i := 1 to Len( aBlatt )
         aBlattZ := aBlatt[i]
         cSeite := aBlattZ[1]
         IF Upper(cSeite) != "Z" // ZETT
            LOOP
         ENDIF
         cNa := aBlattZ[2]
         cPrompt := aBlattZ[3]
         cAusR := IIf(!Empty(cPrompt).AND.cPrompt[1]$">^:",cPrompt[1], ;
                  IIf(IsMemVar("cAR").AND.!Empty(cAR).AND.cAR[1]$"><^:",cAR[1], ;
                  "<")) // 16.09.2006 13:43 Ausrichtung: wenn in cPrompt oder in cAR, sonst: links
         cText := aBlattZ[4]
         nTFont := IIf( !Empty(nStandardFont) .AND. aBlattZ[5] != 0, ;
                              aBlattZ[5] := nStandardFont, aBlattZ[5] )
         cBereich := aBlattZ[6]
         cFeld := aBlattZ[7]
         nFFont := IIf( !Empty(nStandardFont) .AND. aBlattZ[8] != 0, ;
                              aBlattZ[8] := nStandardFont, aBlattZ[8] )
            aPoSZ[2] := IIf( aBlattZ[9]<0.1, aPoSZ[2]-aBlattZ[9], aBlattZ[9] )
            aPoSZ[1] := IIf( aBlattZ[10]<0.1, aPoSZ[1]-aBlattZ[10], aBlattZ[10] )
            nSpalte := aBlattZ[10]     //15.04.2007 07:44
            IF Upper( cNa ) = "Z"
               IF !Empty(nSegment)
//							//+02.06.2019 21:17 * * * T E S T * * *  fr Seite speichern
							//+28.06.2020 12:05 damit bei Trauerdruck nicht gemailt wird: "BL_BRF0-BL_BRF1-BL_BRF2-BL_FOTO"
							IF !Upper(cDru)$"BL_TERM-BL_BRF0-BL_BRF1-BL_BRF2-BL_FOTO-BL_KAS-BL_KAST-BL_KASK-BL_KATX" .AND. Upper(AppName())$"NOLTEX.EXE-MUELLX.EXE-BLEINX.EXE-KLUCKX.EXE-SONNEX.EXE-VELLX.EXE"
							   IF ValType(cFilename)=="C"
							 		cFilenameX := Stuff(cFilename,At(".",cFilename),1,LTrim(Str(nsegment))+"Zw.")
									FErase(cDatver+cFilenameX)
									loBmp:SaveFile( cDatver+cFilenameX , XBPBMP_FORMAT_JPG, XBPBMP_DEF_COMPRESSION)
									AAdd(aFileName, cFilenameX)
							   ENDIF
							ENDIF
//							//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                  GraSegClose( aPrinterPS[1] )
                  AAdd( aSegments, nSegment )
                  nSegment := GraSegOpen( aPrinterPS[1], GRA_SEG_MODIFIABLE )
//							//+23.06.2019 19:05
							//+28.06.2020 12:05 damit bei Trauerdruck nicht gemailt wird: "BL_BRF0-BL_BRF1-BL_BRF2-BL_FOTO"
							IF !Upper(cDru)$"BL_TERM-BL_BRF0-BL_BRF1-BL_BRF2-BL_FOTO-BL_KAS-BL_KAST-BL_KASK-BL_KATX" .AND. Upper(AppName())$"NOLTEX.EXE-MUELLX.EXE-BLEINX.EXE-KLUCKX.EXE-SONNEX.EXE-VELLX.EXE" .AND. ValType(cFilename) == "C"
////								loBmp := XbpBitmap():New():Create(aPrinterPS[1])
////			               loBMP:PresSpace(aPrinterPS[1])    // Bind the presentation space to the BMP
////								loBmp:Make( aPaper[1], aPaper[2],,24 )  // Set the size that you want it to be.
         aAttr[GRA_AA_COLOR] := GRA_CLR_WHITE
         aAttr[GRA_AA_BACKCOLOR] := GRA_CLR_BLACK
         GraSetAttrArea( aPrinterPS[1], aAttr )
         GraBox( aPrinterPS[1], {0,0}, {aPaper[1],aPaper[2]}, GRA_OUTLINEFILL )
	                  ENDIF
               ELSE
                  IF !Empty( aSeitZ )     // GesamtSeitenZahl - Seitenzahlen bei Statistik-Drucken
                     FdrG( aPrinterPS, aFont, aPaper, AClone(aSeitZ[2]), ;
                                    Trim( aSeitZ[3] ), aSeitZ[4], aSchrift, cAusR )
                  ENDIF
                  aPrinterPS[1]:device():newPage() // [1]!
               ENDIF

					//+07.06.2019 22:03 neue Seite:
					IF Upper(AppName())$"MUELLX.EXE-BLEINX.EXE"
			         cHtml += '</div><p style="margin: 0cm; page-break-before:always;">Seitentrennung-Zwischen</p>' + CRLF
			         cHtml += '<div style="position:absolute; z-index:2; width:210mm: height:297mm;">' + CRLF
				      //FWrite( nHandle_html, cHtml )
				   ENDIF

               ++nSeitNr
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>  hier wird der Briefkopf eingefgt, wenn fr Statistik gebraucht...
               LOOP
            ENDIF
            IF cFeld <> NIL
                  IF Upper( AppName() ) $ "DOENNEX.EXE" .or. cKomma = ","
                  ccFeld := IIf( Valtype( cFeld ) == "C", ;
                         IIf( cFeld="&", ;
                         IIf( Valtype( &(substr( cFeld,2,len(cFeld)-1 )))=="N", ;
                         Transform( &(substr( cFeld,2,len(cFeld)-1 )), cPicture ), ;
                         &(substr( cFeld,2,len(cFeld)-1 )) ), ;
                         cFeld ), cFeld )
                ELSE
                  ccFeld := IIf( Valtype( cFeld ) == "C", ;
                         IIf( cFeld="&", ;
                         IIf( Valtype( &(substr( cFeld,2,len(cFeld)-1 )))=="N", ;
                         Str( &(substr( cFeld,2,len(cFeld)-1 )),8,2 ), ;
                         &(substr( cFeld,2,len(cFeld)-1 )) ), ;
                         cFeld ), cFeld )
                ENDIF
               DO CASE
                  CASE Valtype( ccFeld ) == "C"
                     IIf( Len(Trim(cText))>0 .AND. cText <> "&" .AND. nTFont>0, ;
                                FdrG( aPrinterPS, aFont, aPaper, aPoSZ, ;
                                       Trim( cText ), nTFont, aSchrift, cAusR ), )
                     IIf( nFFont>0, FdrG( aPrinterPS, aFont, aPaper, aPoSZ, ;
                                          Trim( ccFeld ), nFFont, aSchrift, cAusR ), )
                  CASE Valtype( ccFeld ) == "N"
                     IIf( Len(Trim(cText))>0 .AND. cText <> "&" .AND. nTFont>0, ;
                                FdrG( aPrinterPS, aFont, aPaper, aPoSZ, ;
                                       Trim( cText ), nTFont, aSchrift, cAusR ), )
                  IF Upper( AppName() ) $ "DOENNEX.EXE" .or. cKomma = ","
                        IIf( nFFont>0, FdrG( aPrinterPS, aFont, aPaper, aPoSZ, ;
                                             Trim( Transform( ccFeld, cPicture ) ), &nA->FFont, aSchrift, cAusR ), )
                     ELSE
                        IIf( nFFont>0, FdrG( aPrinterPS, aFont, aPaper, aPoSZ, ;
                                             Trim( Str( ccFeld,8,2 ) ), nFFont, aSchrift, cAusR ), )
                     ENDIF
                  CASE Valtype( ccFeld ) == "D"
                     IIf( Len(Trim(cText))>0 .AND. cText <> "&" .AND. nTFont>0, ;
                                FdrG( aPrinterPS, aFont, aPaper, aPoSZ, ;
                                       Trim( cText ), nTFont, aSchrift, cAusR ), )
                     IIf( nFFont>0, FdrG( aPrinterPS, aFont, aPaper, aPoSZ, ;
                                          DtoC( ccFeld ), nFFont, aSchrift, cAusR ), )
                  CASE ccFeld == NIL   // es soll sich nichts bewegen, wenn nichts zu drucken
                     nZei := IIf( nZeile<1, nZei+nZeile, nZei )
               ENDCASE
            ELSE
               IIf( nTFont>0, FdrG( aPrinterPS, aFont, aPaper, aPoSZ, ;
                                    Trim( cText ), nTFont, aSchrift, cAusR ), )
            ENDIF
      NEXT
RETURN

//+23.01.2011 12:00  aPoSZ_Local
// in TFont steht nZAb: Anzahl der Zeilen pro LF 24.09.2006 15:24		//+06.08.2019 09:43 , loBMP, cFileName
FUNCTION MemoDruck( aPrinterPS, aFont, aPaper, aPoSZ_Local, cString, nMFont, aSchrift, aSegments, nSegment, aBlatt, nZeiLen, cAusR, nZAb, loBMP, cFileName )
   LOCAL nSpaS := aPoSZ[1], cLine, i, nCRLF, nOldArea := SELECT(), j:=1
//   LOCAL cTKurz := IIf( !Empty(nZeiLen), &("cTKurz" + Str((nZeiLen-Int(nZeiLen))*10,1)),"")
   PRIVATE cZ
   DEFAULT nZAb TO 1       //24.09.2006 15:35
  // 11.02.2008 18:46 Zeilenabstand ver„ndern fr andere Schriftgr”áen:
   IF nMFont == 8    // gr”áere Schriften sind immer als 8. definiert
      nZab := Round(Val(SubStr(aSchArt[1],1,2))/10*nZab,0)
   ENDIF
   nZAb := Max( 1, nZab )  //24.09.2006 15:35
   IF Len(Trim(cString)) = 0 .OR. (Len(Trim(cString))=1 .AND. cString[1]$"<^>:")   //24.09.2006 13:07
         RETURN .F.
   ENDIF
   nZeiLen := IIf( Empty(nZeiLen), IIf(Len(aSchrift)=1,90,65), Int(nZeiLen) ) //21.10.2006 11:26
   IIf( IsMemVar("nSeitnr"),nSNr := nSeitnr, nSnr := 1 )
   IF ValType(aBlatt)=="A"       // 19.12.2005
      cString := HardCR( cString )
   ENDIF
   IF !Empty(cAusR) .AND. cAusR$"<^>:" .AND. cAusR = cString[1]  // 06.11.2007 16:01
      cString := SubStr(cString,2)     // damit nicht doppelt aligned wird ( wg. FdrG() )
   ENDIF
   DO WHILE Right(Trim(cString),6) == CRLF+CRLF+CRLF     //23.10.2007 11:29
      cString := Left(cString,Len(cString)-6)   // damit hinten nicht soviele Leerzeilen
   ENDDO
   cString := cString + " " + CRLF     //16.07.2006 19:57 " "
   FOR i := 1 TO MlCount(cString,nZeiLen)
      cLine := MyMemoLine( cString, nZeiLen, i )   //21.10.2006 11:26 s.o nZeiLen=
      aPoSZ[2] := aPoSZ[2] + 1 * nZAb  //24.09.2006 15:26 
      aPoSZ[1] := nSpaS
      FdrG( aPrinterPS, aFont, aPaper, aPoSZ, Trim( cLine ), nMFont, aSchrift, cAusR, nZeiLen ) //03.10.2006 10:05 nZeiLen
         IF aPoSZ[2] > IIf( Val(cZeimax)>0, Val(cZeimax), 60 )  //04.11.2006 14:57
            ++nSnr
            nZeiOld := aPoSZ[2]
            nSpaOld := aPoSZ[1]
            IF ValType(aBlatt)=="A"
//03.06.2019 17:43               Kopf2( aPrinterPS, aFont, aPaper, aPoSZ, aSchrift, aBlatt, aSegments, @nSegment )
               Kopf2( aPrinterPS, aFont, aPaper, aPoSZ, aSchrift, aBlatt, aSegments, @nSegment, , loBMP, cFileName )	//03.06.2019 17:44
            ELSE     // 17.12.2005 z.B. fr die F1-Ausdrucke
               FdrG( aPrinterPS, aFont, aPaper, {aPoSZ[1],nZeiOld+1}, "- "+Str(nSnr,1,0)+" -", ;
                                                      nMFont, aSchrift, cAusR )
               aPrinterPS[1]:device():newPage()    // [1]!
               aPoSZ[2] := 3  // weil 5-2=3
               FdrG( aPrinterPS, aFont, aPaper, {5,aPoSZ[2]}, "- "+Str(nSnr,1,0)+" -", ;
                                                      nMFont, aSchrift, cAusR )
            ENDIF
            aPoSZ[2] := aPoSZ[2] + 2 * nZAb  //24.09.2006 15:27
            aPoSZ[1] := nSpaOld
         ENDIF
   NEXT
RETURN "."

// 20.12.2005: vorl„ufiger Test nur bei SinzigX: (jetzt in AKDialogVH.prg)
FUNCTION TextLesen( cKurz, cString )
   LOCAL i, nOldArea := SELECT(), j
   PRIVATE cZ
   cString := ""  // == oEdit:BriefText, wird per Referenz bergeben (oder als Ergebnis gelesen)
   SELECT 27
   USE txdat INDEX xtx
   27->(DbSeek( cKurz, .F. ))
   j := IIf( 27->z1="Sehr" .AND. 27->z2=" ", 3, 1 )
   FOR i := j TO 33
      cZ := "z"+LTrim(Str(i,2,0))
      cZ := Trim(&cZ)
      cString := cString + cZ + IIf(Len(cZ)>0," ","") + CRLF
   NEXT
   USE
   SELECT (nOldArea)
RETURN cString

// nachfolgende User-Funktion aus der Knowledgebase ersetzt Memoline
// und behebt Probleme, wenn die Zeile komplett gefllt ist (ohne Space am Ende) 
FUNCTION MyMemoLine( cString, nLineLen, nLine, nTabSize, lWrap )
local cLine,startrow,spacechar,hyphenchar,crlfchar,extract_len,checkstring

default nLineLen to 79,;
        nLine    to  1,;
        nTabSize to  4,;
        lWrap    to .t.

startrow := 1
cLine    := ""

// Convert tab to space
cString := strtran(cString, chr(9), space(nTabSize))

// cString needs a trailing space so function will find one on last line
cString += " "

if lWrap
    // Find position of rightmost space
    // The largest value is the maximum line length
    while len(cString) > 0
        checkstring := substr(cString,1,nLineLen+1)
        crlfchar    :=  at(CRLF,checkstring)

        if crlfchar > 0
            extract_len := crlfchar
        else
            spacechar   := rat(' ' ,checkstring)
            hyphenchar  := rat('-' ,checkstring)
            extract_len := max(spacechar, hyphenchar)
        endif

        // No space or hyphen -- extract as much of line as possible
        if extract_len == 0
            extract_len := nLineLen
        endif

        // Extract the line
        cLine := left(checkstring,extract_len)

        if right(cLine,1) == chr(13)               // wrapped at CRLF
            cLine := left(cLine, len(cLine)-1)
        endif
        cLine := pad(cLine, nLineLen)

        // Required line extracted, exit
        if startrow == nLine
            exit
        endif

        startrow ++

        // Remove extracted part from string and continue with rest
        cString := ltrim(substr(cString,extract_len+1))
        if left(cString,1) == chr(10)               // wrapped at CRLF
            cString := substr(cString, 2)
        endif
        if left(cString,2) == CRLF .AND. Len(cString)>2  // CRLF VOR der Zeile
            cString := substr(cString, 3)
        endif
        cLine := ""                                 // reinit it
    end
else
    cLine := left(checkstring,nLinelen)
endif
                                  
RETURN  cLine
//------------------------------------------
//+23.01.2011 12:00  aPoSZ_Local
PROCEDURE Blatt_Aufbau( aPrinterPS, aFont, aPaper, aPoSZ_Local, aSchrift, aBlatt, cCP, aSegments, nSegment, loBMP, cFileName )	//+09.06.2019 18:19 loBMP
   LOCAL oBitmap, aBitRect, aBitSize, aSourceRect, cGrafik
   LOCAL aBlattZ := {}, i, aRep := {}, cOldPic := cPicture, cAusR // 7.7.2005 Ausrichtung
   LOCAL cSeite, cNa, cPrompt, nTFont
   LOCAL nHandle, cBMBuffer := Space(50), nResolution     //+ 29.09.2008 16:09 fr Echtgr”áendruck
   LOCAL aTextPos, nZeiLen  //+24.01.2009 10:13 fr FotoSeitenDruck
   LOCAL aAttr := ARRAY( GRA_AA_COUNT )	//+04.06.2019 10:31
   PRIVATE cText, cBereich, cFeld, nFFont, aSum := {}, aS1 := {}
   PRIVATE cB, cF, xF, nSeitNr := 1, aSchr := aSchrift, nSpalte   //14.04.2007 19:58 Spaltenmerker
   PRIVATE cT, nPh := aPaper[2] //+24.01.2009 10:16 fr TextPosition bei FotoSeitenDruck
   PRIVATE nStandardFont := IIf( IsMemVar("cStandardFont"), Val(cStandardFont), 0 )
   PRIVATE aFileName := {}		//+30.06.2019 13:17 sammelt die Bilddateinamen zwecks Zusammenfassung zu einer Datei
   FOR i := 11 TO 30
      &("i"+Str(i,2,0)) := "0"
   NEXT
	aPoszVor := {0,0}		//06.12.2022 15:53 damit die PUBLIC bei 0 startet.
	t_Html := ""			//08.12.2022 10:20 damit der HTML-Text nicht mehrmals kommt
//	cHtml := ""				//09.01.2026 10:25 damit der HTML-Text nicht mehrmals kommt
	
//zur Erinnerung:			IIf(ValType(cFilename)=="C",loBmp:SaveFile( "c:\bestatt\noltex\scans\"+LTrim(Str(Seconds()))+"XXX-2-"+StrZero(nSegment)+".jpg" , XBPBMP_FORMAT_JPG, XBPBMP_DEF_COMPRESSION),)

   nISum := 0; cISum := "0"
   cZweiseitjn := IIf( cZweiseitjn="a" .AND. nLetzteZeile>Val(cZeiMax), "2", cZweiseitjn )
      FOR i := 1 to Len( aBlatt )
         aBlattZ := AClone(aBlatt[i])     //19.02.2008 22:53
         cSeite := aBlattZ[1]
         cNa := aBlattZ[2]
         cPrompt := aBlattZ[3]
// in cPrompt kann die Ausrichtung als ^=zentriert und >=rechtsbndig angegeben werden
// (wirkt genauso wie in der ersten Stelle von cText) siehe FdrG
         cAusR := IIf(!Empty(cPrompt).AND.cPrompt[1]$">^:",cPrompt[1], ;
                  IIf(IsMemVar("cAR").AND.!Empty(cAR).AND.cAR[1]$"><^:",cAR[1], ;
                  "<")) // 16.09.2006 13:43 Ausrichtung: wenn in cPrompt oder in cAR, sonst: links
         cText := aBlattZ[4]
         nTFont := IIf( !Empty(nStandardFont) .AND. aBlattZ[5] != 0, ;
                              aBlattZ[5] := nStandardFont, aBlattZ[5] )
         cBereich := aBlattZ[6]
         cFeld := aBlattZ[7]
         nFFont := IIf( !Empty(nStandardFont) .AND. aBlattZ[8] != 0, ;
                              aBlattZ[8] := nStandardFont, aBlattZ[8] )
         IF IsMemVar("cVordruck") .AND. Upper(cVordruck) = "N" .AND. !"cVordruck"$cFeld    //+19.10.2009 21:33
            LOOP
         ENDIF
//************************************************************************************
// in der Rechnung werden die Zeilen gez„hlt wegen des automatischen Umbruchs
// wenn in cFeld eine Funktion ist, die bei einem leeren Ergebnis keinen Zeilenvorschub bringen soll,
// ...dann muss das hier getestet werden und in die IF-Schleife zur aPoSZ-Bestimmung eingebaut werden.
// wenn aber unabh„ngig vom Ergebnis der Funktion ein Zeilenvorschub stattfinden soll,
// ...dann kann man das erzwingen durch eine zus„tzliche 1 auch in nTFont!
//******** W I C H T I G ************ 02.10.2005 *************************************  
// cFeldTest berechnet schon mal das Ergebnis der ausfhrbaren Funktion in cFeld (falls eine ist)
              cFeldTest := IIf( !Empty(cFeld) .AND. Valtype( cFeld ) == "C", ;
                         IIf( cFeld[1]="&", ;
                         IIf( Valtype( &(substr( cFeld,2,len(cFeld)-1 )))=="N", ;
                         Str( &(substr( cFeld,2,len(cFeld)-1 )),8,2 ), ;
                         &(substr( cFeld,2,len(cFeld)-1 )) ), ;
                         cFeld ), cFeld )
         IF (cSeite == "2" .AND. cZweiSeitjn != "2") .OR. Upper( cSeite ) == "R" ;
                     .OR. Upper( cSeite ) == "V" .OR. Upper( cSeite ) == "K" ;
                     .OR. cSeite == "M" .OR.;
                     (Empty(cFeldTest) .AND. IIf(ValType(cFeldTest)="C",Trim(cFeldTest)!="",.T.) ;
                        .AND. Empty(cText) .AND. Empty(nTFont) ) .OR. ;
                        (PadR(cPrompt,1)[1] == "#" .AND. Len(Trim(cFeld))==0) /*28.06.2008 14:59*/
//                     (cFeldTest==NIL .AND. Empty(cText) .AND. Empty(nTFont) )
//            nZei und nSpa bleiben unver„ndert, wenn Artikel/Versicherungszeilen bzw. (2.Seitenkopf bei einseitig)
         ELSEIF cSeite != "G" .AND. cText!="#" .AND. cNA != "G"   // 22.8.2004
            aPoSZ[2] := IIf( aBlattZ[9]<0.1, aPoSZ[2]-aBlattZ[9], aBlattZ[9] )
            aPoSZ[1] := IIf( aBlattZ[10]<0.1, aPoSZ[1]-aBlattZ[10], aBlattZ[10] )
            nSpalte := aBlattZ[10]     //14.04.2007 19:59
         ENDIF
// Zeile ist nicht fr den Druck, sondern fr die Editierdarstellung:
// (kommt erst hier, wegen der Zeilenkorrekturen in dem vorausgehenden IF-ENDIF)
         IF cNA == "M"
            LOOP
         ENDIF
         IF Upper( cSeite ) = "S"
            IF !Empty(nSegment)
//							//+02.06.2019 21:17 * * * T E S T * * *  fr Seite speichern
							//+28.06.2020 12:05 damit bei Trauerdruck nicht gemailt wird: "BL_BRF0-BL_BRF1-BL_BRF2-BL_FOTO"
							IF !Upper(cDru)$"BL_TERM-BL_BRF0-BL_BRF1-BL_BRF2-BL_FOTO-BL_KAS-BL_KAST-BL_KASK-BL_KATX" .AND. Upper(AppName())$"NOLTEX.EXE-MUELLX.EXE-BLEINX.EXE-KLUCKX.EXE-SONNEX.EXE-VELLX.EXE"
							   IF ValType(cFilename)=="C"
							 		cFilenameX := Stuff(cFilename,At(".",cFilename),1,LTrim(Str(nsegment))+"S.")
									FErase(cDatver+cFilenameX)
									loBmp:SaveFile( cDatver+cFilenameX , XBPBMP_FORMAT_JPG, XBPBMP_DEF_COMPRESSION)
									AAdd(aFileName, cFilenameX)
							   ENDIF
							ENDIF
//							//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
               GraSegClose( aPrinterPS[1] )
               AAdd( aSegments, nSegment )
               nSegment := GraSegOpen( aPrinterPS[1], GRA_SEG_MODIFIABLE )
//							//+23.06.2019 19:05
							//+28.06.2020 12:05 damit bei Trauerdruck nicht gemailt wird: "BL_BRF0-BL_BRF1-BL_BRF2-BL_FOTO"
							IF !Upper(cDru)$"BL_TERM-BL_BRF0-BL_BRF1-BL_BRF2-BL_FOTO-BL_KAS-BL_KAST-BL_KASK-BL_KATX" .AND. Upper(AppName())$"NOLTEX.EXE-MUELLX.EXE-BLEINX.EXE-KLUCKX.EXE-SONNEX.EXE-VELLX.EXE" .AND. ValType(cFilename) == "C"
////								loBmp := XbpBitmap():New():Create(aPrinterPS[1])
////			               loBMP:PresSpace(aPrinterPS[1])    // Bind the presentation space to the BMP
////								loBmp:Make( aPaper[1], aPaper[2],,24 )  // Set the size that you want it to be.
         aAttr[GRA_AA_COLOR] := GRA_CLR_WHITE
         aAttr[GRA_AA_BACKCOLOR] := GRA_CLR_BLACK
         GraSetAttrArea( aPrinterPS[1], aAttr )
         GraBox( aPrinterPS[1], {0,0}, {aPaper[1],aPaper[2]}, GRA_OUTLINEFILL )
	                  ENDIF
            ELSE
               IF !Empty( aSeitZ )     // GesamtSeitenZahl - Seitenzahlen bei Statistik-Drucken
                  FdrG( aPrinterPS, aFont, aPaper, AClone(aSeitZ[2]), ;
                              Trim( aSeitZ[3] ), aSeitZ[4], aSchrift, cAusR )
               ENDIF
               aPrinterPS[1]:device():newPage() // [1]!
            ENDIF
            ++nSeitNr
            DO WHILE ConfirmBox( oCB, "fertig?", ;
                        "Formular umdrehen!", ;
                        XBPMB_YESNO, ;
                        XBPMB_QUESTION ) == XBPMB_RET_NO
            ENDDO
         ELSEIF Upper( cSeite ) = "B"
            IF !Empty(nSegment)
//							//+02.06.2019 21:17 * * * T E S T * * *  fr Seite speichern
							//+28.06.2020 12:05 damit bei Trauerdruck nicht gemailt wird: "BL_BRF0-BL_BRF1-BL_BRF2-BL_FOTO"
							IF !Upper(cDru)$"BL_TERM-BL_BRF0-BL_BRF1-BL_BRF2-BL_FOTO-BL_KAS-BL_KAST-BL_KASK-BL_KATX" .AND. Upper(AppName())$"NOLTEX.EXE-MUELLX.EXE-BLEINX.EXE-KLUCKX.EXE-SONNEX.EXE-VELLX.EXE"
							   IF ValType(cFilename)=="C"
							 		cFilenameX := Stuff(cFilename,At(".",cFilename),1,LTrim(Str(nsegment))+"B.")
									FErase(cDatver+cFilenameX)
									loBmp:SaveFile( cDatver+cFilenameX , XBPBMP_FORMAT_JPG, XBPBMP_DEF_COMPRESSION)
									AAdd(aFileName, cFilenameX)
							   ENDIF
							ENDIF
//							//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
               GraSegClose( aPrinterPS[1] )
               AAdd( aSegments, nSegment )
               nSegment := GraSegOpen( aPrinterPS[1], GRA_SEG_MODIFIABLE )
//							//+23.06.2019 19:05
							//+28.06.2020 12:05 damit bei Trauerdruck nicht gemailt wird: "BL_BRF0-BL_BRF1-BL_BRF2-BL_FOTO"
							IF !Upper(cDru)$"BL_TERM-BL_BRF0-BL_BRF1-BL_BRF2-BL_FOTO-BL_KAS-BL_KAST-BL_KASK-BL_KATX" .AND. Upper(AppName())$"NOLTEX.EXE-MUELLX.EXE-BLEINX.EXE-KLUCKX.EXE-SONNEX.EXE-VELLX.EXE" .AND. ValType(cFilename) == "C"
////								loBmp := XbpBitmap():New():Create(aPrinterPS[1])
////			               loBMP:PresSpace(aPrinterPS[1])    // Bind the presentation space to the BMP
////								loBmp:Make( aPaper[1], aPaper[2],,24 )  // Set the size that you want it to be.
         aAttr[GRA_AA_COLOR] := GRA_CLR_WHITE
         aAttr[GRA_AA_BACKCOLOR] := GRA_CLR_BLACK
         GraSetAttrArea( aPrinterPS[1], aAttr )
         GraBox( aPrinterPS[1], {0,0}, {aPaper[1],aPaper[2]}, GRA_OUTLINEFILL )
	                  ENDIF
            ELSE
               IF !Empty( aSeitZ )     // GesamtSeitenZahl - Seitenzahlen bei Statistik-Drucken
                  FdrG( aPrinterPS, aFont, aPaper, AClone(aSeitZ[2]), ;
                              Trim( aSeitZ[3] ), aSeitZ[4], aSchrift, cAusR )
               ENDIF
               aPrinterPS[1]:device():newPage() // [1]!
            ENDIF
            ++nSeitNr
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>  hier wird der Briefkopf eingefgt  17.10.2005
//03.06.2019 17:44            Kopf2( aPrinterPS, aFont, aPaper, aPoSZ, aSchrift, aBlatt, aSegments, @nSegment, "F" ) /////////////////////
            Kopf2( aPrinterPS, aFont, aPaper, aPoSZ, aSchrift, aBlatt, aSegments, @nSegment, "F", loBMP, cFileName ) //03.06.2019 17:44///////////////////
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>
         ELSEIF Upper( cSeite ) == "R" .OR. Upper( cSeite ) == "V" .OR. Upper( cSeite ) == "K"
            AAdd( aRep, aBlattZ )
         ELSEIF cSeite = "G" .OR. cNA = "G" //.AND. cBriefKopf = "_"  // 12.6.2005 Test mit Grafiken im Bild
            IF ":"$cText   //22.07.2006 11:45 in cText steht Membervariable
               cGrafik := IIf( cText="&",&(SubStr(cText,2)),&cText)
            ELSE
               cText := IIf( cText="&",&(SubStr(cText,2)),cText)   // 17.09.2005
               cGrafik := IIf("."$cText,Trim(cText),Trim(cText)+".BMP")
            ENDIF
            oBitmap    := XbpBitmap():new():create( aPrinterPS[1] )
            // wenn in Zeile+Spalte -1 eingetragen ist (wie in bl_brf2),
            // muss in cFeld eine 4er Matrix sein, sonst nur eine 2er
            // (wenn in cFeld eine 2er Matrix steht, mssen Zeile+Spalte 
            //  die 1.+2.Stelle  der Matrix fr aBitRect bernehmen)
            // XbpPreview:autoscale bernimmt die Korrektur, von 2er auf 4er Matrix
            aBitSize      := &cFeld
            // 19.02.2008 21:18 Lagekorrektur, damit Grafik so liegt wie Text („hnlich TDruck)
//Arrayelemente von :paperSize()       Element:    Bedeutung:
//   LOCAL nXSize := aPaper[1]        //  1        Papierbreite  in 1/10 mm (= nXsize)
//   LOCAL nYSize := aPaper[2]        //  2        Papierh”he    in 1/10 mm (= nYsize)
//   LOCAL nLeftMargin := aPaper[3]   //  3        Linker Rand   in 1/10 mm (= nLeftMargin)
//   LOCAL nBottomMargin := aPaper[4] //  4        Unterer Rand  in 1/10 mm (= nBottomMargin)
//   LOCAL nRightMargin := aPaper[5]  //  5        Rechter Rand  in 1/10 mm (= nRightMargin)
//   LOCAL nTopMargin := aPaper[6]    //  6        Oberer Rand   in 1/10 mm (= nTopMargin)
//Die Werte fr die nicht bedruckbaren R„nder beziehen sich auf die linke,
//untere Ecke des Papiers. Fr das Papierformat A4 (2100, 2970) k”nnten die
//R„nder also folgende Koordinaten haben: 50, 50, 2050, 2920. In diesem
//Fall w„re der nicht bedruckbare Rand auf dem Papier ringsherum 5 mm breit.
               IF nTFont+nFFont==18
                  aBlattZ[10] := aBlattZ[10] + aPaper[3]
                  aBlattZ[9] := aBlattZ[9] + aPaper[2] - aPaper[6]
                  aBitSize[1] := aBitSize[1] + aPaper[3]
                  aBitSize[2] := aBitSize[2] + aPaper[2] - aPaper[6]
               ENDIF
            aBitRect      := IIf( aBlattZ[10]<0 .AND. aBlattZ[9]<0, &cFeld, ;
                              { aBlattZ[10], aBlattZ[9], aBitSize[1], aBitSize[2] } ) //17.09.2005
            IF Len(cGrafik)>100      //22.07.2006 11:47 >50 heiát:in cGrafik ist die Grafik
               oBitmap:setbuffer( cGrafik )          // Bitmap laden
            ELSE                    //22.07.2006 11:47 <50 heiát:in cGrafik ist der GrafikdateiName
               oBitmap:loadFile( IIf((cDatver[1]+":")$cGrafik, cGrafik, cDatver+cGrafik ) ) //+11.01.2009 11:38
//++////////////////////////////////////////////////////////////////////
//+29.09.2008 16:12 Experiment, um in der richtigen Gr”áe (1:1) zu drucken: (geglckt!)
               IF (cBriefkopf == "1:1" .OR. cFormular=="J") .AND. Upper(AppName())$"MUELLX.EXE-BLEINX.EXE-SCHIERX.EXE-KREMERX.EXE-RAGUSEX.EXE-NOLTEX.EXE-TDX.EXE-SCRAPX.EXE-KLUCKX.EXE-VELLX.EXE-GUDDX.EXE-VOGELX8.EXE-BARTX.EXE-SONNEX.EXE"   //29.11.2016 12:02
                //+29.09.2008 15:14: Resolution und Abmessung bestimmen:
                  IF ".JPG"$Upper(cGrafik)
                     nHandle := FOpen(cGrafik,FO_READ)
                     IF FRead(nHandle,@cBMBuffer,50) == 50
                        nResolution := Bin2I(SubStr(cBMBuffer,16,2))     //+ Aufl”sung in dpi
                        IF nResolution > 50
                           oBitmap:cargo := {oBitmap:xsize * 254 / nResolution, ;
                                             oBitmap:ysize * 254 / nResolution }   //+ Gr”áe in 1/10 mm
                        ELSE
                           oBitmap:cargo := {oBitmap:xsize,oBitmap:ysize}  // bisherige Zeile, wenn keine dpi-Info verfgbar
                        ENDIF
                        FClose(nHandle)
                     ENDIF
                  ELSEIF ".PNG"$Upper(cGrafik)  //+14.07.2014 17:14
                     nHandle := FOpen(cGrafik,FO_READ)
                     cBMBuffer += Space(50)
                     IF FRead(nHandle,@cBMBuffer,100) == 100
                        pHYs := At("pHYs",cBMBuffer)+6
                        nResolution := Bin2I(SubStr(cBMBuffer,pHYs+1,1)+SubStr(cBMBuffer,pHYs,1))     //+ Aufl”sung in Px/m (1m=10000* 1/10mm)
                        oBitmap:cargo := {oBitmap:xsize * 10000 / nResolution, ;
                                          oBitmap:ysize * 10000 / nResolution }   //+ Gr”áe in 1/10 mm
                        FClose(nHandle)
                     ENDIF
                  ELSE
                     nHandle := FOpen(cGrafik,FO_READ)
                     IF FRead(nHandle,@cBMBuffer,50) == 50
                        nResolution := Bin2I(SubStr(cBMBuffer,39,4))     //+ Aufl”sung in Px/m (1m=10000* 1/10mm)
                        oBitmap:cargo := {oBitmap:xsize * 10000 / nResolution, ;
                                          oBitmap:ysize * 10000 / nResolution }   //+ Gr”áe in 1/10 mm
                        FClose(nHandle)
                     ENDIF
                  ENDIF
               ENDIF
//++////////////////////////////////////////////////////////////////////
            ENDIF
            IF cLPTSCR $ "TD-AB"   // fr die Vorschau beim Trauerdruck
               IF cLPTSCR$"AB"
                  aBitRect := oEdit:ABVorschau:autoscale( aBitRect, oBitmap )   //16.11.2006 12:34
               ELSEIF cLPTSCR$"TD" .AND.!"xs"$oEdit:cDKT  // "xs" im Namen der Vorlage: Symbol kann verzerrt werden                  aBitRect := oEdit:TDVorschau:autoscale( aBitRect, oBitmap )   //16.11.2006 12:34
                  //+22.03.2009 21:41 Ausrichtung der Bilder:
                  nBild := 1           //+09.05.2009 17:38
                  IF "aFK["$cFeld
                     cT := SubStr(cFeld,At("aFK[",cFeld),5)
                     cHV := &("oEdit:"+cT+",6]")
                     nBild := Val(cT[5])    //+09.05.2009 17:38
                  ELSE
                     cHV := "22"
                  ENDIF
                  aBitRect := oEdit:TDVorschau:autoscale( aBitRect, oBitmap, cHV )   //16.11.2006 12:34
                  oEdit:aBD[nBild] := aBitRect      //+09.05.2009 17:37 BildDaten fr Textpositionierung
               ENDIF
            ELSEIF nTFont+nFFont==17      //22.02.2008 19:53
               aBitRect := aPrinterPS[1]:cargo:autoscale( aBitRect, oBitmap )   //16.11.2006 12:34
            ENDIF
            aSourceRect      := { 0, 0, oBitmap:xSize, oBitmap:ySize }  //21.10.2007 11:06
               IF Upper(AppName())$cAc //.AND. "PDF"$cDruckerName    //+03.06.2017 20:36
                  IF "PDF"$cDruckerName   //29.01.2018 20:47
                     aBitRect[1] += 10
                     aBitRect[2] += 42
                     aBitRect[3] += 10
                     aBitRect[4] += 42
                  ELSE
                     aBitRect[1] -= 12
                     aBitRect[2] += 10
                     aBitRect[3] -= 12
                     aBitRect[4] += 10
                  ENDIF                                  
               ENDIF                                  
               IF Upper(AppName())$"VELLX.EXE" .AND. "VellX_neu"$cGrafik    //+09.01.2018 09:38
                  aBitRect[1] -= aPaper[3]      // damit das Briefpapier als Grafik
                  aBitRect[2] -= aPaper[4]      // in Originalgr”áe
                  aBitRect[3] -= aPaper[3]      // ausgedruckt wird
                  aBitRect[4] -= aPaper[4]      //
               ENDIF                                  
            oBitmap:draw( aPrinterPS[1], aBitRect, aSourceRect,, GRA_BLT_BBO_IGNORE )

         //+29.06.2010 19:41 vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
         //+ platziert die Grafiken auf der Seite:
            IF Upper(AppName())$"MUELLX.EXE-BLEINX.EXE"
               IF aPrinterPS[1]:cargo:isvisible() .OR. cLPTSCR == "T"
                  IF Len(cGrafik) < 100
                     cBGImg := IIf((cDatver[1]+":")$cGrafik, cGrafik, cDatver+cGrafik )
                  ELSE
                     cNrImg := LTrim(StrX(Val(cNrImg)+1,2))
                     oBitmap:savefile( cBGImg := cDatver + 'Temp'+StrX(1->auftrnr)+cNrImg+'.jpg', XBPBMP_FORMAT_JPG )
                  ENDIF
                  IF Len(cBGImg) > 1 .AND. !"\."$cBGImg	//04.12.2022 09:24 keine leeren Bilder-Links
                     cHtml += '<div style="position:absolute; z-index:3; margin-left:'+LTrim(Str(aBitRect[1]))+'; margin-bottom:'+LTrim(Str(aBitRect[2]))+ CRLF
                     cHtml += '; width:'+LTrim(Str(aBitRect[3]-aBitrect[1]))+'mm; height:'+LTrim(Str(aBitRect[4]-aBitrect[2]))+'mm;">' + CRLF
                     cHtml += '<img src='+cBGImg+' width=100% height=100%></div>'+CRLF
                  ENDIF
                  //FWrite( nHandle_html, cHtml )
               ENDIF
            ENDIF
         //+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
         
         ELSEIF cSeite = "g" .OR. cNA = "g" //22.07.2006 11:23 Grafik als Variable

         ENDIF
         IF cSeite = "R" .OR. cSeite = "V"
            IF !(cNa = "2" .AND. !lFremd)

               nZwiSumme := Repdruck1G( aRep, cNa, AllTrim(cBereich), cCP, nt, cSeite, ;
                     aPrinterPS, aFont, aPaper, aPoSZ, aSchrift, aBlatt, aSegments, @nSegment, , loBMP, cFileName )

               &("nS"+cNa) := Round(nZwiSumme,2)
            ENDIF
            ASize( aRep, 0 )
         ELSEIF cSeite = "K"
            cBereich := IIf(SELECT()=4 .AND. Val(cbereich)<3,"4",cBereich)   // 08.03.2006
            aZwiSumme := Repdruck2G( aRep, cNa, AllTrim(cBereich), cCP, nt, cSeite, cText, ;
                  aPrinterPS, aFont, aPaper, aPoSZ, aSchrift, aBlatt, aSegments, @nSegment, , loBMP, cFileName )
            &("aS"+cNa) := aZwiSumme   // ist schon in aSum drin, kann also wohl weg?
            ASize( aRep, 0 )
         ELSEIF Upper( cSeite ) == "Z"
//    wird gebraucht fr Zwischensummen in RepDruck2G:Zwischen()
         ELSEIF Upper( cSeite ) == "M"    // druckt mehrzeilige Texte in notiz/&cF
            cF := cFeld
// die Ausrichtung in Prompt (in cAusR) geht vor der Ausrichtung im Text (in &cF)  21.07.2006 15:01
            IF !Empty(cF) .AND. ValType(&cF)=="C" .AND. Len(&cF)>0 .AND. ;
                     !cAusR$">^:" .AND. &cF[1]$">^:" //02.08.2006 12:52
               cAusR := &cF[1]
            ENDIF
            //+24.01.2009 10:07 Anordnung unter dem Bild beim Fotoseitendruck:
            cT := cText
            IF "{"$cT .AND. ValType(&cT) == "A"
               aPoSZ := {0,0}       //+02.08.2009 21:55
            ELSEIF cT[1] = "&"
               nZeiLen := Val(&(SubStr(cT,2)))
            ELSE
               nZeiLen := Val(cT)
            ENDIF
            //++//
               MemoDruck( aPrinterPS, aFont, aPaper, aPoSZ, IIf(Empty(cFeld),1->notiz,&cF), ;
                           Max(nFFont,1), aSchrift, @aSegments, @nSegment, aBlatt, ;
                           nZeiLen, ;
                           cAusR, nTFont, loBMP, cFileName )   //+06.08.2019 09:44 , loBMP, cFileName
         ELSEIF Upper( cSeite ) == "T"    //08.07.2007 22:11 Auftrag/Angebot/Rechnung als Vordruck
            cF := IIf(cFeld[1]="&",SubStr(cFeld,2),cFeld)
            IF ValType(&cF)="A" .AND. Month(DATE())<9 // ZEITSCHALTER zur Beobachtung!
               AEval( &cF, {|a,i| IIf( nFFont>0, FdrG( aPrinterPS, aFont, aPaper, {aPoSZ[1],++aPoSZ[2]}, ;
                     IIf(Empty(a),"",IIf("T"$cF,a,StrP(a,8,2))), nFFont, aSchrift, cAusR ), ) } )
            ENDIF
            IIf("T"$cF, {AFill(aET,""), AFill(aFT,"")}, {AFill(aEZ,0), AFill(aFZ,0)} )
         ELSEIF Upper( cSeite ) <> "R" .AND. Upper( cSeite ) <> "V" .AND. Upper( cSeite ) <> "K" ;
                      .AND. Upper( cSeite ) <> "G" .AND. Upper( cNA ) <> "G"    //16.11.2006 12:51 weil ja schon oben
           IF cSeite<>"2" .OR. (cSeite="2" .AND. cZweiSeitjn="2")
               IF Upper( cNa ) = "G" .AND. cBriefKopf = "_"  // 12.6.2005 Test mit Grafiken im Bild
                  IF ":"$cText   //22.07.2006 11:45 in cText steht Membervariable
                     cGrafik := IIf( cText="&",&(SubStr(cText,2)),&cText)
                  ELSE
                     cText := IIf( cText="&",&(SubStr(cText,2)),cText)   // 17.09.2005
                     cGrafik := IIf("."$cText,Trim(cText),Trim(cText)+".BMP")
                  ENDIF
                  oBitmap    := XbpBitmap():new():create( aPrinterPS[1] )
                  aBitSize      := &cFeld
                  aBitRect      := IIf( aBlattZ[10]<0 .AND. aBlattZ[9]<0, &cFeld, ;
                                    { aBlattZ[10], aBlattZ[9], aBitSize[1], aBitSize[2] } ) //17.09.2005
                  IF Len(cGrafik)>100      //22.07.2006 11:47 >50 heiát:in cGrafik ist die Grafik
                     oBitmap:setbuffer( cGrafik )          // Bitmap laden
                  ELSEIF (cDatver[1]+":")$cGrafik          //+19.11.2008 09:45
                     oBitmap:loadFile( cGrafik )          // Bitmap laden   18.11.2008 14:56
                  ELSE                    //22.07.2006 11:47 <50 heiát:in cGrafik ist der GrafikdateiName
                     oBitmap:loadFile( cDatver+cGrafik )          // Bitmap laden   18.11.2008 14:57
                  ENDIF
                  IF cLPTSCR $ "TD-AB"    // fr die Vorschau beim Trauerdruck
                     aBitRect := oEdit:TDVorschau:autoscale( {aBitRect[3],aBitRect[4]}, oBitmap )   //16.11.2006 12:34
                  ELSEIF nTFont+nFFont==17      //22.02.2008 19:54
                     aBitRect := aPrinterPS[1]:cargo:autoscale( {aBitRect[3],aBitRect[4]}, oBitmap )   //16.11.2006 12:34
                  ENDIF
                  aSourceRect      := { 0, 0, oBitmap:xSize, oBitmap:ySize }  // hierher 21.10.2007 11:05
                  //+29.12.2008 22:12 Positionierung der Grafik beim Trauerdruck:
                  IF cLPTSCR="TD" .AND. aPrinterPS[1]:setViewPort()[4]>2000 //+ wenn auf den Drucker ausgegeben wird
                     aBitRect[1] += nTDGeoX
                     aBitRect[2] += nTDGeoY
                     aBitRect[3] += nTDGeoX
                     aBitRect[4] += nTDGeoY
                  ENDIF
                  oBitmap:draw( aPrinterPS[1], aBitRect, aSourceRect,, GRA_BLT_BBO_IGNORE )  //21.10.2007 18:26
               ENDIF
            IF Upper( cNa ) = "Z"

               IF !Empty(nSegment)
//							//+02.06.2019 21:17 * * * T E S T * * *  fr Seite speichern
							//+28.06.2020 12:05 damit bei Trauerdruck nicht gemailt wird: "BL_BRF0-BL_BRF1-BL_BRF2-BL_FOTO"
							IF !Upper(cDru)$"BL_TERM-BL_BRF0-BL_BRF1-BL_BRF2-BL_FOTO-BL_KAS-BL_KAST-BL_KASK-BL_KATX" .AND. Upper(AppName())$"NOLTEX.EXE-MUELLX.EXE-BLEINX.EXE-KLUCKX.EXE-SONNEX.EXE-VELLX.EXE"
							   IF ValType(cFilename)=="C"
							 		cFilenameX := Stuff(cFilename,At(".",cFilename),1,LTrim(Str(nsegment))+"Z.")
									FErase(cDatver+cFilenameX)
									loBmp:SaveFile( cDatver+cFilenameX , XBPBMP_FORMAT_JPG, XBPBMP_DEF_COMPRESSION)
									AAdd(aFileName, cFilenameX)
							   ENDIF
							ENDIF
//							//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                  GraSegClose( aPrinterPS[1] )
                  AAdd( aSegments, nSegment )
                  nSegment := GraSegOpen( aPrinterPS[1], GRA_SEG_MODIFIABLE )
//							//+23.06.2019 19:05
							//+28.06.2020 12:05 damit bei Trauerdruck nicht gemailt wird: "BL_BRF0-BL_BRF1-BL_BRF2-BL_FOTO"
							IF !Upper(cDru)$"BL_TERM-BL_BRF0-BL_BRF1-BL_BRF2-BL_FOTO-BL_KAS-BL_KAST-BL_KASK-BL_KATX" .AND. Upper(AppName())$"NOLTEX.EXE-MUELLX.EXE-BLEINX.EXE-KLUCKX.EXE-SONNEX.EXE-VELLX.EXE" .AND. ValType(cFilename) == "C"
////								loBmp := XbpBitmap():New():Create(aPrinterPS[1])
////			               loBMP:PresSpace(aPrinterPS[1])    // Bind the presentation space to the BMP
////								loBmp:Make( aPaper[1], aPaper[2],,24 )  // Set the size that you want it to be.
         aAttr[GRA_AA_COLOR] := GRA_CLR_WHITE
         aAttr[GRA_AA_BACKCOLOR] := GRA_CLR_BLACK
         GraSetAttrArea( aPrinterPS[1], aAttr )
         GraBox( aPrinterPS[1], {0,0}, {aPaper[1],aPaper[2]}, GRA_OUTLINEFILL )

	                  ENDIF
               ELSE
                  IF !Empty( aSeitZ )     // GesamtSeitenZahl - Seitenzahlen bei Statistik-Drucken
                     FdrG( aPrinterPS, aFont, aPaper, AClone(aSeitZ[2]), ;
                                 Trim( aSeitZ[3] ), aSeitZ[4], aSchrift, cAusR )
                  ENDIF
                  aPrinterPS[1]:device():newPage() // [1]!
               ENDIF

					//+07.06.2019 22:03 neue Seite:
					IF Upper(AppName())$"MUELLX.EXE-BLEINX.EXE"
//			         cHtml := '</div><p style="margin: 0cm; page-break-before:always;">Seitentrennung-Blatt_Aufbau</p><div>' + CRLF
			         cHtml += '</div></body></html><html><head> </head><body>' + CRLF
			         cHtml += '<div style="position:absolute; z-index:2; width:210mm: height:297mm;">' + CRLF
				      //FWrite( nHandle_html, cHtml )
				   ENDIF

               ++nSeitNr
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>  hier wird der Briefkopf eingefgt  17.10.2005
//03.06.2019 17:40            Kopf2( aPrinterPS, aFont, aPaper, aPoSZ, aSchrift, aBlatt, aSegments, @nSegment, "F" ) /////////////////////
            Kopf2( aPrinterPS, aFont, aPaper, aPoSZ, aSchrift, aBlatt, aSegments, @nSegment, "F", loBMP, cFileName ) //03.06.2019 17:40///////////////////
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>

               LOOP
            ENDIF
             IF Upper(AppName()) != "AX.EXE" .AND. !IsMemVar("cLayout")      // 18.01.2008 14:44
               IF Upper( AppName() ) = "NOLTEX.EXE"
                  nGS := Round(nS1+nS2+nS3+nS4,2)
               ELSE
                  nGS := Round(nS1+nS2+nS3+nS4+nS5,2)
               ENDIF
               nGSA := Round(nS1+nS2-nS3,2)
               nGRS := Round(1->&r_b_0 + 1->&r_b_1 + 1->&r_b_2 + 1->&r_b_3,2)
               nGRSA := Round(nGRS-nS3,2)
               nGRSV := Round(nGRS-nSv,2)
               IF Upper( AppName() ) = "NOLTEX.EXE"
                  nGSN := Round(1->&r_b_1 + 1->&r_b_n + nS2 - nSv,2)
               ENDIF
               IF xdmeu == "D"
                  nGSh := Round(nGS/xFaktor,2)
                  nGSAh:= Round(nGSA/xFaktor,2)
                  nGRSh := Round(nGRS/xFaktor,2)
                  nGRSAh:= Round(nGRSA/xFaktor,2)
                  nGRSVh:= Round(nGRSV/xFaktor,2)
                  IF Upper( AppName() ) = "NOLTEX.EXE"
                     nGSNh := Round(nGSN/xFaktor,2)
                  ENDIF
                  nS1h := Round(nS1/xFaktor,2)
                  nS2h := Round(nS2/xFaktor,2)
                  nS3h := Round(nS3/xFaktor,2)
               ELSE
                  nGSh := Round(nGS*xFaktor,2)
                  nGSAh:= Round(nGSA*xFaktor,2)
                  nGRSh := Round(nGRS*xFaktor,2)
                  nGRSAh:= Round(nGRSA*xFaktor,2)
                  nGRSVh:= Round(nGRSV*xFaktor,2)
                  IF Upper( AppName() ) = "NOLTEX.EXE"
                     nGSNh := Round(nGSN*xFaktor,2)
                  ENDIF
                  nS1h := Round(nS1*xFaktor,2)
                  nS2h := Round(nS2*xFaktor,2)
                  nS3h := Round(nS3*xFaktor,2)
               ENDIF
             ENDIF
             //22.10.2006 18:02 zB: cFeld='aSchart:="10.Dings"' (d.h. kein Druck) :
            IF ValType(cFeld)=="C" .AND. ":="$cFeld .AND. Upper(cFeld) != "IIF" .AND. cFeld != "&"
               cF1 := Left(cFeld,At(":=",cFeld)-1)
               cF2 := LTrim(SubStr(cFeld,At(":=",cFeld)+2))
               &cF1 := &cF2
            ELSEIF !Empty(cFeld)      //cFeld <> NIL
		               IF Upper( AppName() ) $ "DOENNEX.EXE" .or. cKomma = ","			//22.08.2023 09:54 wieso nicht cKomma == ","	?????? 22.08.2023 09:54
                  cFeld := IIf( Valtype( cFeld ) == "C", ;
                         IIf( cFeld="&", ;
                         IIf( Valtype( &(substr( cFeld,2,len(cFeld)-1 )))=="N", ;
                         Transform( &(substr( cFeld,2,len(cFeld)-1 )), cPicture ), ;
                         &(substr( cFeld,2,len(cFeld)-1 )) ), ;
                         cFeld ), cFeld )
                ELSE
                  cFeld := IIf( Valtype( cFeld ) == "C", ;
                         IIf( cFeld[1]="&", ;
                         IIf( Valtype( &(substr( cFeld,2,len(cFeld)-1 )))=="N", ;
                         Str( &(substr( cFeld,2,len(cFeld)-1 )),8,2 ), ;
                         &(substr( cFeld,2,len(cFeld)-1 )) ), ;
                         cFeld ), cFeld )
                ENDIF
               DO CASE
                  CASE Valtype( cFeld ) == "C"
                     IIf( Len(Trim(cText))>0 .AND. cText <> "&" .AND. nTFont>0, ;
                                FdrG( aPrinterPS, aFont, aPaper, aPoSZ, ;
                                       Trim( cText ), nTFont, aSchrift, cAusR ), )
                     IIf( nFFont>0, FdrG( aPrinterPS, aFont, aPaper, aPoSZ, ;
                                          Trim( cFeld ), nFFont, aSchrift, cAusR ), )
                  CASE Valtype( cFeld ) == "N"
                     IIf( Len(Trim(cText))>0 .AND. cText <> "&" .AND. nTFont>0, ;
                                FdrG( aPrinterPS, aFont, aPaper, aPoSZ, ;
                                       Trim( cText ), nTFont, aSchrift, cAusR ), )
                     IF Upper( AppName() ) $ "DOENNEX.EXE" .or. cKomma = ","
                        IIf( nFFont>0, FdrG( aPrinterPS, aFont, aPaper, aPoSZ, ;
                                 Trim( Transform( cFeld, cPicture ) ), nFFont, aSchrift, cAusR ), )
                     ELSE
                        IIf( nFFont>0, FdrG( aPrinterPS, aFont, aPaper, aPoSZ, ;
                                             Trim( Str( cFeld,8,2 ) ), nFFont, aSchrift, cAusR ), )
                     ENDIF
                  CASE Valtype( cFeld ) == "D"
                     IIf( Len(Trim(cText))>0 .AND. cText <> "&" .AND. nTFont>0, ;
                                FdrG( aPrinterPS, aFont, aPaper, aPoSZ, ;
                                       Trim( cText ), nTFont, aSchrift, cAusR ), )
                     IIf( nFFont>0, FdrG( aPrinterPS, aFont, aPaper, aPoSZ, ;
                                          DtoC( cFeld ), nFFont, aSchrift, cAusR ), )
                  CASE Empty(cFeld) //cFeld == NIL   // es soll sich nichts bewegen, wenn nichts zu drucken
               ENDCASE
            ELSEIF cText!="#"    // 22.08.2004  ï#ï bedeutet: Zeile wird nicht gedruckt + kein LF
// bei Kremer zuerst eingefhrt fr Schlusszeilen der Abrechnung:'#' berschreiben, damit Zeile gedruckt wird
               IIf( nTFont>0, FdrG( aPrinterPS, aFont, aPaper, aPoSZ, ;
                                    Trim( cText ), nTFont, aSchrift, cAusR ), )
            ENDIF
           ENDIF
         ENDIF
      NEXT
      nLetzteZeile := aPoSZ[2]
   IF cPrompt = "Seitenn" .AND. !Empty(nSegment)   // in der letzten Zeile der bl_xx
      ASize( aSeitZ, 4 )
      aSeitZ[1] := Len(aSegments)+1 // +1, weil nach dem Return noch ein Segment addiert wird
      aSeitZ[2] := AClone( aPoSZ )
      aSeitZ[3] := cFeld                                 // in cNA steht der Font fr Seitennr.
      aSeitZ[4] := IIf( IsMemVar("cStandardFont"), Val(cStandardFont), Val( cNa ) )
   ENDIF
   cPicture := cOldPic
	//+28.06.2020 12:05 damit bei Trauerdruck nicht gemailt wird: "BL_BRF0-BL_BRF1-BL_BRF2-BL_FOTO"
   IF !Upper(cDru)$"BL_TERM-BL_BRF0-BL_BRF1-BL_BRF2-BL_FOTO-BL_KAS-BL_KAST-BL_KASK-BL_KATX" .AND. Upper(AppName())$"NOLTEX.EXE-MUELLX.EXE-BLEINX.EXE-KLUCKX.EXE-SONNEX.EXE-VELLX.EXE" .AND. ValType(cFilename) == "C"
 		cFilenameX := Stuff(cFilename,At(".",cFilename),1,LTrim(Str(nsegment))+"_.")
		FErase(cDatver+cFilenameX)
		loBmp:SaveFile( cDatver+cFilenameX , XBPBMP_FORMAT_JPG, XBPBMP_DEF_COMPRESSION)
		AAdd(aFileName, cFilenameX)
		cFilename := aFileName		//+30.06.2019 13:21 gibt die gesammelten cFilenameX zurck an ::savepage
   ENDIF

RETURN
//-----------------------------------------------------------------------

FUNCTION Formular( aBG, cDatei )    // baut das Briefkopf-Formular, z.B. bl_fbk auf
      IF 1->(IsFieldVar("perskz")) .OR. Upper(AppName())$"RUDOX.EXE-BERGX.EXE"           // 8.2.2005
         DbUseArea( ,"SDFNTX", "bl_.tak", "bv", .T. )           // bereits in Area 20
         OrdListAdd("xBlFName")          // 8.2.2005: weil schon in ineux geindext
         DbSetScope( SCOPE_BOTH, PadR(Upper(cDatei),8) )
         DbGotop()
      ELSE
         USE &cDatei          // die bisherige Originalzeile // 8.2.2005
      ENDIF
   nA := Alias()
   DO WHILE .NOT. Eof()
      AAdd( aBG, { Trim( &nA->seite ), Trim( &nA->na ), Trim( &nA->prompt ), &nA->text, &nA->tfont, ;
                           &nA->bereich, Trim( &nA->feld ), &nA->ffont, &nA->zeile, &nA->spalte }) //, RecNo() )  // 8.2.2005
      SKIP
   ENDDO
   DbCloseArea()
RETURN aBG
//-----------------------------------------------------------------------
//-----------------------------------------------------------------------
