// BLATTDRGS.prg         - gibt eine Druckseite (mit Vorschau) aus - im SCRAPX
// 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
#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, bBlock )  //+13.07.2009 19:31 bBlock, erst wenn fertig anzeigen
LOCAL oPrinterPS, oFont, oBitMap, aBitSize, aBitRect, nRec
LOCAL nOldArea := Select(), cKommaOld := cKomma
LOCAL aSchrift := {}, 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_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 
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 }, aSum := Array(22)
   AFill(aSum,0)
cCP := IIf(SET(43)==0,"A",cCP)  //03.12.2006 22:07       CODE-Page
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 := IIf(IsFieldVar("anummer"),FIELD->anummer,"")      //*10.07.2008 12:08 nur zur Beruhigung: 21 ist Anlief.dbf in oScan
PRIVATE cZeiMax := "95", cZwiSpalte := "50", cZeiZ := 70 //28.01.2008 19:18
PRIVATE nA, cZwiSaldo := "n"
PRIVATE cZwi := "Im Rechnungsbetrag ist die gesetzliche Mehrwertsteuer"
PRIVATE 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, nKomma := 0   //09.05.2007 08:35
PRIVATE aVZ := {}       //03.07.2007 22:01 in V3 bernimmt die aktuellen Zahlungen fr nt
//nOrientierung := IIf( nOrientierung = 2, 2, 1 ) // 1 = Portrait = default  // 3.5.2004
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
nOrientierung := IIf( nOrientierung<3, nOrientierung, nOrientierung-2 ) //02.10.2006 15:55
cBriefKopf := IIf( Empty(cBriefKopf),"n", cBriefKopf )   //14.11.2006 12:44 

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
IF Used()      //+25.09.2009 18:07
   DbSuspendNotifications()
   nRec := (nOldArea)->(RecNo())    //25.09.2007 17:45
ENDIF
IF Empty(cDruckerName)  // 10.04.2006
   cDruckerName := DruckerWahl(1)         //+16.06.2009 09:26 holt sich den Standarddrucker
ENDIF
/*  Struktur von Drupar:
               { "DRUCKER"   , "C", 60, 0 }, ;
               { "POSX"      , "N",  6, 1 }, ;
               { "POSY"      , "N",  6, 1 }, ;
               { "ZEILEPIX"  , "N",  3, 0 }, ;
               { "SPALTEPIX" , "N",  3, 0 }, ;
               { "DFONT1"    , "C", 30, 0 }, ;
               { "DFONT2"    , "C", 30, 0 }, ;
               { "DFONT3"    , "C", 30, 0 }, ;
               { "DFONT4"    , "C", 30, 0 }, ;
               { "DFONT5"    , "C", 30, 0 }, ;
               { "DFONT6"    , "C", 30, 0 }, ;
               { "DFONT7"    , "C", 30, 0 }, ;
               { "D01"       , "C",  5, 0 }, ;
               { "D02"       , "C",  5, 0 }, ;
               { "D03"       , "C",  5, 0 }, ;
               { "D04"       , "C",  5, 0 }, ;
               { "D05"       , "C",  5, 0 }, ;
               { "D06"       , "C",  5, 0 }, ;
               { "D07"       , "C",  5, 0 }, ;
               { "D08"       , "C",  5, 0 }, ;
               { "D09"       , "C",  5, 0 }, ;
               { "D10"       , "C",  5, 0 }, ;
               { "D11"       , "C",  5, 0 }, ;
               { "D12"       , "C",  5, 0 }, ;
               { "D13"       , "C",  5, 0 }, ;
               { "D14"       , "C",  5, 0 }, ;
               { "D15"       , "C",  5, 0 } ;
*/
SELECT 20
USE Drupar
//* Schriften von Hand eingegeben:
   AAdd( aSchrift, Trim( 20->DFont1 ) )
   Aadd( aSchrift, Trim( 20->DFont2 ) )
   Aadd( aSchrift, Trim( 20->DFont3 ) )
   Aadd( aSchrift, Trim( 20->DFont4 ) )
   Aadd( aSchrift, Trim( 20->DFont5 ) )
   Aadd( aSchrift, Trim( 20->DFont6 ) )
   Aadd( aSchrift, Trim( 20->DFont7 ) )
   nPoffY := 20->PosY
   nPoffX := 20->PosX
   nPpZ := 20->ZeilePix
   nPpS := 20->SpaltePix

