Seite 6 von 9

Re: Drucken mit HBPrinter - Was geht wie warum ???

Verfasst: Mo, 26. Jan 2015 16:29
von brandelh
Eben hatte ich hier einen seltsamen Fehler:

Code: Alles auswählen

         oWeKeyGra1Druck := WeKeyGra1Druck():New():create()
         oWeKeyGra1Druck:addFont("21.Arial") *** hier kracht es
         oWeKeyGra1Druck:addFont("10.Arial")
         oWeKeyGra1Druck:addFont("8.Arial")

Code: Alles auswählen

Xbase++ Version     : Xbase++ (R) Version 1.90.355
Betriebssystem      : Windows 7 06.01 Build 07601 Service Pack 1
------------------------------------------------------------------------------
oError:args         :
          -> VALTYPE: O CLASS: XbpFont
          -> VALTYPE: O CLASS: XbpPresSpace
oError:canDefault   : N
oError:canRetry     : N
oError:canSubstitute: J
oError:cargo        : NIL
oError:description  : Parameter hat falschen Typ
oError:filename     : 
oError:genCode      :          2
oError:operation    : :init
oError:osCode       :          0
oError:severity     :          2
oError:subCode      :       1025
oError:subSystem    : BASE
oError:thread       :          1
oError:tries        :          0
------------------------------------------------------------------------------
CALLSTACK:
------------------------------------------------------------------------------
Aufgerufen von _HBPRINTER:ADDFONT(1953)
Aufgerufen von DRULST01(57)
Aufgerufen von (B)_LISTENDRUCK:INIT(109)
Aufgerufen von _LISTENDRUCK:LISTENDRUCKEN(145)
Aufgerufen von (B)_LISTENDRUCK:INIT(102)
Aufgerufen von XBPPUSHBUTTON:HANDLEEVENT(991)
Aufgerufen von DOEVENTLOOP(43)
Aufgerufen von MAIN(119)
Einige Minuten zuvor ist das Programm noch einwandfrei gelaufen und hat auch sauber gedruckt.
Ein anderes meldete dann "Standarddrucker kann nicht bestimmt werden", das brachte mich auf die Spur.

Win 7 herunterfahren, neu starten, alles funktioniert wieder prima ... :?

Ich druckte auf "Adope PDF" aber auch das Umstellen auf einen anderen Standarddrucker hatte vor dem Neustart nichts geholfen.
Ich muss versuchen, den häßlichen internen Fehler abzufangen (::oPS ist dann wohl NIL, weil kein Standarddrucker geliefert wurde),
warum aber die Druckerwarteschlangen plötzlich weg waren, das kann ich nicht verstehen. Bis jetzt war es das erste und einzige Mal. :?

Re: Drucken mit HBPrinter - Was geht wie warum ???

Verfasst: Di, 27. Jan 2015 11:15
von Schorsch
Hallo Hubert,
vielen Dank für die Hinweise und das erweiterte Beispiel.
Zu deiner Frage - ich verwende deinen Druck-Auswahldialog nicht das Original von XBase.

Was ist der Vorteil von Instanzvariablen gegenüber "normalen" Variablen ? - in diesem Fall.

Ich wollte folgende 2 Zeilen
::PrintMemoPage( 200, 200 ,cListeMemoText) // ab Zeile 3
oder
::PrintMemo( 200, 200 ,cListeMemoText, "L",,,,,2749) // ab Zeile 3 bis 50

(alternativ) verwenden um eine einfach Textdatei, die ich vorher am Bildschirm anzeige auf den Standarddrucker ausgeben,
bekomme aber dann eine(dieselbe) Fehlermelung:

Die besagte Zeile->1302 sind die oben angegebenen.
-------------------------------------------------------------------------------------------------------------------
FEHLERPROTOKOLL von "D:\GS_PROJ\FaktKBH\FAKTKBH.EXE" Datum: 27.01.2015 00:40:53

