Drucken mit HBPrinter - Beispiel Umstellung von ? ...

Moderator: Moderatoren

Antworten
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Drucken mit HBPrinter - Beispiel Umstellung von ? ...

Beitrag von brandelh »

Hi,

ich habe jetzt mein letztes Programm auf Windows Druck umgestellt (mein eigenes privates Haushaltsprogramm),
ich war es einfach leid immer die Drucker auf LPT zuordnen zu müssen ... also los.

Erstes Beispiel, aus einer Kontenübersicht kann man diese Liste drucken, wobei die Liste neu in der DBF gesucht wird:

Code: Alles auswählen

procedure kont_druck( konto , bis_dat ) && Parameter Kontonummer
local mk_nr,m_soll,m_haben,m_s_saldo,m_h_saldo
local win,seite,z,saldo:=.f.,kontinfo,kontname,tmp_bnr,tmp_txt, af[12], x
if empty( dru_aktiv )
   meldung(12,"F",{"Kein Druckertreiber aktiv !","Sie müssen zuerst im Menu 'Drucken'","einen Druckertreiber auswählen"})
   return
endif
m_soll:=m_haben:=m_s_saldo:=m_h_saldo:=0
for x := 1 to 12
    af[x] := f[x]
    f[x]  := .f.
next

f[3]=.t.
do funk_tast
setprc(0,0)
seek konto
set printer to (DRU_SCHNIT)
set printer on
set cons off

seite=1

select kontplan
seek konto
kontinfo=kontplan->k_info
kontname=kontplan->k_name
select konten

do while .t.
   meldung(12,"H",{"Bitte Drucker vorbereiten.","Wenn der Drucker bereit ist, bitte Taste drücken..."})
   if isprinter()
      exit
   endif
enddo

begin sequence

?? dru_init+dru_grund
win=zeigen(12,"H",{"Seite: "+alltrim(str(seite))+" wird gedruckt."})
do while .t.
   if inkey()=K_F3
      if ask(16,"Druck wirklich <A>bbrechen, oder <W>eiter drucken?","<")="A"
         ?? dru_rueck
         break
      endif
   endif
   if prow()=0                               && Kopfzeile drucken
      for z=1+dru_obraof to 3
        ? dru_z10
      next
      ?? space(dru_rand)+"Konto: "+dru_fett_1+konto+"  "+kontname+dru_fett_0+" ("+alltrim(kontinfo)+")"+dru_cr+space(67)+"Seite:"+str(seite,3)
      ?
      ?  space(dru_rand)+"Stand:",if(DATE()<=bis_dat,date(),bis_dat)
      ?
      ? space(dru_rand)+dru_z12+"Buch- Gegenkonto-     Beleg-   Buchungssatzinformation"+space(7)+"SOLL      |     HABEN"+ dru_z10
      ? space(dru_rand)+dru_z12+"nr.   nr.  name       datum                           "+space(7)+ZeigWaehrung()+"       |        "+ZeigWaehrung()+ dru_z10
      ? space(dru_rand)+dru_z12+replicate("-",71)+"|"+replicate("-",10)+dru_z10
      if seite > 1
         ? space(dru_rand)+dru_z12+"Übertrag"+space(53)+nichtnull(m_soll,10,"@e ###,###.##")+"|"+nichtnull(m_haben,10,"@e ###,###.##")+dru_z10
      endif
   endif
   if prow()+dru_obraof+1 > min(dru_maxzei-2,64)       && Nächste Seite ??
      if konten->k_nr==konto            && weitere Datensätze vorhanden
         ? space(dru_rand)+dru_z12+replicate("-",71)+"|"+replicate("-",10)+dru_z10
         ? space(dru_rand)+dru_z12+"Zwischensumme"+space(48)+transform(m_soll,"@e ###,###.##")+"|"+transform(m_haben,"@e ###,###.##")+dru_z10
         seite++
         eject
         do while ! isprinter()
            inkey(7)                     && Zeit fr Papiertransport
         enddo
         setprc(0,0)
         wselect(win)
         wclose()
         win=zeigen(12,"H",{"Seite: "+alltrim(str(seite))+" wird gedruckt."})
       else                             && alles gedruckt !
         if saldo                && Saldo wurde bereits gedruckt
            ? space(dru_rand)+dru_z12+replicate("-",71)+"|"+replicate("-",10)+dru_z10
            ? space(dru_rand)+dru_z12+"Endsumme"+space(53)+dru_unte_1+transform(m_soll+m_s_saldo,"@e ###,###.##")+"|"+transform(m_haben+m_h_saldo,"@e ###,###.##")+dru_unte_0+dru_z10
            wselect(win)
            wclose()
            exit
         endif
       endif
   else
      do while konten->datum > bis_dat  && Endedatum berücksichtigen
         skip
      enddo
      if konten->k_nr==konto            && Datensatz gehört zu Konto
         do case
            case konten->b_nr = 0           // Anfangsbestand
               tmp_bnr=blank(str(konten->b_nr),.t.)
               tmp_txt="Anfangsbestand"+space(len(buchsatz->b_info)-14)
            case konten->b_nr = -1          // Endbestand
               tmp_bnr=blank(str(konten->b_nr),.t.)
               tmp_txt="Endbestand"+space(len(buchsatz->b_info)-10)
            otherwise
               tmp_bnr=str(konten->b_nr)
               tmp_txt=buchsatz->b_info
         end case
         ? space(dru_rand)+dru_z12+;
           left(tmp_bnr+"  "+konten->gegen_k_nr+" "+konten->gegen_k_na+" "+dtoc(konten->datum)+" "+tmp_txt , 61 )+nichtnull(konten->soll,10,"@e ###,###.##")+"|"+nichtnull(konten->haben,10,"@e ###,###.##") + dru_z10
         m_soll  += konten->soll
         m_haben += konten->haben

         skip
      else                              && Kontenende berschritten
         if saldo               && saldo wurde bereits gedruckt !
            ? space(dru_rand)+dru_z12+replicate("-", 61 )+;
              space(10)+"³" + dru_z10
         else
            do case                   && Salden ermitteln
               case m_soll > m_haben
                    m_h_saldo=m_soll-m_haben
               case m_soll < m_haben
                    m_s_saldo=m_haben-m_soll
               otherwise
                    m_s_saldo:=m_h_saldo:=0
            endcase

            ? space(dru_rand)+dru_z12+"      Saldo"+space(50)+nichtnull(m_s_saldo,10,"@e ###,###.##")+ "|"+nichtnull(m_h_saldo,10,"@e ###,###.##") + dru_z10
            saldo=.t.
         endif
      endif

   endif

