Seite 4 von 9

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

Verfasst: Di, 17. Mai 2011 13:14
von brandelh
Hi,

ich denke dass die Verschachtelung meine interne Zählung durcheinander bringt, bitte teste mal so:

Code: Alles auswählen

nY += oMeinDrucker:LineFeed()
oMeinDrucker:PrintMemo(nLinkerRand, nY, left(cText, len(cText) - 3),,RANDRECHTS - nLinkerRand)
nY += oMeinDrucker:LineFeed()
oMeinDrucker:PrintText(nLinkerRand, nY, "blablabla")

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

Verfasst: Di, 17. Mai 2011 15:15
von Werner_Bayern
Servus Hubert,

da ist doch kein Unterschied! Die Zuweisung an nY erfolgt in beiden Fällen vor Aufruf Deiner Methode.
LineFeed gibt doch nur die Anzahl an Y-Pixel der aktuellen Schrift zurück, oder hab ich da was falsch verstanden? Kann nicht sein, da es einwandfrei funktioniert.
Die Print-Methoden sollten einfach die Anzahl an Y-Pixel zurückgeben oder ein interner Wert müsste abfragbar sein.
Gibts das?

Danke!

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

Verfasst: Di, 17. Mai 2011 15:18
von Werner_Bayern
Nachtrag: In Deinem Test.prg ist das Memo leider am Ende des Textes, oder Du gibts einfach nur feste Y-Werte vor, da hätte ich schon nachgesehen.
Wie machst Du das in Deinen Quältexten? :?:

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

Verfasst: Di, 17. Mai 2011 16:02
von brandelh
Hallo Werner,

da hast du mich doch glatt erwischt =D>

Ich zähle die "Zeilenzahl" nicht intern mit und kann diese somit auch nicht intern erhöhen. (Intern arbeite ich mit 1/10 mm, nicht mit Zeilen).
Auch ::LineFeed() kennt den aktuellen Zustand nicht.
Dass PrintMemo() die Anzahl der gedruckten Zeilen zurückgibt, das hat was, würde aber meinen meinem bisherigen Modell widersprechen.
:angry5: :angry4: :angry7: :angry1: :angry3: :angry2: :banghead: angry9: :color: :confused2: :coffee: :coffee: :coffee: :coffee: :coffee: :coffee:

Ich könnte eine Instanzvariable füllen, die die Anzahl der Zeilen enthält ... :? keine Code Änderungen ...
Wahrscheinlich hat aber eh niemand abgefragt ob die Methode .t. zurückgeliefert hat ... ich muss darüber nachdenken, wie eilig ist es dir ? ;-)

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

Verfasst: Di, 17. Mai 2011 17:29
von Werner_Bayern
Servus Hubert,
ohne Deinen Quelltext näher angeschaut zu haben, intern wird aber z. B. die X-Koordinate schon berücksichtigt, ein printText(,nY) macht an der letzten X-Pos weiter.
PrintMemo sollte einfach so wie lineFeed() die Anzahl an Y-Pixel zurückgeben.
Ist nicht so eilig, behelfe mir aktuell mit einem geschätzten Zeilenvorschub. Ist halt ungenau.

Danke.

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

Verfasst: Di, 17. Mai 2011 20:22
von brandelh
Hi,

die Gra-Funktionen wissen wo die letzte Zeichenoperation war, dieses nutze ich intern aus ;-)

Richtige Zeilen habe ich ja nur bei der SAY Methode ....

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

Verfasst: Mi, 18. Mai 2011 10:02
von Werner_Bayern
Servus Hubert,

habs auf dem kurzen Dienstweg gelöst und die printmemo-Methode geändert:

Code: Alles auswählen

//return lSuccess
return nPosY
Läuft einwandfrei, hab gesehen, Du benutzt ja in der printmemo einfach Deine printtext-Methode, bis alles gedruckt ist. Da zählst Du ja sauber die Y-Pixel Zeile für Zeile hoch. :happy7:

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

Verfasst: Mi, 18. Mai 2011 23:55
von Werner_Bayern
Servus Hubert,

versuche seit geraumer Zeit, mittels PrintBox() eine farbige Box zu drucken, mir gelingt aber der Farbwechsel nicht.
Kannst Du mir bitte ein kurzes (2zeiliges?) Code-Beispiel zeigen, wo die Farbe für die Box gesetzt wird? Dazu dient wohl Deine Methode SetAttrLine()?

Danke!

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

Verfasst: Do, 19. Mai 2011 9:05
von brandelh
Hi,

grundsätzlich sind alle Druckmethoden intern Gra...Funktionen.
Deren Aussehen (Attribute) kann man über die Methoden :SetAttr...() ändern, für Flächen (also Box, Arc etc.) ist das ::SetAttrArea().