Xbase++ Version : Xbase++ (R) Version 1.90.355
Betriebssystem : Windows Vista 06.01 Build 07601 Service Pack 1
------------------------------------------------------------------------------
oError:args :
-> NIL
oError:canDefault : N
oError:canRetry : J
oError:canSubstitute: N
oError:cargo : NIL
oError:description : Unbekannte Variable
oError:filename :
oError:genCode : 22
oError:operation : SELF
oError:osCode : 0
oError:severity : 2
oError:subCode : 2000
oError:subSystem : BASE
oError:thread : 1
oError:tries : 1
------------------------------------------------------------------------------
CALLSTACK:
------------------------------------------------------------------------------
Aufgerufen von TEMP_DRU(1302)
Aufgerufen von (B)TMPTXTBS(1208)
Aufgerufen von MEMOEDIT(0)
Aufgerufen von TMPTXTBS(1232)
Aufgerufen von KUNDLST1(99)
Aufgerufen von STAMMENU(73)
Aufgerufen von MAIN(589)
-----------------------------------------------------------------------
Ich benutze HBPrinter Version 1.36 vom 29.1.2012

Ich habe eine Umgehungslösung mit zeilenweisem Lesen und ausgeben gemacht, bin aber damit nicht wirklich zufrieden.

Vielleicht könntest du noch erklären, was der Unterschied von ::PrintMemoPage() und ::PrintMemo() ist.

Vielen Dank

Re: Drucken mit HBPrinter - Was geht wie warum ???

Verfasst: Di, 27. Jan 2015 13:49
von brandelh
eine LOCALE Variable nimmt man dann, wenn sie NUR in dieser Funktion / Methode benötigt wird, bzw. über Parameter den Inhalt weitergibt.
Eine Instanzvariable ist in der Klasse je nach Art mehr oder weniger sichtbar (siehe hierzu unterschiede zu EXPORTED, PROTECTED etc.)
Würde ich Funktionen verwenden, müsste ich alle Instanzvariablen Variablen entweder für alle sichtbar machen (Public Private) und hätte somit immer das Problem dass andere Programme diesen Namen schon haben, oder aber per Parameter übegeben, das wären sehr viele Parameter !

Hierzu bitte die Grundlagen zu Klassen und Objekten in der Hilfe von Xbase++ lesen ...

Deine Fehlermeldung besagt, dass die :: in einer Funktion und nicht in einer Methode verwendet wurden, SELF == :: ist aber nur innerhalb eines Objektes / Klasse sichtbar.
In Funktionen muss man das Objekt z.B. in einer Local speichern: oHBP := HBPrinter()... oHBP:PrintMemo() ...

Zu PrintMemo und PrintMemoPage ... der Unterschied liegt darin, dass eine davon immer allen Text druckt und notfalls einen Seitenumbruch auslöst !!!
wärend die andere den Text der nicht in den Bereich passt zurückgibt, damit man diesen auf der nächsten Seite selbst drucken kann.
In meinen Beispielen wird das klarer, denn die nutze ich auch um die Methoden zu testen ;-)

Re: Drucken mit HBPrinter - Was geht wie warum ???

Verfasst: Mo, 30. Mär 2015 23:32
von Werner_Bayern
Servus Hubert,

hast Du schon bemerkt, dass unter Xbase++ 2.0 die Methode printbmp() ein Bitmap mit transparentem Hintergrund mit schwarzem Hintergrund druckt?
Die Druckvorschau ist korrekt, der Ausdruck (oder auch ein PDF-Druck) aber dann mit schwarzem Hintergrund. Unter 1.9 ist beides transparent.

Eigentlich entspricht das jetzt ja der Beschreibung lt. Hilfe:
transparent color specified in the :transparentClr instance variable is ignored if the presentation space passed in <oTargetPS> is connected to a printer or file device context.
Auf die Schnelle fällt mir dazu keine Lösung ein... Dir?

Re: Drucken mit HBPrinter - Was geht wie warum ???

Verfasst: Di, 31. Mär 2015 11:58
von brandelh
Ehrlich gesagt, habe ich nie ein BMP mit transparentem Hintergrund gehabt !
Ich ging davon aus, dass BMPs sowas nicht können und habe alle Farben definiert die ich brauche.
Schrift muss man dann aber darüber legen, diese sollte transparent gedruckt werden.

PS: ich nutze ja nur das was Xbase++ anbietet ;-)

Re: Drucken mit HBPrinter - Was geht wie warum ???