enddo

?? dru_rueck

end sequence

wselect(win)
wclose()

set printer off
set printer to
set cons on

for x := 1 to 12
    f[x] := af[x]
next
do funk_tast

return
Daten Suche und Ausdruck bunt gemischt, auf Stellen achten und Steuerzeichen einstreuen ... sehr alter Clipper Code eben ;-)
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Drucken mit HBPrinter - Beispiel Umstellung von ? ...

Beitrag von brandelh »

Erster Schritt, Datensuche von Druckerklasse trennen ... ich erstelle eine Klasse für Kontodruck und weil wir in der 1.90 keine DataObjects haben gleich noch eine für die Kontozeilendaten:

Code: Alles auswählen

CLASS BuchZeile
   EXPORTED:
   VAR BuchNr
   VAR GegKtoNr
   VAR GegKtoName
   VAR BelegDat
   VAR BelegInfo
   VAR Soll
   VAR Haben
ENDCLASS
in der Steuerfunktion erstelle ich ein Array mit Objekten der Klasse BuchZeile, somit brauche ich nur diese Array übergeben und mit diesem Array kenne ich die Anzahl der zu druckenden Datenzeilen.
Der Zugriff über oData[x]:BuchNr ist dabei auf jeden Fall sprechender als oData[x,nFeld].

Nun zur Druckerklasse, abgeleitet von meiner HBPrinter() Basisklasse

Code: Alles auswählen