USE
//16.05.2007 18:48 aus FDrG()/DbDruDys.prg hierher verschoben:
   IF Len(aSchrift[1]) = 0             //16.05.2007 18:47 falls Drupar.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]

//   IF File( cDatei+"p.dbf" )
//      USE &(cDatei+"p")          //+02.09.2013 10:49 Aufbau aus der bl_*p.dbf
//   ELSE
      // 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()
//   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
//      cText := IIf( 20->Text="&", IIf(ValType(&(SubStr( 20->text, 2)))=="B",Eval(&SubStr( 20->text, 2)), ;
//         &(Trim( Substr( 20->text, 2, 69 ) ) )), 20->text )
      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) )

   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"
   ENDIF

//   IF File( cDatei+".dbf" )
//      USE &(cDatei)          //+02.09.2013 10:49 Aufbau aus der bl_*.dbf
//   ELSE
      // 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()
//   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" .OR. cNa == "w") .AND. cBereich = "v" .AND. Upper(cSeite)!="V"// Variable soll editiert werden	//26.12.2020 12:20 w
         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
	         IF cNa == "w" .AND. Empty(cFeld) 	//+26.12.2020 12:21 kein Zeilenvorschub, wenn Feld leer ist
	         	nZei := 0
	         ENDIF
            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 ---/===
//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

//////////////////////////////////////////////////////////////
//   IF cLPTSCR = "A"    // fr die Vorschau beim Trauerdruck     T->A ist aber hier (SCRAPX) immer!
      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
      IF Used()      //+25.09.2009 18:07
         (nOldArea)->(DbGoto(nRec))    //25.09.2007 17:45
         DbResumeNotifications()
      ENDIF
//24.01.2008 22:15 erst am Ende des TD! :      cLPTSCR := "S"
      RETURN NIL