Verfasst: Di, 31. Mär 2015 20:52
von Werner_Bayern
BMP unterstützt auch keinen transparenten Hintergrund, nur png und gif. In meinem Fall geht es um png.
Hast Du bisher also immer nur ein 4eckiges Bild gedruckt, bzw. dann immer mit weißem Hintergrund?

Der Ansatz funktioniert aber auch nicht, wenn man die Transparenz mit Weiß (bei weißem Papier) ersetzt und dann erst druckt, weil sich V2.0 jetzt offensichtlich anders verhält?

Re: Drucken mit HBPrinter - Was geht wie warum ???

Verfasst: Mi, 01. Apr 2015 8:44
von brandelh
Tatsache ist, dass ich mich überhaupt nicht mit Transparenz beschäftigt habe, da brauche ich wohl etwas Nachhilfe ;-)

Aber wie gesagt, ich nutze Xbase++ Standardcontrols.
Wie kann ich das testen ?

Re: Drucken mit HBPrinter - Was geht wie warum ???

Verfasst: Mi, 01. Apr 2015 9:34
von brandelh
Hier ist die Methode, die Grafiken druckt:

Code: Alles auswählen

*-------------------------------------------------------------------
METHOD _HBPrinter:PrintBmp(nX,nY,nXSize,nYSize,cFileName,nID)
   local oBitmap,lSuccess:=.t.,aPos1:={}, lIsLoaded := .f.
   // infos zum Drehen ???
   /*
      Drehen mit linke obere und rechte untere Ecke vertauscht ????
   */
   // nx=xKoordinate, ny=yKoordinate, cFileName
   // nXSize=Breite in X, nYSize=Höhe in Y
   aPos1 := ::PosHBtoXPP(nX,nY)
   oBitmap := XbpBitmap():new():create( ::oPS )

   if IsNil(nID)    // Dateiname der Bitmap wurde übergeben
      lIsLoaded := oBitmap:loadFile( cFileName )
   else             // Resource wurde angegeben, benutzen  HB
      lIsLoaded := oBitmap:load( cFileName , nID )   // hier kann cFileName für DLL verwendet werden
   endif

   if lIsLoaded
      if ::IsPageToPrint()
         *
         * ein Parameter NIL, der andere nicht dann proportional vergrößern
         * Rechtsbündig drucken
         * drehen ... ########################
         DEFAULT nXSize TO oBitmap:xSize
         DEFAULT nYSize TO oBitmap:ySize
         lSuccess:= oBitmap:draw( ::oPS, {aPos1[1],aPos1[2],aPos1[1]+nXSIZE,aPos1[2]+nySize} )
      endif
   else
      lSuccess := .f.
      if ::IsPageToPrint()
         GraStringAT(::oPS, {aPos1[1],aPos1[2]},"Kein Bild")
      endif
   endif
return lSuccess
eigentlich müsste der Unterschied in XbpBitmap() selbst liegen, wenn man also das Bitmap Objekt selbst erzeugen und einstellen könnte, sollte das helfen oder ?
wie ich sehe fehlt auch ein destroy() wenn man die XbpBitmap() in der Routine erstellt hat ...

Code: Alles auswählen