*-----------------------------------------------------------------------------------------------------
CLASS  KontoDrucker from HBPrinter

   EXPORTED:

      VAR aData // Daten als Array mit Objekten
      VAR TitelKontoNr
      VAR TitelKontoName
      VAR TitelKontoInfo
      VAR Stand
      VAR FontNormNr
      VAR FontNormTxt
      VAR FontFettNr
      VAR FontFettTxt
      VAR nSpaGeKtoNr, nSpaGeKtoName, nSpaBelDat, nSpaBuchInfo, nSpaSoll, nSpaHaben, nSpaLinie
      VAR nSummenY, nLastDataY

      INLINE METHOD INIT(oXbpPrinter)

         SUPER:INIT(oXbpPrinter)
         ::aData          := {}
         ::TitelKontoNr   := "????"
         ::TitelKontoName := "KontoName"
         ::TitelKontoInfo := "Infos zu dem Konto"
         ::Stand          := "TT.MM.JJJJ"
         ::FontNormNr     := 1
         ::FontNormTxt    := {"Arial",10,.f.,.f.}
         ::FontFettNr     := 2
         ::FontFettTxt    := {"Arial",10,.t.,.f.}
         ::nPageNo        := 1
         ::nFirstLine     := 470
         ::nLeftMargin    := 200
         ::nRightMargin   := ::nPaperSizeX - 100
         ::nLineLen       := ::nRightMargin - ::nLeftMargin
         ::nSummenY       := 2850
         ::nLastDataY     := ::nSummenY - 55
         ::nSpaGeKtoNr    := ::nLeftMargin + 120
         ::nSpaGeKtoName  := ::nSpaGeKtoNr + 110
         ::nSpaBelDat     := ::nSpaGeKtoNr + 330
         ::nSpaBuchInfo   := ::nSpaBelDat  + 200
         ::nSpaHaben      := ::nLeftMargin + ::nLineLen
         ::nSpaSoll       := ::nSpaHaben   - 410
         ::nSpaLinie      := ::nSpaSoll + ( ::nSpaHaben - ::nSpaSoll ) / 2

         RETURN SELF

      INLINE METHOD CREATE(cPrinterName)
         DEFAULT cPrinterName TO ActivePrinter()
         ::IgnoreBusy := .t. // das benötigt die aktuell noch nicht veröffentlichte Version 1.40
         SUPER:CREATE(cPrinterName)
         ::addFont(::FontNormTxt)
         ::addFont(::FontFettTxt)
         RETURN SELF

      METHOD Print
      METHOD PrintForm
ENDCLASS
*-------------------------------------------------------------
METHOD KontoDrucker:PrintForm()
   local altFont, nLR, nPosY, nPosX
   local nPosStand, nPosKtoName, nPosKtoInfo
   SUPER:PrintForm()
   * in abgeleiteten Klasse - in derived classes
   altFont := ::SetFont(::FontNormNr)
   nLR   := ::nLeftMargin
   nPosStand    := nLR+120
   nPosKtoName  := nPosStand + 120
   nPosKtoInfo  := nPosKtoName + 220
   nPosY := 190
   ::PrintText( nLR,nPosY,        "Konto:" )
   ::PrintText(nPosKtoInfo,nPosY, "("+alltrim(::TitelKontoInfo)+")" )
   ::PrintText(::nRightMargin,nPosY,"Seite:"+str(::nPageNo,5),"R" )
   nPosY +=  80
   ::PrintText( nLR,              nPosY, "Stand:" )
   ::PrintText( nPosStand,        nPosY, ::Stand )
   nPosY +=  80
   y     :=  40
   ::PrintText( nLR,              nPosY    , "Buch-" )
   ::PrintText( nLR,              nPosY+y  , "nr." )

   ::PrintText( ::nSpaGeKtoNr,    nPosY    , "Gegenkonto-" )
   ::PrintText( ::nSpaGeKtoNr,    nPosY+y  , "nr." )
   ::PrintText( ::nSpaGeKtoName,  nPosY+y  , "name" )

   ::PrintText( ::nSpaBelDat,     nPosY    , "Beleg-" )
   ::PrintText( ::nSpaBelDat,     nPosY+y  , "datum" )

   ::PrintText( ::nSpaBuchInfo,   nPosY    , "Buchungsinformation" )

   ::PrintText( ::nSpaSoll,       nPosY    , "SOLL" )
   ::PrintText( ::nSpaSoll,       nPosY+y  , ZeigWaehrung() )

   ::PrintText( ::nSpaHaben,      nPosY    , "HABEN"        , "R" )
   ::PrintText( ::nSpaHaben,      nPosY+y  , ZeigWaehrung() , "R" )
   // Linie oben quer
   ::PrintBox(  nLR, 415, ::nLineLen,5,"R",GRA_FILL)
   // Linie zwischen Soll und Haben
   ::PrintBox(  ::nSpaLinie, 300, ::nSpaLinie+5, ::nSummenY,"A",GRA_FILL )
   // Linie unten quer
   ::PrintBox(  nLR, ::nSummenY-50, ::nLineLen ,5,"R",GRA_FILL )

   ::SetFont(::FontFettNr)

   nPosY := 190

   ::PrintText( nPosStand  ,nPosY, ::TitelKontoNr )
   ::PrintText( nPosKtoName,nPosY, ::TitelKontoName )

   ::SetFont(altFont)