/*
//   ELSE
//      BPreview( aBlattG, oDlg1, cCP, aSchrift, aParamG, nOrientierung ) // 3.5.2004
//   ENDIF
   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"                                        //
      RETURN NIL                                            //
   ENDIF                                                    //
//   IF Upper(AppName())$"HANELX.EXE-RAGUSEX.EXE-SONNEX.EXE-BUCKX.EXE-FLUESX.EXE-BERGX.EXE-KOMPAKTX.EXE"+cAc
      nGS := 0
//   ELSE
//      nGS := BlattDruck( aBlattG, oDlg1, cCP, aSchrift, nOrientierung ) // 3.5.2004
//   ENDIF
//   20->(DbCloseArea())
//////////////////////////////////////////////////////////////

   SELECT &nOldArea     // fr alle F„lle
   cKomma := cKommaOld
   (nOldArea)->(DbGoto(nRec))    //25.09.2007 17:45
   DbResumeNotifications()
   cLPTSCR := "S"
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 )
   LOCAL dummy2 := GraSegDrawMode( oPrinterPS, GRA_DM_RETAIN )
   LOCAL nSegment := GraSegOpen( oPrinterPS )
   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
   PRIVATE nKapit := -2
   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()
//* wozu?   nAnz := IIf( IIf(IsMemVar("cAnz").AND.!Empty(cAnz), Val( cAnz ), nAnzahl )
//-- 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 )
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
//         cBriefkopf := IIf("."$cBriefKopf,cBriefKopf,cBriefKopf+".BMP")
         oBitmap    := XbpBitmap():new():create( aPrinterPS[1] )
         aBitSize      := aPrinterPS[1]:device():paperSize()
         aBitRect      := { 0, 0, aBitSize[5]-aBitSize[3], aBitSize[6]-aBitSize[4] }
//////         aBitRect      := { 0, 0, aBitSize[1], aBitSize[2] }
         IF Len(cBriefKopf)>100      //22.07.2006 11:47 >50 heiát:in cGrafik ist die Grafik
            oBitmap:setbuffer( cBriefKopf )          // Bitmap laden
         ELSE                    //22.07.2006 11:47 <50 heiát:in cGrafik ist der GrafikdateiName
            oBitmap:loadFile( cBriefKopf )          // Bitmap laden
         ENDIF
//         oBitmap:loadFile( cBriefKopf )          // Bitmap laden
      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[1], aBitSize[2] }
            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      := { 0, 0, aBitSize[1], aBitSize[2] }
            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
//      USE       // geremt am 8.2.2005
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 )

FUNCTION RepDruck1G( aRep, cNa, cArea, cCP, nt, cRAV, aPrinterPS, aFont, aPaper, aPoSZ, ;
                           aSchrift, aBlatt, aSegments, nSegment )
   LOCAL nOldArea := Select(), nRec, nZeiold, nSpaold, nZeile := -1
   LOCAL cSeite, cPrompt, cText, nTFont, cBereich, cFeld, nFFont, cF, cAusR   // 7.7.2005 Ausrichtung
   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
   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
         IF cBereich = "v"
            cF := &cFd
         ELSE
            cF := ((&cB)->(&cFd))
         ENDIF
// 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
            FdrG( aPrinterPS, aFont, aPaper, aPoSZ, ;
                  "Zwischensumme", 1, 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 ), 1, aSchrift ) // Betragspalte 30.04.2007 11:47
            Kopf2( aPrinterPS, aFont, aPaper, aPoSZ, aSchrift, aBlatt, aSegments, @nSegment ) /////////////////////
            aPoSZ[2] := aPoSZ[2] + 2
            aPoSZ[1] := IIf(Empty(cZwiSpalte),50,Val(cZwiSpalte)-16)  // 29.1.04
            FdrG( aPrinterPS, aFont, aPaper, aPoSZ, ;
                  "šbertrag", 1, 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 ), 1, 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 )

PROCEDURE Kopf2( aPrinterPS, aFont, aPaper, aPoSZ, aSchrift, aBlatt, aSegments, nSegment, cS )
   LOCAL cFK, nFFont, nTFont, cText, cFeld, cBereich, ccFeld, i
   LOCAL aBlattZ, cSeite, cNa, cPrompt, cAusR   // 7.7.2005 Ausrichtung
   LOCAL aBitSize, aBitRect, aSourceRect, cGrafik
   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
            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)
                 GraSegClose( aPrinterPS[1] )
                  AAdd( aSegments, nSegment )
                  nSegment := GraSegOpen( aPrinterPS[1], GRA_SEG_MODIFIABLE )
               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
            Kopf2( aPrinterPS, aFont, aPaper, aPoSZ, aSchrift, aBlatt, aSegments, @nSegment, "F" ) /////////////////////
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>
               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)>50      //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( cGrafik )          // Bitmap laden
               ENDIF
               aSourceRect      := { 0, 0, oBitmap:xSize, oBitmap:ySize }  // hierher 21.10.2007 11:05
               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

FUNCTION RepDruck2G( aRep, cNa, cArea, cCP, nt, cRAV, cBedingung, ;
                  aPrinterPS, aFont, aPaper, aPoSZ, aSchrift, aBlatt, aSegments, nSegment )
   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."
   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
         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=1 .AND. !cHeute$DtoC((cArea)->datum)+"XX.XX." .AND. Upper(cZwiSaldo) = "J"  // wenn anderes Datum als Vorzeile****
               nZeiOld := aPoSZ[2] + 1
               nSpaOld := aPoSZ[1]
               Zwischen( aPrinterPS, aFont, aPaper, @aPoSZ, aSchrift, aBlatt, aSegments, @nSegment ) /////////////////////
               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]
            Kopf2( aPrinterPS, aFont, aPaper, aPoSZ, aSchrift, aBlatt, aSegments, @nSegment ) /////////////////////
            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 )
            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

//+21.06.2009 13:49++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//+ mit a/A in cSeite fr Wiederholungsdruck von Array-Variablen (statt Field)
FUNCTION RepArray( aRep, cNa, cArea, cCP, nt, cRAV, cBedingung, ;
                  aPrinterPS, aFont, aPaper, aPoSZ, aSchrift, aBlatt, aSegments, nSegment )
   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."
   PRIVATE cB, cFd   // wegen Makros
//////   PRIVATE cFilter := IIf(!Empty(cBedingung),cBedingung,"") // weil Makro PRIVATE braucht!
   nMSum := 0
   ASize(aSum,Len(aRep))
   AFill(aSum,0)
// BL_TAG  a ^  ;  v aZeile[2,1]  ;    8  -1.3   8.0
// BL_TAG  a >  ;  v aZeile[1,21] ;    8  -0.7   5.0
   FOR nZeile := 1 TO Len(oEdit:aB) 
      aZeile := Array(2)
      aZeile[1] := oEdit:aB[nZeile]
      aZeile[2] := IIf(Len(oEdit:aG)=Len(oEdit:aB),oEdit:aG[nZeile],"")
      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 := 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 Len(cFeld)=0
            LOOP
         ENDIF
         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=1 .AND. !cHeute$DtoC((cArea)->datum)+"XX.XX." .AND. Upper(cZwiSaldo) = "J"  // wenn anderes Datum als Vorzeile****
//               nZeiOld := aPoSZ[2] + 1
//               nSpaOld := aPoSZ[1]
//               Zwischen( aPrinterPS, aFont, aPaper, @aPoSZ, aSchrift, aBlatt, aSegments, @nSegment ) /////////////////////
//               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]
            Kopf2( aPrinterPS, aFont, aPaper, aPoSZ, aSchrift, aBlatt, aSegments, @nSegment ) /////////////////////
            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 )
            CASE Valtype( cF ) == "C"
               IIf( nFFont>0, FdrG( aPrinterPS, aFont, aPaper, aPoSZ, ;
                                    Trim( cF ), nFFont, aSchrift, cAusR ), )
               aSum[k] = IIf( KWert(cF)!=0, aSum[k]+KWert(cF), aSum[k] )   //+15.07.2009 10:09 KWert! Komma!!
            CASE Valtype( cF ) == "N"
               IF cF <> 0 .AND. ;
                     ( Upper( cRAV ) = "R" .OR. Upper( cRAV ) = "V" .OR. Upper( cRAV ) = "K" .OR. Upper( cRAV ) = "A" )
                  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
   NEXT
////      SKIP
////   ENDDO
//////   DbClearFilter()
//////   GO nRec     //********
//////   SELECT &nOldArea
RETURN aSum

// wird fr RepDruck2 gebraucht (Statistik-Listings)
PROCEDURE Zwischen( aPrinterPS, aFont, aPaper, aPoSZ, aSchrift, aBlatt, aSegments, nSegment )
   LOCAL cFK, nFFont, nTFont, cText, cFeld, cBereich, ccFeld, cAusR  // 7.7.2005 Ausrichtung
   LOCAL aBlattZ, cSeite, cNa, cPrompt
      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)
                 GraSegClose( aPrinterPS[1] )
                  AAdd( aSegments, nSegment )
                  nSegment := GraSegOpen( aPrinterPS[1], GRA_SEG_MODIFIABLE )
               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, 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


// in TFont steht nZAb: Anzahl der Zeilen pro LF 24.09.2006 15:24
FUNCTION MemoDruck( aPrinterPS, aFont, aPaper, aPoSZ, cString, nMFont, aSchrift, aSegments, nSegment, aBlatt, nZeiLen, cAusR, nZAb )
   LOCAL nSpaS := aPoSZ[1], cLine, i, nCRLF, nOldArea := SELECT(), j:=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))/12*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
   // wenn beim Trauerdruck nichts gedruckt werden soll, dann auch kein Zeilenvorschub:
         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), 95 )  //04.11.2006 14:57
            ++nSnr
            nZeiOld := aPoSZ[2]
            nSpaOld := aPoSZ[1]
            IF ValType(aBlatt)=="A"
               Kopf2( aPrinterPS, aFont, aPaper, aPoSZ, aSchrift, aBlatt, aSegments, @nSegment )
            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
//------------------------------------------
PROCEDURE Blatt_Aufbau( aPrinterPS, aFont, aPaper, aPoSZ, aSchrift, aBlatt, cCP, aSegments, nSegment )
   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
   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 )
   FOR i := 11 TO 30
      &("i"+Str(i,2,0)) := "0"
   NEXT
   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] )
//************************************************************************************
// 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. Upper( cSeite ) == "A" .OR.;     //+21.06.2009 13:38
                     (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*/