*-------------------------------------------------------------------
METHOD _HBPrinter:PrintBmp(nX,nY,nXSize,nYSize,cFileName,nID)
   local oBitmap,lSuccess:=.t.,aPos1:={}, lIsLoaded := .f., lIsToDestroy := .f.
   // infos zum Drehen ???
   /*
      Drehen mit linke obere und rechte untere Ecke vertauscht ????
   */
   // nx=xKoordinate, ny=yKoordinate, cFileName
   // nXSize=Breite in X, nYSize=Höhe in Y
   aPos1 := ::PosHBtoXPP(nX,nY)
   if valtype(uFileName)="O" // XbpBitmap() ... geht das so ?
      oBitmap := cFileName  // cFileName => uBitmap umbenennen ?
      oBitmap:presSpace( ::oPS )
      lIsLoaded := .t.
      lIsToDestroy := .f. // das müsste das aufrufende Programm übernehmen
   else
      oBitmap := XbpBitmap():new():create( ::oPS )
      if IsNil(nID)    // Dateiname der Bitmap wurde übergeben
         lIsLoaded := oBitmap:loadFile( cFileName )
      else             // Resource wurde angegeben, benutzen  HB
         lIsLoaded := oBitmap:load( cFileName , nID )   // hier kann cFileName für DLL verwendet werden
      endif
      lIsToDestroy := .t.
   endif
   if lIsLoaded
      if ::IsPageToPrint()
         * ein Parameter NIL, der andere nicht dann proportional vergrößern
         * Rechtsbündig drucken
         * drehen ... ########################
         DEFAULT nXSize TO oBitmap:xSize
         DEFAULT nYSize TO oBitmap:ySize
         lSuccess:= oBitmap:draw( ::oPS, {aPos1[1],aPos1[2],aPos1[1]+nXSIZE,aPos1[2]+nySize} )
      endif
      if lIsToDestroy
         oBitmap:destroy()
      endif
   else
      lSuccess := .f.
      if ::IsPageToPrint()
         GraStringAT(::oPS, {aPos1[1],aPos1[2]},"Kein Bild")
      endif
   endif
return lSuccess
würde das dein Problem lösen ?

Re: Drucken mit HBPrinter - Was geht wie warum ???

Verfasst: Do, 02. Apr 2015 13:48
von Werner_Bayern
Servus Hubert,

nein, das bringt nichts, weil wie bereits geschrieben, Xbase++ 2.0 sich jetzt so verhält, wie in der Doku seit 1.9 steht. Ist der Presspace mit einem Printerobject verbunden, wird die Hintergrundfarbe ignoriert, in meinen Tests druckt er dann immer einen schwarzen Hintergrund.

Ich werde mal testen ob es was bringt, die transparente Hintergrundfarbe mit Weiß zu ersetzen, ob das dann geht. Das wäre dann auch gleich die Universallösung, weil herkömmliche Drucker kein Weiß drucken können. Stichpunkt farbiges Papier.

Re: Drucken mit HBPrinter - Was geht wie warum ???

Verfasst: Do, 02. Apr 2015 15:39
von brandelh
Kannst du mir eine kleine PNG mit klar erkennbarem transparentem Hintergrund und als BMP mit farbigem Hintergrund (z.B. rosa statt transparent) senden.
Kann Paint transparente Farben erstellen ?

Re: Drucken mit HBPrinter - Was geht wie warum ???

Verfasst: Do, 02. Apr 2015 21:52
von Werner_Bayern
Siehe PN.

Re: Drucken mit HBPrinter - Was geht wie warum ???

Verfasst: Fr, 15. Mai 2015 17:48
von Wolfgang_B
Hallo Hubert,
habe es jetzt endlich geschafft Deine HBPRINT-Klasse zum Laufen zu bringen. Jetzt stehen bei Beträgen endlich bei Proportionalsschrift die Kommastellen richtig übereinander. Sieht richtig gut aus - LOB!!
Darf ich die Klasse weiterhin in meinen Projekten verwenden?

Und noch eine Frage. Kann man beim Drucken eines Memotextes im Text den Font wechseln, weil man z.B. ein Wort Fett drucken will?

Ein schönes Wochenende

Gruß
Wolfgang

Re: Drucken mit HBPrinter - Was geht wie warum ???

Verfasst: Sa, 16. Mai 2015 10:57
von brandelh
hallo,

die Klasse darf frei verwendet werden.

Die Methode ::PrintMemo() druckt einen Text in der einen eingestellten Schrift.
Man könnte Marker vorsehen (z.b. und ), in einer Ableitung darauf reagieren und aus dem a<ktuellen font einen fetten machen.
Einfach ist das nicht (insbesondere da fette Schrift breiter ist) und ich denke nicht dass ich mir das auflade ;-)

Ich nutze in diesen Fällen PrintText( NIL, NIL, ...) für den folgenden Text in einer Zeile, dazwischen kann man die Schrift wechseln.

Re: Drucken mit HBPrinter - Was geht wie warum ???

Verfasst: Sa, 16. Mai 2015 11:42
von Wolfgang_B
hm, hab ich mir schon gedacht...