return self
*-------------------------------------------------------------
METHOD KontoDrucker:Print()            // Alle variablen Druckausgaben werden hier definiert, wenn n”tig wird ein
                                      // Seitenwechsel durchgefhrt, der Seitenz„hler erh”ht und ::PrintForm() aufgerufen.
                                      // all variable output is defined in this method. If necessary it will call
                                      // ::NewPage(), increase the PageNo and calls ::PrintForm()
   local x, nMaxX, nPosY, nSumSoll, nSumHaben, nLR, nSaldoSoll, nSaldoHaben

   ::nPageNo := 1
   ::lFirstPageForm := .f.         // Formular 1. Seite noch nicht gedruckt - form 1. page not printed
   ::SetFont(::FontNormNr)

   nMaxX       := len(::aData) // Anzahl der Buchungszeilen
   nLR         := ::nLeftMargin
   nSumSoll    := 0
   nSumHaben   := 0
   nSaldoSoll  := 0
   nSaldoHaben := 0

   ::PrintForm()         // Erste Seite drucken
   nPosY := ::nFirstLine


   for x := 1 to nMaxX

       if nPosY >= ::nLastDataY .or. nPosY < 0              // Seite voll - page full
          ::PrintText( nLR,         ::nSummenY, "Zwischensumme" )
          ::PrintText( ::nSpaLinie-10, ::nSummenY, nichtnull(nSumSoll ,10,"###,###.##"),"R")
          ::PrintText( ::nSpaHaben,    ::nSummenY, nichtnull(nSumHaben,10,"###,###.##"),"R")
          ::NewPage()
          ::PrintForm()
          if ::IsAfterLastPage()                  // Ist Shortcut m”glich ? (spart Zeit, wichtig fr Vorschau !)
             Return self
          endif
          nPosY := ::nFirstLine
          ::PrintText( nLR,         nPosY, "šbertrag" )
          ::PrintText( ::nSpaLinie-10, nPosY, nichtnull(nSumSoll ,10,"###,###.##"),"R")
          ::PrintText( ::nSpaHaben,    nPosY, nichtnull(nSumHaben,10,"###,###.##"),"R")
          nPosY += ::LineFeed()
       endif
       ::PrintText( nLR  ,             nPosY, ::aData[x]:BuchNr )
       ::PrintText( ::nSpaGeKtoNr,     nPosY, ::aData[x]:GegKtoNr )
       ::PrintText( ::nSpaGeKtoName,   nPosY, ::aData[x]:GegKtoName )
       ::PrintText( ::nSpaBelDat,      nPosY, ::aData[x]:BelegDat  )
       ::PrintText( ::nSpaBuchInfo,    nPosY, ::aData[x]:BelegInfo )
       ::PrintText( ::nSpaLinie-10,    nPosY, nichtnull(::aData[x]:Soll  ,10,"###,###.##"),"R")
       ::PrintText( ::nSpaHaben,       nPosY, nichtnull(::aData[x]:Haben ,10,"###,###.##"),"R")
       nSumSoll   += ::aData[x]:Soll
       nSumHaben  += ::aData[x]:Haben
       nPosY      += ::LineFeed()
   next
   // Saldo berechnen, wenn beide 0 sind, nicht drucken !
   do case
      case nSumSoll > nSumHaben
           nSaldoSoll  := 0
           nSaldoHaben := nSumSoll - nSumHaben
      case nSumSoll < nSumHaben
           nSaldoSoll  := nSumHaben - nSumSoll
           nSaldoHaben := 0
      otherwise
           nSaldoSoll  := 0
           nSaldoHaben := 0
   endcase

   if round(nSaldoSoll,2) > 0 .or. round(nSaldoHaben,2) > 0
      // hier nochmal prfen ob Platz fr den Saldo existiert !
      if nPosY >= ::nLastDataY .or. nPosY < 0              // Seite voll - page full
         ::PrintText( nLR  ,          ::nSummenY, "Zwischensumme" )
         ::PrintText( ::nSpaLinie-10, ::nSummenY, nichtnull(nSumSoll ,10,"###,###.##"),"R")
         ::PrintText( ::nSpaHaben,    ::nSummenY, nichtnull(nSumHaben,10,"###,###.##"),"R")
         ::NewPage()
         ::PrintForm()
         nPosY := ::nFirstLine
         ::PrintText( nLR  ,          nPosY, "šbertrag" )
         ::PrintText( ::nSpaLinie-10, nPosY, nichtnull(nSumSoll ,10,"###,###.##"),"R")
         ::PrintText( ::nSpaHaben,    nPosY, nichtnull(nSumHaben,10,"###,###.##"),"R")
         nPosY += ::LineFeed()
      endif
      ::PrintText( nLR  ,          nPosY, "Saldo" )
      ::PrintText( ::nSpaLinie-10, nPosY, nichtnull(nSaldoSoll ,10,"###,###.##"),"R")
      ::PrintText( ::nSpaHaben,    nPosY, nichtnull(nSaldoHaben,10,"###,###.##"),"R")
   endif

   ::PrintText( nLR  ,          ::nSummenY, "Endsumme" )
   ::PrintText( ::nSpaLinie-10, ::nSummenY, nichtnull(nSaldoSoll +nSumSoll ,10,"###,###.##"),"R")
   ::PrintText( ::nSpaHaben,    ::nSummenY, nichtnull(nSaldoHaben+nSumHaben,10,"###,###.##"),"R")