SetAttrArea( aAttribNeu ) ruft intern GraSetAttrArea() auf. Daher verweise ich bei allen diesen Funktionen direkt auf die Hilfe von Xbase++.
Allerdings mache ich es mir mit den Parametern einfacher, ich übergebe nur das Array mit den GEÄNDERTEN Werten, intern wird das eingearbeitet.
Bei den Flächenfunktionen muss man dann noch mit nFill (=> Xbase++ Handbuch) einstellen, ob man nur die Umrandung, nur die Füllung oder beides zeichnen will ...

Ich sehe, dass ich das in dem TEST.PRG etwas genauer zeigen sollte ;-)

Hier ist das Beispiel:

Code: Alles auswählen

 // Box in aktueller Farbe, also schwarz - this box will be printed with the current color => black
   ::PrintBox(700,900,50,50,"R", GRA_FILL ) // Parameter nFill => GraBox()
   // Box in ROT - this box in RED
   aAttribAlt := ::SetAttrArea( {{ GRA_AA_COLOR, GRA_CLR_RED }} )   // mehrere GRA_AA_ möglich ... - many GRA_AA_ possible
   ::PrintBox(700,950,50,50,"R", GRA_FILL ) // Parameter nFill => GraBox()
   ::ReSetAttrArea( aAttribAlt )
   // Box in alter Farbe, also schwarz - this box will be printed with the saved color => black
   ::PrintBox(700,1000,50,50,"R", GRA_FILL ) // Parameter nFill => GraBox()
Es druckt von oben nach unten je eine schwarze, rote und wieder schwarze Box.

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

Verfasst: Do, 19. Mai 2011 12:55
von Werner_Bayern
Servus Hubert,

danke, jetzt gehts einwandfrei. =D>

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

Verfasst: Fr, 20. Mai 2011 10:23
von brandelh
Werner_Bayern hat geschrieben:Servus Hubert,
habs auf dem kurzen Dienstweg gelöst und die printmemo-Methode geändert:

Code: Alles auswählen

//return lSuccess
return nPosY
Läuft einwandfrei, hab gesehen, Du benutzt ja in der printmemo einfach Deine printtext-Methode, bis alles gedruckt ist. Da zählst Du ja sauber die Y-Pixel Zeile für Zeile hoch. :happy7:
Für dich kannst du das natürlich gerne so machen, aber grundsätzlich muss man mehr beachten, da andere Anwender eventuell den alten Rückgabewert benötigen und weil man die Schrift ja auch gedreht drucken kann, dann braucht man nicht die neu Y sondern die neue X Position. Ich habe die Ändurungen eingearbeitet und nun 3 neue Instanzvariablen eingebaut, die von ::PrintMemo() gefüllt werden:
1.35 - 20.05.2011 (= 2011-05-20)
::PrintMemo() speichert nun die Anzahl der gedruckten Zeilen in ::PrintMemoLineCount
::PrintMemo() speichert nun die GRA-Position der letzten gedruckten Zeilen in ::PrintMemoLinePosX und ::PrintMemoLinePosY
In der Test.PRG habe ich die Anwendung für den normalen Fall dargestellt:

Code: Alles auswählen

   ::PrintMemo(  1500, nPosY, cTxt, "B" , 500 )
   nPosY := ::PrintMemoLinePosY + ::LineFeed()
   ::PrintText( 1500, nPosY , "Anzahl Zeilen: "+ntrim(::PrintMemoLineCount))
Ich denke, dass ich die 1.35 noch heute Abend auf meinen Server lade.

PS: Durch die Änderungen bin ich noch auf einen Fehler in PrintMemo() gestoßen.
Nach CRLF+CRLF im Text wurden zwar noch alle Zeilen hochgezählt, aber nicht mehr gedruckt.
Das muss schon einmal funktioniert haben. :?

PPS: Wer sich noch nicht bei der Abstimmung am Anfang des Threads beteiligt hat, soll das bitte tun ;-)

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

Verfasst: Fr, 20. Mai 2011 11:24
von Werner_Bayern
brandelh hat geschrieben:PPS: Wer sich noch nicht bei der Abstimmung am Anfang des Threads beteiligt hat, soll das bitte tun ;-)
Danke!

Wink ist angekommen und umgesetzt ;-)

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

Verfasst: Mo, 09. Jan 2012 23:30
von Werner_Bayern
Servus Hubert,

leidiges Thema, drucken mit PrintMemo.
Wie machst Du das, bzw. wie ist das vorgesehen? Ich muss A4-Seiten bedrucken und u. a. auch mit Memo-Feldern. Deren Inhalt ist ja bekanntlich variabel. Ich kann aber mit Deinen Methoden vorab nicht feststellen, ob der Ausdruck eines Memo-Feldes noch auf die aktuelle Seite (abzüglich unterer Rand) passt oder nicht. Deine Methode druckt ja (bei entsprechenden Parametern) bis zum unteren Rand und bricht dann korrekt ab, gibt dann auch ein .f. zurück.

Jetzt bräuchte ich aber was um festzustellen, wieviele Zeilen (mit Deiner Function WordwrapAT!) bereits gedruckt wurden, um den Rest (wie zu ermitteln?) auf der nächsten Seite drucken zu können. #-o

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