Fällt mir gerade noch was auf. Wenn ich ein mehrseitiges Dokument drucken will Methode printform() und Methode Print(), zeigt er mir in der Vorschau nur die 1.Seite an. Ich kann zwar blättern, aber der angezeigte Inhalt ist nur die 1. Seite ...

Nochmals vielen Dank für die Klasse :) .

Gruß Wolfgang

Re: Drucken mit HBPrinter - Was geht wie warum ???

Verfasst: Sa, 16. Mai 2015 12:05
von Wolfgang_B
HAllo Hubert,

hat sich erledigt!! Hatte vergessen die ::nPageNo hochzuzählen.

Schönes Wochenende
Gruß Wolfgang

Re: Drucken mit HBPrinter - Was geht wie warum ???

Verfasst: Do, 03. Sep 2015 21:27
von Werner_Bayern
Servus Hubert,

hast was finden können wg. png - Transparenz?

Was ist eigentlich die aktuelle Version der Druckerklasse? Auf Deiner HP steht 1.37, ich habe eine 1.39, die ist aber von 2013?

Hintergrund: PrintText druckt rechtsbündig nicht richtig bei Bold-Fonts. Da wird ein 1/2 Zeichen zu weit rechts gedruckt.

Re: Drucken mit HBPrinter - Was geht wie warum ???

Verfasst: Do, 03. Sep 2015 23:47
von Werner_Bayern
tritt unter 1.9 und 2.0 auf, jedoch nicht bei Deiner Druckvorschau, nur bei PDF-Druck oder auf einen Drucker...

Re: Drucken mit HBPrinter - Was geht wie warum ???

Verfasst: Fr, 04. Sep 2015 6:53
von brandelh
Sorry, das mit der Transparenz habe ich vergessen, die Versionsnummer ist sehr seltsam, ich hab die letzten wohl nicht auf die Homepage gestellt :roll:

Code: Alles auswählen

  1.40 -  2015-03-13
           NEU  ::PrinterList()        => XbpPrinter():List()
           NEU  ::GetDefaultPrinter()  => XbpPrinter():New():Create():devName
           NEU  ::IgnoreBusy           => ::IsPrinterError() ignoriert XBPPRN_STATUS_BUSY
                  - erm”glicht das Drucken obwohl der Drucker auf BUSY steht.
                  - IgnoreBusy DEFAULT .f. => Fehler auch bei BUSY
                  - IgnoreBusy         .t. => KEIN Fehler bei BUSY
           NEU  ::IgnorePaused         => ::IsPrinterError() ignoriert XBPPRN_STATUS_PAUSED

   1.39 -  15.11.2013  (= 2013-11-15)
           NEU  ::PrintMemoLineMaxLen  speichert die l„ngste Zeile des zuletzt aufgerufenen ::PrintMemo(), ::PrintMemoPage()
           NEU  ::PrintArtBoxOffsetX   legt den Abstand Links/Rechts der cArt="B" Box zum Text fest, bisher fix 10 = 1 mm
           NEU  ::PrintArtBoxOffsetY   legt den Abstand Oben/Unten   der cArt="B" Box zum Text fest, bisher fix 10 = 1 mm

   1.38 -  14.11.2013  (= 2013-11-14)
           HBPRINTD.PRG - NTRIM() als STATIC FUNCTION erg„nzt, ERRBOX() => MSGBOX()

   1.37 -  04.04.2013  (= 2013-04-04)
                ::PrintMemo()  Fehler bei Seitenumbruch, gemeldet von <Werner_Bayern>
           NEU  ::abort()      Abbruch des Druckjobs, erstellt von <Werner_Bayern> aus dem Forum.
           NEU  ::PrintMemoCountLines(cMemoText,nMaxLineLen) ermittelt wieviele Zeilen ::PrintMemo() ben”tigen wird, ohne tats„chlich zu drucken.

PS: wie die Zeit verfliegt ...

Re: Drucken mit HBPrinter - Was geht wie warum ???

Verfasst: Fr, 04. Sep 2015 12:58
von Werner_Bayern
Kann man die 1.40 auch downloaden? :wink:

Dann würde ich mich damit auf die Suche machen bezgl. der BOLD-Schriften, die nicht korrekt rechtsbündig gedruckt werden.