return self
Mit dieser Klasse haben wir einen - wie ich denke - recht übersichtlichen Ort für das Aussehen und die interne Drucksteuerung (Saldo drucken, Seitenumbruch, Summenüberträge etc.) ...
Im Fenster selbst müssen wir uns nur noch um die Daten kümmern und beides zusammen bringen (... ersetzten interne Anzeigeaufrufe des Programms, die für den Druck unwichtig sind):

Code: Alles auswählen

*----------------------------------------------- KONT_DRUCK_ZEIG --------
procedure kont_druck_zeig( konto, bis_dat, cFilter ) // Konto Nummer bei mir "C", 4, 0, bis_dat = Datum bis zu dem die Datensätze angezeigt werden sollen, cFilter = Filterbegriff 
local af[12], x, cArt, aData := {}, oBuchSatz, oHBP
if empty(cFilter) .and. day(bis_dat)=31 .and. month(bis_dat)=12
   cArt := "A"
else
   cArt := ask(16,"<A>lles, bis <D>atum oder ge<F>iltert drucken ?","<") // Eigene Funktion zur Abfrage von Möglichkeiten
endif
...
dbSeek(konto)                  // Buchungssätze
kontplan->(dbSeek(konto)) // Kontoplan enthält Infos zu Konten
...
do while ! eof()
   ...
   do case
      case cArt = "A" // alles
      case cArt = "D" // bis Suchdatum, alle Sätze nach dem Datum überspringen
           do while konten->datum > bis_dat .and. ! eof()
              skip
           enddo
      case cArt = "F" // gefiltert ! 
           do while konten->datum > bis_dat .and. ! eof() // Datumsfilter geht vor
              skip
           enddo
           // dann einen eventuellen Filter
           if ! empty(cFilter)
              do while ! alltrim(cFilter) $ upper(buchsatz->b_info) .and. ! eof()
                 skip
              enddo
           endif
   end

   if konten->k_nr==konto            && Datensatz gehört zu Konto
      oBuchSatz := BuchZeile():new()
      do case
         case konten->b_nr = 0           // Anfangsbestand
              oBuchSatz:BuchNr     := ""
              oBuchSatz:BelegInfo  := "Anfangsbestand"
         case konten->b_nr = -1          // Endbestand
              oBuchSatz:BuchNr     := ""
              oBuchSatz:BelegInfo  := "Endbestand"
         otherwise
              oBuchSatz:BuchNr     := str(konten->b_nr)
              oBuchSatz:BelegInfo  := buchsatz->b_info
      end
      oBuchSatz:GegKtoNr   := konten->gegen_k_nr
      oBuchSatz:GegKtoName := konten->gegen_k_na
      oBuchSatz:BelegDat   := dtoc(konten->datum)
      oBuchSatz:Soll       := konten->soll  // nichtnull(konten->soll,10, "@e ###,###.##")
      oBuchSatz:Haben      := konten->haben // nichtnull(konten->haben,10,"@e ###,###.##")

      aadd( aData, oBuchSatz )
      oBuchSatz := NIL

   endif

   dbSkip()