Verfasst: Di, 10. Jan 2012 0:48
von Werner_Bayern
Servus Hubert,

so wie es aussieht, gibt das PrintMemoLinePosY ein NIL zurück, wenn das Memofeld nur 1 Zeile enthält?

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

Verfasst: Di, 10. Jan 2012 8:54
von brandelh
Hallo Werner,

zunächst die Frage, welche Version setzt du ein ? Aktuell ist 1.35 !

Dass ein einzeiliges Memofeld NIL zurückliefert ist ein Fehler, hier habe ich nicht richtig initialisiert.
Bei MemoPrint() hingegen müsste sobald der Text nicht mehr in das vorhandene Fenster passt
ganz unten eine neue Seite aufgerufen und auch bedruckt werden:

Code: Alles auswählen

if lNeedNewPage
  ::NewPage()
  ::PrintForm()
  lNeedNewPage := .f.
endif
Dies ist z.B. dann sinnvoll, wenn man den Fließtext als Memo komplett drucken will.
Für komplexere Seiten mag das eventuell nicht passen.

Du könntest die fixen und variablen Texte in ::PrintForm() für jede Seite einzeln festlegen (die Seitennummer ist da ja bekannt.).
Dann würde PrintMemo() innerhalb seines Rahmens drucken und die anderen Bestandteile würde z.B. in einer DO Case Abfrage :PrintForm() zusteuern.

Code: Alles auswählen

oMyClass:PrintForm()
    * Drucke Bestandteile für alle Seiten ...
    ...
    do case
         case ::nPageNo=1
         case ::nPageNo=2
         case ::nPageNo=3
         case ::nPageNo>1
...
Sicherlich würde aber auch eine zusätzliche Methode Sinn machen, ich versuche das möglichst bald einzubauen:

PrintMemoPage( nPosX, nPosY, cTxt, cAusrichtung, nMaxLen, cArt, nFarbe, cHochQuer, nMaxBis,nLineFeed ) => cRestNochZuDrucken

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

Verfasst: Di, 10. Jan 2012 12:11
von Werner_Bayern
Servus Hubert,

1.35.

Ich hatte ::nFirstline nicht gesetzt, Danke für den Hinweis, jetzt wird der Rest "korrekt" gedruckt.

Es ist offensichtlich noch ein Fehler in der PrintMemo Methode: Enthält eine Zeile nur 1 Zeichen, wird diese Zeile komplett nicht gedruckt:

Code: Alles auswählen

Dies ist ein Memofeld
Zeile 1
2
3
Zeile 4
Ergibt bei mir den Ausdruck:

Code: Alles auswählen

Dies ist ein Memofeld
Zeile 1
Zeile 4

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

Verfasst: Di, 10. Jan 2012 12:58
von brandelh
Ich sehe es mir an.

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

Verfasst: Di, 24. Jan 2012 23:54
von Werner_Bayern
brandelh hat geschrieben:Ich sehe es mir an.
Servus Hubert,

hattest Du schon Gelegenheit?

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

Verfasst: Mi, 25. Jan 2012 8:53
von brandelh
Sorry, im Moment habe ich viel um die Ohren, aber ich denke diese Woche wird es noch was ;-)

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

Verfasst: Do, 26. Jan 2012 9:10
von Werner_Bayern
Danke, mach Dir keinen Stress. Wollte nur dran erinnert haben.

2 Flaschen Bio-Rotwein sind unterwegs... :wink:

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

Verfasst: Do, 26. Jan 2012 9:51
von brandelh
Das hört sich gut an, aber dass ich nach dem Genuß schneller programmiere wage ich zu bezweifeln ;-)

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

Verfasst: Do, 26. Jan 2012 10:45
von Manfred
schneller nicht, aber sicherlich viiiel lustiger... :lol:

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

Verfasst: Do, 26. Jan 2012 14:31
von Werner_Bayern
brandelh hat geschrieben:Das hört sich gut an, aber dass ich nach dem Genuß schneller programmiere wage ich zu bezweifeln ;-)
Ok, hier die Gebrauchsanweisung dazu: 1 halbes Glas vorab zum warm werden und erst nach Erfolg den Rest der ersten Flasche mit Deiner Frau genießen. Die 2. Flasche ist dann genauso zu gebrauchen bei evtl. Nachbesserungsarbeiten :angel12:

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

Verfasst: Do, 26. Jan 2012 16:47
von Werner_Bayern
Werner_Bayern hat geschrieben:Servus Hubert,

so wie es aussieht, gibt das PrintMemoLinePosY ein NIL zurück, wenn das Memofeld nur 1 Zeile enthält?
oder auch eine falsche yPos...

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

Verfasst: So, 29. Jan 2012 15:24
von Werner_Bayern
Servus Hubert,

leider noch was: Ich schaffe es nicht, printMemo (druckt ja über printText) oder printText zu zentrieren. Kann es sein, dass das nicht funktioniert? Es steht auch im Quelltext bei Dir diesbezüglich was drin.

Danke.