Re: Drucken mit HBPrinter - Was geht wie warum ???

Verfasst: Fr, 04. Sep 2015 13:51
von Werner_Bayern
Habs analysiert, es liegt an den jew. Fonts. Mache ich das mit Arial 11 und Arial 11 Fett, dann stimmt der rechte Rand nicht. Mache ich es z. B. mit 16.Angsana New, passt es.

Entweder liegts an GraQueryTextBox oder am jew. Font, auf alle Fälle nicht an Deiner Druckerklasse.

Warum machst Du eigentlich bei der PrintText-Methode bei IsPrintTextAlltrim ein Leerzeichen?

Code: Alles auswählen

      if cAusrichtung $ "LCZMR"         // cTxt ausgeben - print cTxt
         if IsPrintTextAlltrim          // wird auch von automatischer Positionierung benötigt.
            lSuccess   := GraStringAt(::oPS, aPos, cTxt+" " )
         else
            lSuccess   := GraStringAt(::oPS, aPos, cTxt )
         endif
      endif

Re: Drucken mit HBPrinter - Was geht wie warum ???

Verfasst: Fr, 04. Sep 2015 13:55
von brandelh
vorab

Re: Drucken mit HBPrinter - Was geht wie warum ???

Verfasst: Fr, 04. Sep 2015 14:01
von Werner_Bayern
Danke!

Nachtrag: Am Font liegts nicht, weil Word es auch richtig druckt und es in Deiner Druckvorschau ja auch passt. Scheint die Funktion GraQueryTextBox() zu sein? Der Presentation-Space?

Re: Drucken mit HBPrinter - Was geht wie warum ???

Verfasst: Mo, 07. Sep 2015 8:10
von brandelh
schick mal bitte ein SEHR KURZES Beispiel mit dem ich sehen kann was du meinst per PN mit ZIP Anhang ...

Re: Drucken mit HBPrinter - Was geht wie warum ???

Verfasst: Di, 08. Sep 2015 4:03
von AUGE_OHR
Werner_Bayern hat geschrieben:Scheint die Funktion GraQueryTextBox() zu sein? Der Presentation-Space?
wenn du an GraQueryTextBox() zweifelst dann probiere doch mal die Demo von Günter Beyes wo er GraQueryTextBox() mit der API Function GetTextExtentPoint32() verglichen hat.

Re: Drucken mit HBPrinter - Was geht wie warum ???

Verfasst: Di, 08. Sep 2015 16:04
von Werner_Bayern
brandelh hat geschrieben:schick mal bitte ein SEHR KURZES Beispiel mit dem ich sehen kann was du meinst per PN mit ZIP Anhang ...

Code: Alles auswählen

#pragma Library( "XppUI2.lib" )

function main
local oDlg, oDrucker, nPosY := 200, nPosX := 1000, cText := "Druckertest OXX"

oDlg := XbpPrintDialog():new()
oDlg:create()
oDrucker := oDlg:display()
oDlg:destroy()
if oDrucker == NIL   // kein Drucker gewählt!
   return NIL
endif

oDrucker := hbprinter():new(oDrucker):create()

if oDrucker:IsPrinterError()             // Fehler verhindern, avoid errors
   msgbox("Drucker ist nicht verfügbar !")
else
   oDrucker:addFont("11.Arial")
   oDrucker:addFont("11.Arial Fett")
   oDrucker:addFont("16.Angsana New Fett")
   oDrucker:setFont(1)
   oDrucker:StartDoc("Drucktest")
   oDrucker:PrintText( nPosX, nPosY, cText, "R")
   nPosY += oDrucker:LineFeed()
   oDrucker:setFont(2)
   oDrucker:PrintText( nPosX, nPosY, cText, "R")
   nPosY += oDrucker:LineFeed()
   oDrucker:setFont(1)
   oDrucker:StartDoc("Drucktest")
   oDrucker:PrintText( nPosX, nPosY, cText, "R")
   nPosY += oDrucker:LineFeed()
   oDrucker:setFont(3)
   oDrucker:PrintText( nPosX, nPosY, cText, "R")
   oDrucker:EndDoc()
endif
return NIL
Kurz genug? :)