enddo

// der Teil bis hier hätte natürlich auch z.B. mit einem SQL Select die Daten liefern können.
// wird sind nach der Aufteilung also flexibler was die Datenquelle angeht als vorher.

if len(aData) > 0 // es gibt was zu drucken

   oHBP := KontoDrucker():New():create()
   if oHBP:IsPrinterError()
      msgbox("Bitte Drucker überprüfen")
   else
      oHBP:aData          := aData
      oHBP:TitelKontoNr   := konto
      oHBP:TitelKontoName := alltrim(kontplan->k_name)
      oHBP:TitelKontoInfo := alltrim(kontplan->k_info)
      if DATE() <= bis_dat
         oHBP:Stand       := dtoc(date())
      else
         oHBP:Stand       := dtoc(bis_dat)
      endif

      oHBP:PrintingDialog()  // Dieser Dialog zeigt die Druckerauswahl mit Vorschau an, Bild siehe unten

   endif
endif
aData := nil
...
return
Kontoliste.png
Kontoliste.png (96.32 KiB) 5092 mal betrachtet
Im Dialog kann man die Vorschau ein oder ausschalten, den gewünschen Drucker wählen und alles oder Seitenweise ausdrucken.
Ausgewählt ist immer der aktuell vom Druckobjekt verwendete Drucker (Standarddrucker oder Vorgabe vom Programm).

Nach der Umstellung kann ich z.B. auch über eine Terminalserversitzung auf einem lokalen Drucker drucken, wenn mein "Server" weit entfernt ist.

Hier habe ich die Datenzusammenstellung für den Druckjob vorgenommen, im nächsten Beispiel nutzen wir dafür die schon vorhandenen Arrays der Anzeigefunktion.
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Drucken mit HBPrinter - Beispiel Umstellung von ? ...

Beitrag von brandelh »

So nun das Beispiel, dass die Daten der Anzeige übernimmt, daher ist der Code im Programm für den Ausdruck auch sehr klein:

Code: Alles auswählen

*-------------------------------------------------------------------------
procedure EA_druck(kontart,titel,aText,aZugang,aAbgang,aBetrag,nSumme)
// die Parameter enthalten alle nötigen Werte inkl. der Gesamtsumme in nSumme
if len(aText) > 0
   oHBP := EA_Drucker():New():create()
   if oHBP:IsPrinterError() // ! WICHTIG !
      msgbox("Bitte Drucker überprüfen")
   else
      oHBP:cTitel       := titel
      oHBP:aText        := aText
      oHBP:aZugang      := aZugang
      oHBP:aAbgang      := aAbgang
      oHBP:aBetrag      := aBetrag
      oHBP:nGesamtSumme := nSumme

      oHBP:PrintingDialog()  // das erledigt die Anzeige und den Ausdruck etc. - ohne CLASS CODE nicht möglich !

   endif
endif
return
Nun die Druckerklasse, auch recht übersichtlich ;-)

Code: Alles auswählen

*--------------------------------------------------------------------------------------------------------
CLASS  EA_Drucker from HBPrinter

   EXPORTED:

      VAR cTitel
      VAR aText
      VAR aZugang
      VAR aAbgang
      VAR aBetrag
      VAR nGesamtSumme
      VAR nSpaText, nSpaInfo, nSpaZugang, nSpaAbgang, nSpaSumme

      INLINE METHOD INIT(oXbpPrinter)

         SUPER:INIT(oXbpPrinter)

         ::cTitel         := "Titel"
         ::aText          := {}
         ::aZugang        := {}
         ::aAbgang        := {}
         ::aBetrag        := {}
         ::nGesamtSumme   :=  0

         ::nPageNo        := 1
         ::nFirstLine     := 350
         ::nLeftMargin    := 200
         ::nRightMargin   := ::nPaperSizeX - 100
         ::nLineLen       := ::nRightMargin - ::nLeftMargin

         ::nSpaText       := ::nLeftMargin
         ::nSpaInfo       := ::nSpaText     + 350
         ::nSpaZugang     := ::nRightMargin - 500  // Rechtsbündig !
         ::nSpaAbgang     := ::nRightMargin - 250
         ::nSpaSumme      := ::nRightMargin
         RETURN SELF

      INLINE METHOD CREATE(cPrinterName)
         DEFAULT cPrinterName TO ActivePrinter()
         ::IgnoreBusy := .t.
         SUPER:CREATE(cPrinterName)
         ::addFont({"Arial",10,.f.,.f.})       // nur eine Schriftart
         ::SetFont(1)
         RETURN SELF

      METHOD Print
      METHOD PrintForm