//            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)
               GraSegClose( aPrinterPS[1] )
               AAdd( aSegments, nSegment )
               nSegment := GraSegOpen( aPrinterPS[1], GRA_SEG_MODIFIABLE )
            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 AlertBox( , "<JA> = fertig;"        + ;
                       ";", ;
                       { "JA" , "_NEIN" }  , ;
                       XBPSTATIC_SYSICON_ICONWARNING    , ;
                       "Formular umdrehen!" ) = 1     //+13.11.2009 19:02
//            DO WHILE ConfirmBox( oCB, "fertig?", ;
//                        "Formular umdrehen!", ;
//                        XBPMB_YESNO, ;
//                        XBPMB_QUESTION ) == XBPMB_RET_NO
            ENDDO
         ELSEIF Upper( cSeite ) = "B"
            IF !Empty(nSegment)
               GraSegClose( aPrinterPS[1] )
               AAdd( aSegments, nSegment )
               nSegment := GraSegOpen( aPrinterPS[1], GRA_SEG_MODIFIABLE )
            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
            Kopf2( aPrinterPS, aFont, aPaper, aPoSZ, aSchrift, aBlatt, aSegments, @nSegment, "F" ) /////////////////////
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>
         ELSEIF Upper( cSeite ) == "R" .OR. Upper( cSeite ) == "V" .OR. Upper( cSeite ) == "K" .OR. Upper( cSeite ) == "A" //+21.06.2009 13:39
            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)>99      //22.07.2006 11:47 >99 heiát:in cGrafik ist die Grafik
               oBitmap:setbuffer( cGrafik )          // Bitmap laden
            ELSE                    //22.07.2006 11:47 <99 heiát:in cGrafik ist der GrafikdateiName
               oBitmap:loadFile( cGrafik )          // Bitmap laden
            ENDIF
//++////////////////////////////////////////////////////////////////////
//+29.09.2008 16:12 Experiment, um in der richtigen Gr”áe (1:1) zu drucken: (geglckt!)
               IF cBriefkopf == "1:1" .AND. Upper(AppName())$"MUELLX.EXE-BLEINX.EXE-SCHIERX.EXE-KREMERX.EXE-RAGUSEX.EXE-NOLTEX.EXE-TDX.EXE-SCRAPX.EXE"
                //+29.09.2008 15:14: Resolution und Abmessung bestimmen:
                  IF ".JPG"$Upper(cGrafik)
                     oBitmap:cargo := {oBitmap:xsize,oBitmap:ysize}
                  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
//++////////////////////////////////////////////////////////////////////
            IF cLPTSCR = "A"   // fr die Vorschau beim Trauerdruck  T->A
//               IF !"xs"$oEdit:cDKT  // "xs" im Namen der Vorlage: Symbol kann verzerrt werden
                  aBitRect := oEdit:ABVorschau:autoscale( aBitRect, oBitmap )   //16.11.2006 12:34
//               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
            oBitmap:draw( aPrinterPS[1], aBitRect, aSourceRect,, GRA_BLT_BBO_IGNORE )
         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 )
               &("nS"+cNa) := Round(nZwiSumme,2)
            ENDIF
            ASize( aRep, 0 )
         ELSEIF cSeite = "A"        //+21.06.2009 13:36 Array mit Wiederholungsdruck
            RepArray( aRep, cNa, AllTrim(cBereich), cCP, nt, cSeite, cText, ;
                  aPrinterPS, aFont, aPaper, aPoSZ, aSchrift, aBlatt, aSegments, @nSegment )
         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 )
            &("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
               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 )   //17.10.2006 13:51
         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 ) <> "A" ;
                      .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)>50      //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( cGrafik )          // Bitmap laden
                  ENDIF
                  IF cLPTSCR = "A"    // fr die Vorschau beim Trauerdruck T->A
                     aBitRect := oEdit:ABVorschau: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
                  oBitmap:draw( aPrinterPS[1], aBitRect, aSourceRect,, GRA_BLT_BBO_IGNORE )  //21.10.2007 18:26
               ENDIF
            IF Upper( cNa ) = "Z"
               IF !Empty(nSegment)
                  GraSegClose( aPrinterPS[1] )
                  AAdd( aSegments, nSegment )
                  nSegment := GraSegOpen( aPrinterPS[1], GRA_SEG_MODIFIABLE )
               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
            Kopf2( aPrinterPS, aFont, aPaper, aPoSZ, aSchrift, aBlatt, aSegments, @nSegment, "F" ) /////////////////////
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>
               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. Len(cFeld)>2 .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 = ","
                  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
//  wird schon oben gemacht!!                   aPoSZ[2] := IIf( aBlattZ[9]<1, aPoSZ[2]+aBlattZ[9], aPoSZ[2] )
               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
   // 13.12.2012 21:39 Test wegen Garbage:
   IF oBitmap!=NIL .AND. oBitmap:isDerivedFrom("XbpBitmap")
      oBitmap:destroy()
      oBitmap := NIL
   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
//-----------------------------------------------------------------------
//-----------------------------------------------------------------------