ENDCLASS
*----------------------------------------------------------------------
METHOD EA_Drucker:PrintForm()

   local nPosY

   SUPER:PrintForm()
   * in abgeleiteten Klasse - in derived classes
   nPosY := 190
   ::PrintText(::nSpaText     ,nPosY, alltrim(::cTitel) )
   ::PrintText( 1050          ,nPosY, dtoc(date()) , "C" )
   ::PrintText(::nRightMargin ,nPosY, "Seite:"+str(::nPageNo,5),"R" )
   nPosY +=  80
   ::PrintText(::nSpaText     ,nPosY, "Kto.Nr / Art / Name " )
   ::PrintText(::nSpaZugang   ,nPosY, "Zugang"    , "R" )
   ::PrintText(::nSpaAbgang   ,nPosY, "Abgang"    , "R" )
   ::PrintText(::nSpaSumme    ,nPosY, "Summe EUR" , "R" )
   nPosY +=  15
   // Linie oben quer
   ::PrintBox( ::nSpaText, nPosY, ::nLineLen,5,"R",GRA_FILL)

return self
*-------------------------------------------------------------
METHOD EA_Drucker:Print()

   local x, nMaxX, nPosY, cKtoNr, cKtoName, cKtoInfo

   ::nPageNo := 1
   ::lFirstPageForm := .f.         // Formular 1. Seite noch nicht gedruckt - form 1. page not printed
   ::SetFont(1)

   nMaxX       := len(::aText) // Anzahl der Buchungszeilen

   ::PrintForm()         // Erste Seite drucken
   nPosY := ::nFirstLine


   for x := 1 to nMaxX
       if nPosY >= 2850
          ::NewPage()
          ::PrintForm()
          if ::IsAfterLastPage()                  // Ist Shortcut m”glich ? (spart Zeit, wichtig für Vorschau !)
             Return self
          endif
          nPosY := ::nFirstLine
       endif
       // unbenutzte Konten nicht drucken
       if round(::aZugang[x],2) > 0 .or. round(::aAbgang[x],2) > 0 .or. round(::aBetrag[x],2) > 0
          cKtoNr   := substr(::aText[x],1, 4)          // die übergebenen Daten sind nach Stellen für den Bildschirm erzeugt worden
          cKtoName := substr(::aText[x],5,14)       // für den Ausdruck mit variabler Zeichenbreite brauchen wir eine Aufteilung
          cKtoInfo := substr(::aText[x],19)           // aber das geht einfach ;-) 
          ::PrintText( ::nSpaText     ,nPosY, alltrim(cKtoNr)   )
          ::PrintText( ::nSpaText+100 ,nPosY, alltrim(cKtoName) )
          ::PrintText( ::nSpaInfo     ,nPosY, alltrim(cKtoInfo) )
          ::PrintText( ::nSpaZugang   ,nPosY, nichtnull(::aZugang[x],10,"###,###.##"),"R")
          ::PrintText( ::nSpaAbgang   ,nPosY, nichtnull(::aAbgang[x],10,"###,###.##"),"R")
          ::PrintText( ::nSpaSumme    ,nPosY, nichtnull(::aBetrag[x],10,"###,###.##"),"R")
          nPosY      += ::LineFeed()
       endif
   next
   // wir brauchen noch eine Zeile
   if nPosY >= 2850
      ::NewPage()
      ::PrintForm()
      if ::IsAfterLastPage()                  // Ist Shortcut möglich ? (spart Zeit, wichtig für Vorschau !)
         Return self
      endif
      nPosY := ::nFirstLine
   endif
   ::PrintText( ::nSpaText, nPosY, "Gesamtsumme" )
   ::PrintText(::nSpaSumme, nPosY, nichtnull( ::nGesamtSumme ,10,"###,###.##"),"R")

return self
Beim testen auf meinem Tintenstrahldrucker musste ich feststellen, dass die Fehlermeldung "Drucker ist BUSY" anstatt der einfachen Übernahme der Daten an die Druckerwarteschlange recht nervig ist.
In der neuen Version von meinem HBPrinter() wird daher die Möglichkeit geschaffen, diese zu ignorieren.
Gruß
Hubert
Antworten