Drucken mit HBPrinter - Was geht wie warum ???

Moderator: Moderatoren

Wer kennt, nutzt oder verabscheut HBPrinterX ?

Ich nutze HBPrinterX ausschließlich
6
14%
Ich nutze HBPrinterX gelegentlich bzw. zusätzlich
10
24%
HBPrinterX habe ich früher mal genutzt
1
2%
geprüft, aber für mich ungeeignet
1
2%
der Schrott gehört verboten
0
Keine Stimmen
In nutze grundsätzlich keine Fremdprodukte
0
Keine Stimmen
Noch nie gehört oder kein Interesse
2
5%
Ich nutze Reportgeneratoren oder ähnliches
11
26%
Ich nehme XbpPrinter() pur
11
26%
 
Insgesamt abgegebene Stimmen: 42

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

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

Beitrag von brandelh »

Hallo,

Die Routine ist sehr lang, ich rate dazu einzelne Teile z.B. das Drucken in eigene Methoden (Funktionen) auszulagern, das ist übersichtlicher und die Felder sind ja dennoch vorhanden. Das ist aber keine Pflicht !

Ich habe in der letzten Version die Methode SAY eingeführt, die dir hier sehr zu gute kommt, da du nur die Werte etwas ändern musst (Clipper SAY 0,0 ist bei mir 1,1 ;-) )

Zunächst wird alles entfernt was mit PrintSend etc. den Drucker steuert ... das braucht man nicht.
Bei deiner ersten Abfrage ...

Code: Alles auswählen

if printready(1)
   ?
   ?
   ?
   ?
   ? "Rechnung wird gedruckt !"
   set printer on
   set device to printer
   set console off
else
   ?
   ?
   ?
   ?
   ? "Drucker nicht bereit !!!"
   ?
   ?
   ? "Bitte Taste !"
passt die Erstellung des Druckerobjektes ... siehe mein Beispiel (TEST-SAY.PRG)
...

Code: Alles auswählen

? "Test_SAY.EXE - Printertest"
oHBPrinter := HBPrinter():New():create()
if oHBPrinter:IsPrinterError()             // Fehler verhindern, avoid errors
   *** KEIN STANDARDDRUCKER FESTGEGT -> FEHLERMELDUNG UND ENDE !
   *** eventuell ist gar kein Drucker installiert, darum muss sich der Admin kümmern, das geht uns nichts an.
else
   *** Hier legst du einmalig fest welche Schriftarten du verwenden möchtest, wenn du NUR eine willst, kein Problem
   // oHBPrinter:setFontMode(XBPPRN_FONTMODE_GRAPHIC)
   oHBPrinter:addFont("12.Courier New" ) // -> 10CPI
   oHBPrinter:addFont("10.Courier New" ) // -> 12CPI
   oHBPrinter:addFont(" 7.Courier New" ) // -> 17CPI
   oHBPrinter:addFont("12.Verdana" )     // why not, but don't use Blanks to format.
   // ich verwende normalerweise # defines um mir das MERKEN zu erleichtern ;-)
   #define FONT_10CPI 1
   #define FONT_12CPI 2
   #define FONT_17CPI 3    etc.
   // im Code kannst du dann jederzeit die gewünschte Schriftart über den Index einstellen, 
   oHBPrinter:SetFont(FONT_10CPI)

   ...

Also einfachstes Beispiel, nur 10 CPI Schrift, dann reicht folgendes

Code: Alles auswählen

oHBPrinter := HBPrinter():New():create()
if oHBPrinter:IsPrinterError()             // Fehler verhindern, avoid errors
  msgbox("Kein Standarddrucker installiert, Ausdruck nicht möglich")
  return
else
   oHBPrinter:addFont("12.Courier New" ) // -> 10CPI
   oHBPrinter:SetFont(1)
endif
Nun kommen ja jede Menge Zeilen, die Sachen speichern, aber irgendwann kommt dann wieder eine Zeile mit ....

Code: Alles auswählen

if printready(1)
diese folgenden Zeilen fliegen komplett, denn der Druckspooler von Windows regelt das ohne unser Zutun und wir haben eh wenig Einfluss darauf.

Wir steuern nur die verschiedenen Druckausgaben ... das Druckerobjekt haben wir ja noch...


ich mach jetzt mal eine Pause ...
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

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

Beitrag von brandelh »

... so und nun zu den eigentlichen Druckausgaben ... wie gesagt ICH mache die normalerweise in eigene Methoden / Funktionen, aber es geht auch so ...

Ich vermute damit fängt es an ...

Code: Alles auswählen

******************* Kopf und Anschrift drucken **************
    printsend(027)
    printsend(087)
    printsend(001)
    @03,03 say drname
*** "KELSTERB.- TRUCK - SERVICE"
*    @04,06 say drname1
*** "INTERNATIONALE SPEDITION"
    printsend(027)
    printsend(087)
    printsend(000)
    @03,10 say drname1
    @04,06 say drinhaber
    @06,06 say drstrasse
*** "Im Taubengrund 21"
*    @06,46 say drinhaber
Printsend() fliegt wie gesagt raus, aber vermutlich werden damit Schriftgrößen gesteuert, die haben wir ja vordefiniert ...
nun dieser Text mit meiner Routine ... die Schriften verwende ich mal nach Gefühl ...

Ich nutze hier jetzt jeweils pro Ausdruck ein neuen Druckauftrag, das könnte man auch anders regeln, aber so wird jede Seite sofort gedruckt...

Code: Alles auswählen

   oHBPrinter:StartDoc("Kopf und Anschrift drucken") // das zeigen Laserdrucker an ;-)  ==> Druckjob ANFANG
    
   ...
   // 10 Zeichen pro Zoll - eventuell auch FETT -> das regelt der eingestellte FONT  ! -> XbpFont()...
   oHBPrinter:SetFont(FONT_10CPI)    // Anschrift in 10 CPI
   oHBPrinter:say( 4, 4, drname)           // @03,03 say drname -> Syntax und Möglichkeiten sind im Quellcode
   oHBPrinter:say( 4,11, drname1)     // also immer Zeile und Spalte +1, Datenfeld muss nicht Text sein.
   oHBPrinter:say( 5, 7, drinhaber)     //  @04,06 say drinhaber
   ...
   // 17 CPI für Kleingedrucktes
   oHBPrinter:SetFont(FONT_17CPI)    // z.B. Absender über der Anschrift ?
   oHBPrinter:say( 3, 4, cMeinAbsender)           // @03,03 say drname -> Syntax und Möglichkeiten sind im Quellcode
   oHBPrinter:say( 4,11, drname1)     // also immer Zeile und Spalte +1, Datenfeld muss nicht Text sein.
   oHBPrinter:say( 5, 7, drinhaber)     //  @04,06 say drinhaber
   ...
   nun den Rest der Seite

WICHTIG !!!

@ SAY löst bei Clipper und Xbase ja normalerweise einen Seitenumbruch aus.
Daher muss man immer so schön die Reihenfolge überlegen ... DAS IST HIER NICHT SO !

Du kannst zu jeder Zeit überall drucken, die Reihenfolge spielt keine Rolle ...
und du musst in deinen Daten irgendwann erkennen, dass du eventuell eine neue Seite brauchst...

Code: Alles auswählen

   oHBPrinter:say(15,30,"Letzter Text der alten Seite ")
   ... nun erkenne ich dass ich eine neue Seite brauche ... 
   oHBPrinter:newPage()
   ... und mache die einfach !
   oHBPrinter:say(15,30,"Text auf den Folgeseite")
Wenn alles gedruckt ist, muss man den Druckjob beenden, damit auch Windows das weiß.

Code: Alles auswählen

 oHBPrinter:EndDoc()  ==> Druckjob ENDE
Das Druckerobjekt ist immer noch vorhanden und man kann weitere Seiten drucken (Startdoc() ...)
Irgendwann hat man alles gedruckt und dann muss man das Druckerobjekt (besser SOLLTE MAN)
auch wieder sauber schließen ...

Code: Alles auswählen

oHBPrinter:destroy()
ich sehe gerade, dass ich dies in meinen Beispielen nicht getan habe, die werden aber mit QUIT sowieso beendet.
Besser man ruft das so auf.

Durch den Druckspooler ist nicht klar, ob der Druckjob wirklich gedruckt wurde !
Ich nutze dazu eine Abfrage nach der Druckausgabe "Alles OK ?" ... aber das hat nichts mit Drucken zu tun.

Eines noch ... MAN KANN einen Drucker vorgeben, aber normalerweise nimmt man einfach den Standarddrucker.
Wenn man HBPrintDialog() nutzen möchte, muss man die Klasse ableiten und die Methoden PRINT() und PrintForm ()
so anpassen, dass alle fixen FORMular Daten in PrintForm gedruckt werden und Print() jede Seite erzeugen kann.
Für den Anfang ist das komplexer.
Gruß
Hubert
Benutzeravatar
messing
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 216
Registriert: Mi, 13. Jan 2010 9:42
Wohnort: Lauterbach / Hessen

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

Beitrag von messing »

brandelh hat geschrieben:Hallo,

Die Routine ist sehr lang, ich rate dazu einzelne Teile z.B. das Drucken in eigene Methoden (Funktionen) auszulagern, das ist übersichtlicher und die Felder sind ja dennoch vorhanden. Das ist aber keine Pflicht !

Ich habe in der letzten Version die Methode SAY eingeführt, die dir hier sehr zu gute kommt, da du nur die Werte etwas ändern musst (Clipper SAY 0,0 ist bei mir 1,1 ;-) )

Zunächst wird alles entfernt was mit PrintSend etc. den Drucker steuert ... das braucht man nicht.
Bei deiner ersten Abfrage ...

Code: Alles auswählen

if printready(1)
   ?
   ?
   ?
   ?
   ? "Rechnung wird gedruckt !"
   set printer on
   set device to printer
   set console off
else
   ?
   ?
   ?
   ?
   ? "Drucker nicht bereit !!!"
   ?
   ?
   ? "Bitte Taste !"
passt die Erstellung des Druckerobjektes ... siehe mein Beispiel (TEST-SAY.PRG)
...

Code: Alles auswählen

? "Test_SAY.EXE - Printertest"
oHBPrinter := HBPrinter():New():create()
if oHBPrinter:IsPrinterError()             // Fehler verhindern, avoid errors
   *** KEIN STANDARDDRUCKER FESTGEGT -> FEHLERMELDUNG UND ENDE !
   *** eventuell ist gar kein Drucker installiert, darum muss sich der Admin kümmern, das geht uns nichts an.
else
   *** Hier legst du einmalig fest welche Schriftarten du verwenden möchtest, wenn du NUR eine willst, kein Problem
   // oHBPrinter:setFontMode(XBPPRN_FONTMODE_GRAPHIC)
   oHBPrinter:addFont("12.Courier New" ) // -> 10CPI
   oHBPrinter:addFont("10.Courier New" ) // -> 12CPI
   oHBPrinter:addFont(" 7.Courier New" ) // -> 17CPI
   oHBPrinter:addFont("12.Verdana" )     // why not, but don't use Blanks to format.
   // ich verwende normalerweise # defines um mir das MERKEN zu erleichtern ;-)
   #define FONT_10CPI 1
   #define FONT_12CPI 2
   #define FONT_17CPI 3    etc.
   // im Code kannst du dann jederzeit die gewünschte Schriftart über den Index einstellen, 
   oHBPrinter:SetFont(FONT_10CPI)

   ...

Also einfachstes Beispiel, nur 10 CPI Schrift, dann reicht folgendes

Code: Alles auswählen

oHBPrinter := HBPrinter():New():create()
if oHBPrinter:IsPrinterError()             // Fehler verhindern, avoid errors
  msgbox("Kein Standarddrucker installiert, Ausdruck nicht möglich")
  return
else
   oHBPrinter:addFont("12.Courier New" ) // -> 10CPI
   oHBPrinter:SetFont(1)
endif
Nun kommen ja jede Menge Zeilen, die Sachen speichern, aber irgendwann kommt dann wieder eine Zeile mit ....

Code: Alles auswählen

if printready(1)
diese folgenden Zeilen fliegen komplett, denn der Druckspooler von Windows regelt das ohne unser Zutun und wir haben eh wenig Einfluss darauf.

Wir steuern nur die verschiedenen Druckausgaben ... das Druckerobjekt haben wir ja noch...


ich mach jetzt mal eine Pause ...
Danke, habe die printready Abfrage und printsend Anweisungen deaktiviert,
sieht jetzt so aus.

Code: Alles auswählen

    					// if printready(1)

oHBPrinter := HBPrinter():New():create()
if oHBPrinter:IsPrinterError()             // Fehler verhindern, avoid errors
   *** KEIN STANDARDDRUCKER FESTGEGT -> FEHLERMELDUNG UND ENDE !
   *** eventuell ist gar kein Drucker installiert, darum muss sich der Admin kümmern, das geht uns nichts an.
   msgbox("Kein Standarddrucker installiert, Ausdruck nicht möglich")
   return
else
   *** Hier legst du einmalig fest welche Schriftarten du verwenden möchtest, wenn du NUR eine willst, kein Problem
		// oHBPrinter:setFontMode(XBPPRN_FONTMODE_GRAPHIC)
   oHBPrinter:addFont("12.Courier New" ) // -> 10CPI
   oHBPrinter:addFont("10.Courier New" ) // -> 12CPI
   oHBPrinter:addFont(" 7.Courier New" ) // -> 17CPI
   oHBPrinter:addFont("12.Verdana" )    
   						// why not, but don't use Blanks to format.
						// ich verwende normalerweise # defines um mir das MERKEN zu erleichtern ;-)
   #define FONT_10CPI 1
   #define FONT_12CPI 2
   #define FONT_17CPI 3 //   etc.
						// im Code kannst du dann jederzeit die gewünschte Schriftart über den Index einstellen, 
		//   oHBPrinter:SetFont(FONT_10CPI)

   oHBPrinter:SetFont(1)


        inkey(0)
        use
        temp1:=laufwerk1 + "\" + "drucken.dbf"
        filedelete(temp1)
        select arbeit
        set filter to
        go top
        wclose(fenster2)
        return
    endif
********************** Rechnungsdatenkank etc. **********
    if rgfrage="J"
        use rgdat index rgdzaeh,rgdnumm,rgdkd_b alias rechnung shared new
        append blank
        select rechnung
        rechnr:=dtos(date()) + str(recno(),5)
        rgnummer:=strtran(rechnr," ","0")
        replace zaehler with recno()
        replace rg_nummer with rgnummer
        replace kd_bez with eauftraggeber
        replace dm_netto with summe1
        replace mwsteuer with emwst1
        replace dm_steuer with summe2
        replace dm_summe with summe3
        replace dm_gebueh with 0
        replace dm_endbet with summe3
        replace saetze with satzzahl
        replace rg_datum with date()
        replace rg_von_dat with rgvondat
        replace rg_bis_dat with rgbisdat
        replace rg_von_pos with rgvonpos
        replace rg_bis_pos with rgbispos
        replace kfzart with ekfzart
        use
        select drucken

        altbereich:=SELECT()
        select arbeit
        go top
        flock()
        replace rechnung with "X" all
        unlock
        select (altbereich)

    endif
******************* Kopf und Anschrift drucken **************
						//    printsend(027)
						//    printsend(087)
						//    printsend(001)
    @03,03 say drname
*** "KELSTERB.- TRUCK - SERVICE"
*    @04,06 say drname1
*** "INTERNATIONALE SPEDITION"
						//    printsend(027)
						//    printsend(087)
						//    printsend(000)
Bei den Font? 1o.Courier,12.Courier,7.Courier steht 12,10,17 CPI. Tippfehler oder richtig?
Wenn richtig, bitte kurze Info, wieso 10.Courier gleich 12 CPI und 7.Courier gleich 17 CPI.
Dachte, die Zahl bei Courier wäre die CPI.
Ich glaub, ich muß noch viel lernen =D>
Gruß
Messing
Gruß
Bruno
Messing
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16508
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

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

Beitrag von Martin Altmann »

Moin,
ich habe mal Deine fehlerhaften code-Tags korrigiert. Also nicht wundern, dass es jetzt anders aussieht!
CPI heißt Characters Per Inch (also Zeichen por Zoll). Je größer der Wert, desto kleiner die Schrift!
Die Punktangabe bei den Schriftarten hat nichts mit CPI zu tun, sondern (müssten) Twips (sein). Ein Twip ist 1/20 Point - also 1/1440 Zoll.

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

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

Beitrag von brandelh »

Hallo,

zunächst sollte man die Zitate etwas kürzen, sonst kann man nicht erkennen um was es eigentlich geht ;-)
messing hat geschrieben:Bei den Font? 1o.Courier,12.Courier,7.Courier steht 12,10,17 CPI. Tippfehler oder richtig?
Das ist schon richtig, wenn auch nicht 100% genau ;-)

UNTER DOS oder Schreibmaschinen wurden Schriften mit gleicher Breite je Zeichen verwendet, wie z.B. auch im CODE Tag:

Code: Alles auswählen

1234567890
iiiiiiiiii
MMMMMMMMMM
Heute nutzt man Schriften, wie Arial etc. bei denen alle Zeichen eine eigene Breite haben (alle Ziffern sind gleich).
1234567890
iiiiiiiiii
MMMMMMMMMM
CPI heißt nun Zeichen Pro Zoll (Char Per Inch) 10 Zeichen brauchen also 2,56 cm in der Breite !
12 Point sind 12/72 Zoll in der Zeichenhöhe (ob mit oder ohne Unterlängen weiß ich jetzt auch nicht).

Courier New ist eine moderen "altmodische" FixedFont Schrift, bei der 12. Punkt in etwa 10 Zeichen auf 2,56 cm ergeben.
Jede andere Schrift wird das anders regeln ;-)
messing hat geschrieben:Ich glaub, ich muß noch viel lernen =D>
JA das ist so ... aber geht es uns nicht allen so :D
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

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

Beitrag von brandelh »

Hi,

ein Tipp zu den Schriften und Schriftgrößen ...

Ich habe mir vor Jahren ein Dokument mit AmiPro gemacht (heute OpenOffice oder MS Word ;-) )
und habe eine Zeile Text geschrieben.
Diese habe ich dann kopiert und von 6 Punkt bis 30 Punkt, jede Zeile 1 Punkt größer auf Folie gedruckt.
Mit 2 bis 3 Schriftarten und man bekommt ein Gefühl wie die Schriften wirken.

Auf ähnliche Weise habe ich den Standardabstand für Schriften ermittelt.
Anfangs (heute ?) konnte man den Rückgaben dazu von Alaska nicht vertrauen.
Das war mir zu eng. So habe ich mir in 12 Punkt Times New Roman einige Zeilen
gedruckt und nachgemessen. Ich stamme halt aus einer Handwerker Familie 8)
Gruß
Hubert
Benutzeravatar
messing
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 216
Registriert: Mi, 13. Jan 2010 9:42
Wohnort: Lauterbach / Hessen

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

Beitrag von messing »

messing hat geschrieben:Vielen Dank für die erste Hilfe per E-Mail.
Habe hbprint erfolgreich eingebunden.
Werde hbprintd auch einbinden, da dann die Druckerauswahl vorhanden sein sollte.

Da ich jedoch noch nicht weiß, wie ich wo und wann etwas bewirke, anbei mein Druckmodul.

Wäre Dankbar, wenn Du an entsprechenden Stellen zeigst wo und was

Danke
Messing


Code: Alles auswählen

* Programmname        : rech01.prg Rechnungsmodul - provisorisch
* wird aufgerufen von : haupt.prg
* Letzte Žnderung am  : 05.09.92
*  Auftraggerberlisten und Summen
* SET FUNKTIONEN
* --------------
* VARIABLEN
* -------------------------------------------------------------------------
* PRIVATE = In dieser Routine und in Unterroutinen
* PUBLIC  = In allen Routinen (auch šbergeordnete)
* LOCAL   = NUR in der aktuellen Routine
* STATIC  = NUR in der aktuellen Routine aber auch noch nach dem Verlassen!
* -------------------------------------------------------------------------
*---------------------------HAUPTPROGRAMM----------------------------------
PROCEDURE rech01
field zaehler,datum1,auftraggeb,ladestelle,termin1,colli,kg_m3,entladeste
field termin2,fahrzeug,fahrer,zeichen,dm_km,dm_pauscha,kilometer,dm_ok,km_ok
field datum2,zeit2,in_ausland,kfzart,pronummer,gebuehren,mwsteuer,rechnung
field name1,name2,strasse,plz_ort,kd_bez,druck
field rg_nummer,dm_netto,dm_steuer,dm_summe,dm_gebueh,dm_enbet,saetze
field rg_von_dat,rg_bis_dat,rg_von_pos,rg_bis_pos

field e_name,e_name1,e_inhaber,e_strasse,e_ort,e_tel,e_tel1,e_fax,b_name1
field b_lz1,kto_nr1
field dm_kg

memvar fenster2,getlist,taste1,laufwerk1
local eauftraggeber,evon1,evon2,ebis1,ebis2,ekfzart,ein_ausland,rgfrage
local edruck
local eingabeok
local periode
local satzzahl
local rechnr,rgnummer
local temp1,temp2
local rgvondat,rgbisdat,rgvonpos,rgbispos
local cotemp1

local drname,drname1,drinhaber,drstrasse,drort,drtel,drtel1,drfax,drbname1
local drblz1,drktonr1

local altbereich

************ Adressvariablen ****************
local ename1,ename2,estrasse,eanschrift
local seitenzahl,position
************ Steuer- Betragsvariablen *********************************
local emwst1,emwst2,summe1,summe2,summe3,summe4,summe5
set decimals to 2
temp1:=laufwerk1 + "\" + "drucken.dbf"

use selbst shared new
drname:=e_name
drname1:=e_name1
drinhaber:=e_inhaber
drstrasse:=e_strasse
drort:=e_ort
drtel:=e_tel
drtel1:=e_tel1
drfax:=e_fax
drbname1:=b_name1
drblz1:=b_lz1
drktonr1:=kto_nr1
use

select felder
evon1:=zaehler
evon2:=date()
**ctod("")
ebis1:=zaehler
ebis2:=date()
**ctod("")
eauftraggeber:="***"    // auftraggeb
ekfzart:=kfzart
ein_ausland:="*"      // in_ausland
periode:=space(2)
rgfrage:="J"
eingabeok:="N"
select arbeit
fenster2:=wopen(1,0,24,79)
wbox()
CLS
@ 01,00 say center("Auftraggeber - Rechnung - Modul")
set confirm on
SET ESCAPE off
setcursor(1)
@ 03,05 say "Bitte Namen w„hlen:"
SAVE SCREEN
do while eauftraggeber="***"
    kunden->(DBEDIT( 3, 27, 20, 48,{"kd_bez"},,,{"KUNDENLISTE"}))
    eauftraggeber:=kunden->KD_BEZ
enddo
RESTORE SCREEN
@ 03,28 say eauftraggeber       // picture "@!"
@ 05,05 say "Von / Pos.Nr.:"
@ 05,20 get evon1
@ 05,35 say "Bis / Pos.Nr.:"
@ 05,50 get ebis1
@ 07,05 say "VON / BIS = 0 - Abfrage nach Datum"
@ 09,05 say "Von / Termin :"
@ 09,20 get evon2 picture "@D" when evon1=0 .and. ebis1=0
@ 09,35 say "Bis / Termin :"
@ 09,50 get ebis2 picture "@D" when evon1=0 .and. ebis1=0
@ 11,05 say "Kfzart:"
@ 11,25 say "****** = Alles"
read
SAVE SCREEN
use kfz01 shared new
DBEDIT(10, 14, 20, 22,{"kfzart"},,,{"KFZART"})
ekfzart:=KFZART
RESTORE SCREEN
use
select arbeit
@ 11,13 say ekfzart    // picture "@!"
@ 11,25 say "Inland - Ausland (I/A/*):"
@ 11,51 get ein_ausland picture "@!" valid ein_ausland="I" .or. ein_ausland="A" ;
.or. ein_ausland="*"
@ 11,54 say "* = Alles"
@ 13,05 say "Periode (1 - 13):"
@ 13,23 get periode picture "99"
@ 15,05 say "Mit Rechnungsnummer ? (J/N)"
@ 15,34 get rgfrage picture "@!" valid rgfrage="J" .or. rgfrage="N"
@ 17,05 say "Eingabe OK ? (J/N)"
@ 17,25 get eingabeok picture "!@" valid eingabeok="J" .or. eingabeok="N"
read
if eingabeok="N"
    wclose(fenster2)
    return
endif
********** Anschrifteingabe *************
select kunden
emwst1:=0
cls
eauftraggeber=kd_bez
ename1:=name1
ename2:=name2
estrasse:=strasse
eanschrift:=plz_ort
edruck:=druck
@ 03,05 say "Firmenname:"
@ 04,05 say ename1
@ 06,05 say ename2
@ 08,05 say "Straáe:"
@ 09,05 say estrasse
@ 11,05 say "Postleitzahl und Ort:"
@ 12,05 say eanschrift
@ 15,05 say "MwSt.:"
@ 16,06 get emwst1 picture "##.##"
read
setcursor(0)
select arbeit
if edruck="J"
    if evon1=0 .and. ebis1=0
        set filter to auftraggeb=eauftraggeber .and. termin1>=evon2 .and. termin1<=ebis2
    else
        set filter to auftraggeb=eauftraggeber .and. zaehler>=evon1 .and. zaehler<=ebis1
    endif
    go top
    copy to (temp1) // drucken
    use (temp1) exclusive new
    index on zaehler to tempzae
    select drucken
    if ekfzart="******" .and. ein_ausland="*"
        set filter to
        go top
    endif
    if ein_ausland="*" .and. ekfzart<>"******"
        set filter to kfzart=ekfzart
        go top
    endif
    if ein_ausland<>"*" .and. ekfzart="******"
        set filter to in_ausland=ein_ausland
        go top
    endif
    if ein_ausland<>"*" .and. ekfzart<>"******"
        set filter to kfzart=ekfzart .and. in_ausland=ein_ausland
        go top
    endif
    go top
    rgvondat:=termin1
    rgvonpos:=zaehler
    go bottom
    rgbisdat:=termin1
    rgbispos:=zaehler
    go top
    count to satzzahl
    if satzzahl=0
        use
        temp1:=laufwerk1 + "\" + "drucken.dbf"
        if filedelete(temp1)
            cls
            ?
            ? "Keine Daten zum Druck vorhanden !!!"
            ?
            ? "Bitte Taste!"
            inkey(0)
            select arbeit
            set filter to
            go top
            wclose(fenster2)
            return
        endif
    endif
    sum dm_pauscha to summe1
    summe1:=round(summe1,2)
    if emwst1 > 0
        summe2:=round(summe1/100*emwst1,2)
    else
        summe2:=0
    endif
    emwst1:=round(emwst1,2)
    summe2:=round(summe2,2)
    summe3:=round(summe1+summe2,2)
    summe3:=round(summe3,2)
    cls
    ?
    ? ename1
    ? ename2
    ? estrasse
    ? eanschrift
    ?
    ? "Netto:         ",summe1
    ? "Mehrwertsteuer:",summe2
    ? "Endbetrag:     ",summe3
    ?
    ?
    ?
    go top
    if printready(1)
        ?
        ?
        ?
        ?
        ? "Rechnung wird gedruckt !"
        set printer on
        set device to printer
        set console off
    else
        ?
        ?
        ?
        ?
        ? "Drucker nicht bereit !!!"
        ?
        ?
        ? "Bitte Taste !"
        inkey(0)
        use
        temp1:=laufwerk1 + "\" + "drucken.dbf"
        filedelete(temp1)
        select arbeit
        set filter to
        go top
        wclose(fenster2)
        return
    endif
********************** Rechnungsdatenkank etc. **********
    if rgfrage="J"
        use rgdat index rgdzaeh,rgdnumm,rgdkd_b alias rechnung shared new
        append blank
        select rechnung
        rechnr:=dtos(date()) + str(recno(),5)
        rgnummer:=strtran(rechnr," ","0")
        replace zaehler with recno()
        replace rg_nummer with rgnummer
        replace kd_bez with eauftraggeber
        replace dm_netto with summe1
        replace mwsteuer with emwst1
        replace dm_steuer with summe2
        replace dm_summe with summe3
        replace dm_gebueh with 0
        replace dm_endbet with summe3
        replace saetze with satzzahl
        replace rg_datum with date()
        replace rg_von_dat with rgvondat
        replace rg_bis_dat with rgbisdat
        replace rg_von_pos with rgvonpos
        replace rg_bis_pos with rgbispos
        replace kfzart with ekfzart
        use
        select drucken

        altbereich:=SELECT()
        select arbeit
        go top
        flock()
        replace rechnung with "X" all
        unlock
        select (altbereich)

    endif
******************* Kopf und Anschrift drucken **************
    printsend(027)
    printsend(087)
    printsend(001)
    @03,03 say drname
*** "KELSTERB.- TRUCK - SERVICE"
*    @04,06 say drname1
*** "INTERNATIONALE SPEDITION"
    printsend(027)
    printsend(087)
    printsend(000)
    @03,10 say drname1
    @04,06 say drinhaber
    @06,06 say drstrasse
*** "Im Taubengrund 21"
*    @06,46 say drinhaber
*** "Inh. Rainer Dittel"
    @07,06 say drort
*** "65451 Kelsterbach"
    @07,46 say "Bankverbindung:"
    @08,06 say drtel
*** "Tel.: 06107/3023"
    @08,46 say drbname1
*** "Kreissparkasse Gross - Gerau"
    @09,06 say drfax
*** "Fax: 06107/61706"
    @09,46 say "Kto.:"
    @09,51 say drktonr1
    @09,62 say "BLZ:"
    @09,66 say drblz1
***  5108337    BLZ:508 52 553"
    @13,06 say ename1
    @14,06 say ename2
    @15,06 say estrasse
    @16,06 say eanschrift
    @18,46 say "Datum:"
    @18,54 say date()
    @ 20,06 say "R E C H N U N G"
    if rgfrage="J"
        @ 20,22 say "-"
        @ 20,24 say rgnummer
    endif
    if periode<>" "
        @ 20,46 say "Periode:"
        @ 20,56 say periode
    endif
    @ 22,05 say ekfzart
    if ein_ausland="I"
        @ 22,25 say "Inland"
    endif
    if ein_ausland="A"
        @ 22,25 say "Ausland"
    endif
    @ 24,05 say "Pr.-Nr.:             von:                 nach:               Betrag:"
    setprc(0,0)
    position:=0
    go top
    do while .not. eof()
        do while position < 35
            @ 01,05 say pronummer
            @ 01,26 say ladestelle
            @ 01,47 say entladeste
            @ 01,68 say dm_pauscha
            setprc(0,0)
            skip
            if .not. eof()
                position:=position+1
                if position=35
                    eject
                    position:=40
                endif
            else
                position:=100
            endif
        enddo
        do while position < 100
            if position=40
                @ 04,05 say "Pr.-Nr.:             von:                 nach:               Betrag:"
                setprc(0,0)
            endif
            @ 01,05 say pronummer
            @ 01,26 say ladestelle
            @ 01,47 say entladeste
            @ 01,68 say dm_pauscha
            setprc(0,0)
            skip
            if eof()
                position:=100
            else
                position:=position+1
                if position=95
                    eject
                    position:=40
                endif
            endif
        enddo
    enddo
    @ 03,05 say "Nettosumme / DM"
    @ 03,25 say "MwSt.:"
    @ 03,32 say emwst1
    @ 03,38 say "%"
    @ 03,51 say "Rechnungsbetrag / DM :"
    @ 04,05 say summe1
    @ 04,25 say summe2
    @ 04,51 say summe3
    setprc(0,0)
    printsend(027)
    printsend(087)
    printsend(001)
    @02,03 say "Rechnungsbetrag:"
    @02,18 say summe3
    @02,34 say "DM"
    printsend(027)
    printsend(087)
    printsend(000)
    setprc(0,0)
    if printready(1)
        eject
        set printer off
        set console on
        set device to screen
        use
        if rgfrage="J"
            temp1:=laufwerk1 + "\" + "drucken.dbf"
            temp2:="rgdaten\"+substr(rgnummer,3,6)+substr(rgnummer,-2)+".dbf"
            if filemove(temp1,temp2)=0
                ?
                ? "Druck beendet!!!"
                ?
            else
                temp1:=laufwerk1 + "\" + "drucken.dbf"
                if filedelete(temp1)
                    ?
                    ? "Druck beendet!!!"
                    ?
                endif
            endif
            select arbeit
        endif
    endif
endif
if edruck="N" .or. edruck=" "
    if evon1=0 .and. ebis1=0
        set filter to auftraggeb=eauftraggeber .and. termin1>=evon2 .and. termin1<=ebis2
    else
        set filter to auftraggeb=eauftraggeber .and. zaehler>=evon1 .and. zaehler<=ebis1
    endif
** set filter to zaehler >= evon1 .and. zaehler <= ebis1 .and. auftraggeb=eauftraggeber
    go top
    copy to (temp1) // drucken
    use (temp1) exclusive new
    index on zaehler to tempzae
    select drucken
    if ekfzart="******" .and. ein_ausland="*"
        set filter to
        go top
    endif
    if ein_ausland="*" .and. ekfzart<>"******"
        set filter to kfzart=ekfzart
        go top
    endif
    if ein_ausland<>"*" .and. ekfzart="******"
        set filter to in_ausland=ein_ausland
        go top
    endif
    if ein_ausland<>"*" .and. ekfzart<>"******"
        set filter to kfzart=ekfzart .and. in_ausland=ein_ausland
        go top
    endif
    go top
    go top
    rgvondat:=termin1
    rgvonpos:=zaehler
    go bottom
    rgbisdat:=termin1
    rgbispos:=zaehler
    go top
    count to satzzahl
    if satzzahl=0
        use
        temp1:=laufwerk1 + "\" + "drucken.dbf"
        if filedelete(temp1)
            cls
            ?
            ? "Keine Daten zum Druck vorhanden !!!"
            ?
            ? "Bitte Taste!"
            inkey(0)
            select arbeit
            set filter to
            go top
            wclose(fenster2)
            return
        endif
    endif
    sum dm_pauscha to summe1
    summe1:=round(summe1,2)
    if emwst1 > 0
        summe2:=round(summe1/100*emwst1,2)
    else
        summe2:=0
    endif
    emwst1:=round(emwst1,2)
    summe2:=round(summe2,2)
    summe3:=round(summe1+summe2,2)
    summe3:=round(summe3,2)
    sum gebuehren to summe4
    summe4:=round(summe4,2)
    summe5:=round(summe4+summe3,2)
    summe5:=round(summe5,2)
    cls
    ?
    ? ename1
    ? ename2
    ? estrasse
    ? eanschrift
    ?
    ? "Netto:          ",summe1
    ? "Mehrwertsteuer: ",summe2
    ? "Endbetrag:      ",summe3
    ? "Gebhren:       ",summe4
    ? "Rechnungsbetrag:",summe5
    ?
    go top
    if printready(1)
        ?
        ?
        ?
        ?
        ? "Rechnung wird gedruckt !"
        set printer on
        set device to printer
        set console off
    else
        ?
        ?
        ?
        ?
        ? "Drucker nicht bereit !!!"
        ?
        ?
        ? "Bitte Taste !"
        inkey(0)
        use
        temp1:=laufwerk1 + "\" + "drucken.dbf"
        filedelete(temp1)
        select arbeit
        set filter to
        go top
        wclose(fenster2)
        return
    endif
********************** Rechnungsdatenkank etc. **********
    if rgfrage="J"
        use rgdat index rgdzaeh,rgdnumm,rgdkd_b alias rechnung shared new
        append blank
        select rechnung
        rechnr:=dtos(date()) + str(recno(),5)
        rgnummer:=strtran(rechnr," ","0")
        replace zaehler with recno()
        replace rg_nummer with rgnummer
        replace kd_bez with eauftraggeber
        replace dm_netto with summe1
        replace mwsteuer with emwst1
        replace dm_steuer with summe2
        replace dm_summe with summe3
        replace dm_gebueh with summe4
        replace dm_endbet with summe5
        replace saetze with satzzahl
        replace rg_datum with date()
        replace rg_von_dat with rgvondat
        replace rg_bis_dat with rgbisdat
        replace rg_von_pos with rgvonpos
        replace rg_bis_pos with rgbispos
        replace kfzart with ekfzart
        use
        select drucken

        altbereich:=SELECT()
        select arbeit
        go top
        flock()
        replace rechnung with "X" all
        unlock
        select (altbereich)

    endif
******************* Kopf und Anschrift drucken **************
    printsend(027)
    printsend(087)
    printsend(001)
    @03,03 say drname
*** "KELSTERB.- TRUCK - SERVICE"
*    @04,06 say drname1
*** "INTERNATIONALE SPEDITION"
    printsend(027)
    printsend(087)
    printsend(000)
    @03,10 say drname1
    @04,06 say drinhaber
    @06,06 say drstrasse
*** "Im Taubengrund 21"
*    @06,46 say drinhaber
*** "Inh. Rainer Dittel"
    @07,06 say drort
*** "65451 Kelsterbach"
    @07,46 say "Bankverbindung:"
    @08,06 say "Tel.:"
    @08,12 say drtel
*** "Tel.: 06107/3023"
    @08,46 say drbname1
*** "Kreissparkasse Gross - Gerau"
    @09,06 say "Fax:"
    @09,11 say drfax
*** "Fax: 06107/61706"
    @09,46 say "Kto.:"
    @09,51 say drktonr1
    @09,62 say "BLZ:"
    @09,66 say drblz1
***  5108337    BLZ:508 52 553"
    @13,06 say ename1
    @14,06 say ename2
    @15,06 say estrasse
    @16,06 say eanschrift
    @18,46 say "Datum:"
    @18,54 say date()
******************* Kopf und Anschrift drucken **************
    @20,06 say "R E C H N U N G"
    if rgfrage="J"
        @ 20,22 say "-"
        @ 20,24 say rgnummer
    endif
    ?
    setprc(0,0)
    position:=0
    do while .not. eof()
        do while position < 6
            @ 02,05 say "Posnr.:"
            @ 02,15 say "Pr.-Nr.:"
            @ 02,39 say "KFZ-Art"
            @ 02,50 say "Termin:"
            if gebuehren > 0
                @ 02,65 say "Gebhren:"
            endif
            @ 03,05 say zaehler
            @ 03,15 say pronummer
            @ 03,39 say kfzart
            @ 03,50 say termin1
            if gebuehren > 0
                @ 03,65 say gebuehren
            endif
            @ 04,05 say "Von:"
            @ 04,28 say "Nach:"
            @ 04,50 say "Colli:"
            @ 04,58 say "KG:"
            @ 04,65 say "KM:"
***            @ 04,71 say "Betrag:"
            @ 05,05 say ladestelle
            @ 05,28 say entladeste
            @ 05,50 say colli
            @ 05,58 say kg_m3
            @ 05,65 say kilometer
***            @ 05,71 say dm_pauscha
            @ 06,05 say "DM / KM:"
            @ 06,20 say "DM / KG:"
            @ 06,70 say "Betrag:"
            @ 07,05 say dm_km
            @ 07,20 say dm_kg
            @ 07,70 say dm_pauscha
            @ 08,05 say "--------------------------------------------------------------------------"
            setprc(0,0)
            skip
            if .not. eof()
                position:=position+1
                if position=5
                    eject
                    position:=10
                endif
            else
                position:=25
            endif
        enddo
        do while position < 17
            if position=10
                ?
                ?
                ?
                ?
                setprc(0,0)
            endif
            @ 02,05 say "Posnr.:"
            @ 02,15 say "Pr.-Nr.:"
            @ 02,39 say "KFZ-Art"
            @ 02,50 say "Termin:"
            if gebuehren > 0
                @ 02,65 say "Gebhren:"
            endif
            @ 03,05 say zaehler
            @ 03,15 say pronummer
            @ 03,39 say kfzart
            @ 03,50 say termin1
            if gebuehren > 0
                @ 03,65 say gebuehren
            endif
            @ 04,05 say "Von:"
            @ 04,28 say "Nach:"
            @ 04,50 say "Colli:"
            @ 04,58 say "KG:"
            @ 04,65 say "KM:"
***            @ 04,71 say "Betrag:"
            @ 05,05 say ladestelle
            @ 05,28 say entladeste
            @ 05,50 say colli
            @ 05,58 say kg_m3
            @ 05,65 say kilometer
***            @ 05,71 say dm_pauscha
            @ 06,05 say "DM / KM:"
            @ 06,20 say "DM / KG:"
            @ 06,70 say "Betrag:"
            @ 07,05 say dm_km
            @ 07,20 say dm_kg
            @ 07,70 say dm_pauscha
            @ 08,05 say "--------------------------------------------------------------------------"
            setprc(0,0)
            skip
            if eof()
                position:=25
            else
                position:=position+1
                if position=17
                    eject
                    position:=10
                endif
            endif
        enddo
    enddo
    @ 02,05 say "Nettosumme / DM:"
    @ 02,30 say summe1
    @ 02,44 say "DM"
    @ 03,05 say "MwSt./ %:"
    @ 03,15 say emwst1
    @ 03,30 say summe2
    @ 03,44 say "DM"
    @ 04,05 say "Endbetrag: / DM:"
    @ 04,30 say summe3
    @ 04,44 say "DM"
    @ 05,05 say "Gebhren / DM  :"
    @ 05,30 say summe4
    @ 05,44 say "DM"
    @ 06,05 say "Rechnungsbetrag:"
    @ 06,30 say summe5
    @ 06,44 say "DM"
    setprc(0,0)
    printsend(027)
    printsend(087)
    printsend(001)
    @02,03 say "Rechnungsbetrag:"
    @02,18 say summe5
    @02,34 say "DM"
    printsend(027)
    printsend(087)
    printsend(000)
    setprc(0,0)
        eject
        set printer off
        set console on
        set device to screen
        use
        if rgfrage="J"
            temp1:=laufwerk1 + "\" + "drucken.dbf"
            temp2:="rgdaten\"+substr(rgnummer,3,6)+substr(rgnummer,-2)+".dbf"
            if filemove(temp1,temp2)=0
                ?
                ? "Druck beendet!!!"
                ?
                sound(131,40)
            endif
        endif
        if rgfrage="N"
                temp1:=laufwerk1 + "\" + "drucken.dbf"
                if filedelete(temp1)
                    ?
                    ? "Druck beendet!!!"
                    ?
                endif
        endif
endif
set printer off
set console on
set device to screen
select arbeit
set filter to
go top
?
? "Bitte Taste !"
inkey(0)
wclose(fenster2)
return
* Programmende  EOF *
Vielen Dank,
habe mein Druckmodul zu einem kleinen Testdruckmodul umgebaut.
Habe nicht gleich daran gedacht, hatte zuviel Stress.
:lol:
Gruß
Bruno
Messing
Benutzeravatar
messing
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 216
Registriert: Mi, 13. Jan 2010 9:42
Wohnort: Lauterbach / Hessen

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

Beitrag von messing »

brandelh hat geschrieben:... so und nun zu den eigentlichen Druckausgaben ... wie gesagt ICH mache die normalerweise in eigene Methoden / Funktionen, aber es geht auch so ...

Ich vermute damit fängt es an ...

Code: Alles auswählen

******************* Kopf und Anschrift drucken **************
    printsend(027)
    printsend(087)
    printsend(001)
    @03,03 say drname
*** "KELSTERB.- TRUCK - SERVICE"
*    @04,06 say drname1
*** "INTERNATIONALE SPEDITION"
    printsend(027)
    printsend(087)
    printsend(000)
    @03,10 say drname1
    @04,06 say drinhaber
    @06,06 say drstrasse
*** "Im Taubengrund 21"
*    @06,46 say drinhaber
Printsend() fliegt wie gesagt raus, aber vermutlich werden damit Schriftgrößen gesteuert, die haben wir ja vordefiniert ...
nun dieser Text mit meiner Routine ... die Schriften verwende ich mal nach Gefühl ...

Ich nutze hier jetzt jeweils pro Ausdruck ein neuen Druckauftrag, das könnte man auch anders regeln, aber so wird jede Seite sofort gedruckt...

Code: Alles auswählen

   oHBPrinter:StartDoc("Kopf und Anschrift drucken") // das zeigen Laserdrucker an ;-)  ==> Druckjob ANFANG
    
   ...
   // 10 Zeichen pro Zoll - eventuell auch FETT -> das regelt der eingestellte FONT  ! -> XbpFont()...
   oHBPrinter:SetFont(FONT_10CPI)    // Anschrift in 10 CPI
   oHBPrinter:say( 4, 4, drname)           // @03,03 say drname -> Syntax und Möglichkeiten sind im Quellcode
   oHBPrinter:say( 4,11, drname1)     // also immer Zeile und Spalte +1, Datenfeld muss nicht Text sein.
   oHBPrinter:say( 5, 7, drinhaber)     //  @04,06 say drinhaber
   ...
   // 17 CPI für Kleingedrucktes
   oHBPrinter:SetFont(FONT_17CPI)    // z.B. Absender über der Anschrift ?
   oHBPrinter:say( 3, 4, cMeinAbsender)           // @03,03 say drname -> Syntax und Möglichkeiten sind im Quellcode
   oHBPrinter:say( 4,11, drname1)     // also immer Zeile und Spalte +1, Datenfeld muss nicht Text sein.
   oHBPrinter:say( 5, 7, drinhaber)     //  @04,06 say drinhaber
   ...
   nun den Rest der Seite

WICHTIG !!!

@ SAY löst bei Clipper und Xbase ja normalerweise einen Seitenumbruch aus.
Daher muss man immer so schön die Reihenfolge überlegen ... DAS IST HIER NICHT SO !

Du kannst zu jeder Zeit überall drucken, die Reihenfolge spielt keine Rolle ...
und du musst in deinen Daten irgendwann erkennen, dass du eventuell eine neue Seite brauchst...

Code: Alles auswählen

   oHBPrinter:say(15,30,"Letzter Text der alten Seite ")
   ... nun erkenne ich dass ich eine neue Seite brauche ... 
   oHBPrinter:newPage()
   ... und mache die einfach !
   oHBPrinter:say(15,30,"Text auf den Folgeseite")
Wenn alles gedruckt ist, muss man den Druckjob beenden, damit auch Windows das weiß.

Code: Alles auswählen

 oHBPrinter:EndDoc()  ==> Druckjob ENDE
Das Druckerobjekt ist immer noch vorhanden und man kann weitere Seiten drucken (Startdoc() ...)
Irgendwann hat man alles gedruckt und dann muss man das Druckerobjekt (besser SOLLTE MAN)
auch wieder sauber schließen ...

Code: Alles auswählen

oHBPrinter:destroy()
ich sehe gerade, dass ich dies in meinen Beispielen nicht getan habe, die werden aber mit QUIT sowieso beendet.
Besser man ruft das so auf.

Durch den Druckspooler ist nicht klar, ob der Druckjob wirklich gedruckt wurde !
Ich nutze dazu eine Abfrage nach der Druckausgabe "Alles OK ?" ... aber das hat nichts mit Drucken zu tun.

Eines noch ... MAN KANN einen Drucker vorgeben, aber normalerweise nimmt man einfach den Standarddrucker.
Wenn man HBPrintDialog() nutzen möchte, muss man die Klasse ableiten und die Methoden PRINT() und PrintForm ()
so anpassen, dass alle fixen FORMular Daten in PrintForm gedruckt werden und Print() jede Seite erzeugen kann.
Für den Anfang ist das komplexer.
Vielen Dank für die Hilfestellung.
Habe mein Druckmodul zu einem Testdruckmodul umgebaut.
Sorry, habe nicht gleich daran gedacht, hatte zuviel Stress.

Code: Alles auswählen

PROCEDURE main
local vara1,vara2,vara3,vara4,vara5,vara6,vara7,vara8,vara9
local cMeinAbsender

vara1:="K T S"
vara2:="Internationale Spedition GmbH"
vara3:="Rainer Dittel"
vara4:="Im Taubengrund 21"
vara5:="65451 Kelsterbach"
vara6:="0123 456780"
vara7:="0123 456781"
vara8:="Bank XYZ"
vara9:="50010000"
varb1:="143016501"
cMeinAbsender:=vara1+" "+vara2+" "+vara5+" "+vara4
CLS
@ 01,00 say center("Auftraggeber - Rechnung - Modul")
set confirm on
SET ESCAPE off
setcursor(1)
@ 03,05 say "Bitte Namen w„hlen:"
@ 05,05 say cMeinAbsender
inkey(0)
oHBPrinter := HBPrinter():New():create()
if oHBPrinter:IsPrinterError()             // Fehler verhindern, avoid errors
   *** KEIN STANDARDDRUCKER FESTGEGT -> FEHLERMELDUNG UND ENDE !
   *** eventuell ist gar kein Drucker installiert, darum muss sich der Admin kümmern, das geht uns nichts an.
   msgbox("Kein Standarddrucker installiert, Ausdruck nicht möglich")
   return
else
   *** Hier legst du einmalig fest welche Schriftarten du verwenden möchtest, wenn du NUR eine willst, kein Problem
                // oHBPrinter:setFontMode(XBPPRN_FONTMODE_GRAPHIC)
   oHBPrinter:addFont("12.Courier New" ) // -> 10CPI
   oHBPrinter:addFont("10.Courier New" ) // -> 12CPI
   oHBPrinter:addFont(" 7.Courier New" ) // -> 17CPI
   oHBPrinter:addFont("12.Verdana" )
                                                   // why not, but don't use Blanks to format.
                                                // ich verwende normalerweise # defines um mir das MERKEN zu erleichtern ;-)
   #define FONT_10CPI 1
   #define FONT_12CPI 2
   #define FONT_17CPI 3
   #define FONT_VERDA 4  //   etc.
                                                // im Code kannst du dann jederzeit die gewünschte Schriftart über den Index einstellen,
                //   oHBPrinter:SetFont(FONT_10CPI)

   oHBPrinter:SetFont(1)


   oHBPrinter:StartDoc("Kopf und Anschrift drucken") // das zeigen Laserdrucker an ;-)  ==> Druckjob ANFANG

   // 10 Zeichen pro Zoll - eventuell auch FETT -> das regelt der eingestellte FONT  ! -> XbpFont()...
   oHBPrinter:SetFont(FONT_10CPI)    // Anschrift in 10 CPI
   oHBPrinter:say( 4, 4, vara1)           // @03,03 say drname -> Syntax und Möglichkeiten sind im Quellcode
   oHBPrinter:say( 4,11, vara2)     // also immer Zeile und Spalte +1, Datenfeld muss nicht Text sein.
   oHBPrinter:say( 5, 7, vara3)     //  @04,06 say drinhaber
   oHBPrinter:say( 7, 8, vara4)     //  @06,07 say drstrasse

   // 17 CPI für Kleingedrucktes
   oHBPrinter:SetFont(FONT_17CPI)    // z.B. Absender über der Anschrift ?
   oHBPrinter:say( 3, 4, cMeinAbsender)           // @03,03 say drname -> Syntax und Möglichkeiten sind im Quellcode
   oHBPrinter:say( 8, 8, vara5)     //  @06,07 say drstrasse
   oHBPrinter:say( 9, 8, vara6)     //  @06,07 say drstrasse
   oHBPrinter:SetFont(FONT_10CPI)    // Anschrift in 10 CPI

   oHBPrinter:say( 10, 8, vara7)     //  @06,07 say drstrasse
   oHBPrinter:say( 11, 8, vara8)     //  @06,07 say drstrasse
   oHBPrinter:say( 12, 8, vara9)     //  @06,07 say drstrasse
   oHBPrinter:SetFont(FONT_VERDA)    // Verdanaschrift

   oHBPrinter:say( 13,11, varb1)     // also immer Zeile und Spalte +1, Datenfeld muss nicht Text sein.
   oHBPrinter:say( 14, 7, vara3)     //  @04,06 say drinhaber

   oHBPrinter:say(30,30,"Letzter Text der alten Seite ")
//   ... nun erkenne ich dass ich eine neue Seite brauche ...
   oHBPrinter:newPage()
//   ... und mache die einfach !
   oHBPrinter:say(15,30,"Text auf den Folgeseite")
    setprc(0,0)
    position:=0

oHBPrinter:EndDoc()  // ==> Druckjob ENDE
endif
oHBPrinter:destroy()

?
? "Bitte Taste !"
inkey(0)
return
* Programmende  EOF *
[ERLEDIGT]
Zuletzt geändert von messing am Mo, 22. Mär 2010 13:59, insgesamt 1-mal geändert.
Gruß
Bruno
Messing
Benutzeravatar
messing
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 216
Registriert: Mi, 13. Jan 2010 9:42
Wohnort: Lauterbach / Hessen

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

Beitrag von messing »

messing hat geschrieben:
brandelh hat geschrieben:... so und nun zu den eigentlichen Druckausgaben ... wie gesagt ICH mache die normalerweise in eigene Methoden / Funktionen, aber es geht auch so ...

Ich vermute damit fängt es an ...

Code: Alles auswählen

******************* Kopf und Anschrift drucken **************
    printsend(027)
    printsend(087)
    printsend(001)
    @03,03 say drname
*** "KELSTERB.- TRUCK - SERVICE"
*    @04,06 say drname1
*** "INTERNATIONALE SPEDITION"
    printsend(027)
    printsend(087)
    printsend(000)
    @03,10 say drname1
    @04,06 say drinhaber
    @06,06 say drstrasse
*** "Im Taubengrund 21"
*    @06,46 say drinhaber
Printsend() fliegt wie gesagt raus, aber vermutlich werden damit Schriftgrößen gesteuert, die haben wir ja vordefiniert ...
nun dieser Text mit meiner Routine ... die Schriften verwende ich mal nach Gefühl ...

Ich nutze hier jetzt jeweils pro Ausdruck ein neuen Druckauftrag, das könnte man auch anders regeln, aber so wird jede Seite sofort gedruckt...

Code: Alles auswählen

   oHBPrinter:StartDoc("Kopf und Anschrift drucken") // das zeigen Laserdrucker an ;-)  ==> Druckjob ANFANG
    
   ...
   // 10 Zeichen pro Zoll - eventuell auch FETT -> das regelt der eingestellte FONT  ! -> XbpFont()...
   oHBPrinter:SetFont(FONT_10CPI)    // Anschrift in 10 CPI
   oHBPrinter:say( 4, 4, drname)           // @03,03 say drname -> Syntax und Möglichkeiten sind im Quellcode
   oHBPrinter:say( 4,11, drname1)     // also immer Zeile und Spalte +1, Datenfeld muss nicht Text sein.
   oHBPrinter:say( 5, 7, drinhaber)     //  @04,06 say drinhaber
   ...
   // 17 CPI für Kleingedrucktes
   oHBPrinter:SetFont(FONT_17CPI)    // z.B. Absender über der Anschrift ?
   oHBPrinter:say( 3, 4, cMeinAbsender)           // @03,03 say drname -> Syntax und Möglichkeiten sind im Quellcode
   oHBPrinter:say( 4,11, drname1)     // also immer Zeile und Spalte +1, Datenfeld muss nicht Text sein.
   oHBPrinter:say( 5, 7, drinhaber)     //  @04,06 say drinhaber
   ...
   nun den Rest der Seite

WICHTIG !!!

@ SAY löst bei Clipper und Xbase ja normalerweise einen Seitenumbruch aus.
Daher muss man immer so schön die Reihenfolge überlegen ... DAS IST HIER NICHT SO !

Du kannst zu jeder Zeit überall drucken, die Reihenfolge spielt keine Rolle ...
und du musst in deinen Daten irgendwann erkennen, dass du eventuell eine neue Seite brauchst...

Code: Alles auswählen

   oHBPrinter:say(15,30,"Letzter Text der alten Seite ")
   ... nun erkenne ich dass ich eine neue Seite brauche ... 
   oHBPrinter:newPage()
   ... und mache die einfach !
   oHBPrinter:say(15,30,"Text auf den Folgeseite")
Wenn alles gedruckt ist, muss man den Druckjob beenden, damit auch Windows das weiß.

Code: Alles auswählen

 oHBPrinter:EndDoc()  ==> Druckjob ENDE
Das Druckerobjekt ist immer noch vorhanden und man kann weitere Seiten drucken (Startdoc() ...)
Irgendwann hat man alles gedruckt und dann muss man das Druckerobjekt (besser SOLLTE MAN)
auch wieder sauber schließen ...

Code: Alles auswählen

oHBPrinter:destroy()
ich sehe gerade, dass ich dies in meinen Beispielen nicht getan habe, die werden aber mit QUIT sowieso beendet.
Besser man ruft das so auf.

Durch den Druckspooler ist nicht klar, ob der Druckjob wirklich gedruckt wurde !
Ich nutze dazu eine Abfrage nach der Druckausgabe "Alles OK ?" ... aber das hat nichts mit Drucken zu tun.

Eines noch ... MAN KANN einen Drucker vorgeben, aber normalerweise nimmt man einfach den Standarddrucker.
Wenn man HBPrintDialog() nutzen möchte, muss man die Klasse ableiten und die Methoden PRINT() und PrintForm ()
so anpassen, dass alle fixen FORMular Daten in PrintForm gedruckt werden und Print() jede Seite erzeugen kann.
Für den Anfang ist das komplexer.
Vielen Dank für die Hilfestellung.
Habe mein Druckmodul zu einem Testdruckmodul umgebaut.
Sorry, habe nicht gleich daran gedacht, hatte zuviel Stress.

Code: Alles auswählen

PROCEDURE main
local vara1,vara2,vara3,vara4,vara5,vara6,vara7,vara8,vara9
local cMeinAbsender

vara1:="K T S"
vara2:="Internationale Spedition GmbH"
vara3:="Rainer Dittel"
vara4:="Im Taubengrund 21"
vara5:="65451 Kelsterbach"
vara6:="0123 456780"
vara7:="0123 456781"
vara8:="Bank XYZ"
vara9:="50010000"
varb1:="143016501"
cMeinAbsender:=vara1+" "+vara2+" "+vara5+" "+vara4
CLS
@ 01,00 say center("Auftraggeber - Rechnung - Modul")
set confirm on
SET ESCAPE off
setcursor(1)
@ 03,05 say "Bitte Namen w„hlen:"
@ 05,05 say cMeinAbsender
inkey(0)
oHBPrinter := HBPrinter():New():create()
if oHBPrinter:IsPrinterError()             // Fehler verhindern, avoid errors
   *** KEIN STANDARDDRUCKER FESTGEGT -> FEHLERMELDUNG UND ENDE !
   *** eventuell ist gar kein Drucker installiert, darum muss sich der Admin kümmern, das geht uns nichts an.
   msgbox("Kein Standarddrucker installiert, Ausdruck nicht möglich")
   return
else
   *** Hier legst du einmalig fest welche Schriftarten du verwenden möchtest, wenn du NUR eine willst, kein Problem
                // oHBPrinter:setFontMode(XBPPRN_FONTMODE_GRAPHIC)
   oHBPrinter:addFont("12.Courier New" ) // -> 10CPI
   oHBPrinter:addFont("10.Courier New" ) // -> 12CPI
   oHBPrinter:addFont(" 7.Courier New" ) // -> 17CPI
   oHBPrinter:addFont("12.Verdana" )
                                                   // why not, but don't use Blanks to format.
                                                // ich verwende normalerweise # defines um mir das MERKEN zu erleichtern ;-)
   #define FONT_10CPI 1
   #define FONT_12CPI 2
   #define FONT_17CPI 3
   #define FONT_VERDA 4  //   etc.
                                                // im Code kannst du dann jederzeit die gewünschte Schriftart über den Index einstellen,
                //   oHBPrinter:SetFont(FONT_10CPI)

   oHBPrinter:SetFont(1)


   oHBPrinter:StartDoc("Kopf und Anschrift drucken") // das zeigen Laserdrucker an ;-)  ==> Druckjob ANFANG

   // 10 Zeichen pro Zoll - eventuell auch FETT -> das regelt der eingestellte FONT  ! -> XbpFont()...
   oHBPrinter:SetFont(FONT_10CPI)    // Anschrift in 10 CPI
   oHBPrinter:say( 4, 4, vara1)           // @03,03 say drname -> Syntax und Möglichkeiten sind im Quellcode
   oHBPrinter:say( 4,11, vara2)     // also immer Zeile und Spalte +1, Datenfeld muss nicht Text sein.
   oHBPrinter:say( 5, 7, vara3)     //  @04,06 say drinhaber
   oHBPrinter:say( 7, 8, vara4)     //  @06,07 say drstrasse

   // 17 CPI für Kleingedrucktes
   oHBPrinter:SetFont(FONT_17CPI)    // z.B. Absender über der Anschrift ?
   oHBPrinter:say( 3, 4, cMeinAbsender)           // @03,03 say drname -> Syntax und Möglichkeiten sind im Quellcode
   oHBPrinter:say( 8, 8, vara5)     //  @06,07 say drstrasse
   oHBPrinter:say( 9, 8, vara6)     //  @06,07 say drstrasse
   oHBPrinter:SetFont(FONT_10CPI)    // Anschrift in 10 CPI

   oHBPrinter:say( 10, 8, vara7)     //  @06,07 say drstrasse
   oHBPrinter:say( 11, 8, vara8)     //  @06,07 say drstrasse
   oHBPrinter:say( 12, 8, vara9)     //  @06,07 say drstrasse
   oHBPrinter:SetFont(FONT_VERDA)    // Verdanaschrift

   oHBPrinter:say( 13,11, varb1)     // also immer Zeile und Spalte +1, Datenfeld muss nicht Text sein.
   oHBPrinter:say( 14, 7, vara3)     //  @04,06 say drinhaber

   oHBPrinter:say(30,30,"Letzter Text der alten Seite ")
//   ... nun erkenne ich dass ich eine neue Seite brauche ...
   oHBPrinter:newPage()
//   ... und mache die einfach !
   oHBPrinter:say(15,30,"Text auf den Folgeseite")
    setprc(0,0)
    position:=0

oHBPrinter:EndDoc()  // ==> Druckjob ENDE
endif
oHBPrinter:destroy()

?
? "Bitte Taste !"
inkey(0)
return
* Programmende  EOF *
Funktioniert deine Klasse auch mit LIST und ?
Ich möchte nicht unverschämt sein, aber könntest du mir im abgeänderten Druckmodul zeigen, wie ich die Druckerauswahl und Vorschau möglich machen kann?
Jedenfalls funktioniert es mit dem Standarddrucker einwandfrei.
Da jedoch in meinem Prog. die EIngaben an einem PC gemacht werden, mit LIST Funktionen, und an einem anderen die Auswertungen, wollte ich alles auf denselben Drucker schicken.
Ohne Druckerauswahl, müsste ich den Standarddrucker ändern, was zur Folge hat, das alles andere auch dahin geht.
Gruß
Messing

[ERLEDIGT]
Zuletzt geändert von messing am Mo, 22. Mär 2010 13:58, insgesamt 1-mal geändert.
Gruß
Bruno
Messing
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

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

Beitrag von brandelh »

Hallo Messing,

bitte beim Zitieren alles rauslöschen aus dem Text, worauf es gerade nicht ankommt, sonst suchen
wir uns dumm und dämlich .... :wink:
messing hat geschrieben:Funktioniert deine Klasse auch mit LIST und ?
Meine Klasse hat genau die Methoden die in der Datei stehen, LIST gibt es nicht ...

Wenn du aber meinst, dass du mit LIST eine Textdatei erstellt hast ...

Code: Alles auswählen

Nr. Name   ...
  1. Maier ...
  2. Müller ...
dann kannst du die einlesen und eventuell ganz einfach am Stück drucken:

Code: Alles auswählen

cTxt := memoread("MeinText.txt")
...
// PrintMemo( nPosX, nPosY, cTxt, cAusrichtung, nMaxLen, cArt, nFarbe, cHochQuer, nMaxBis,nLineFeed )
oHBPrinter:PrintMemo(5,15,cTxt)   // hierzu sollte man die Standardvorgaben für die Ränder prüfen.
...
oder aber du ermittelst die Zeilen und druckst das mit :say(nZeile,nRand,cZeile)
messing hat geschrieben: Ich möchte nicht unverschämt sein, aber könntest du mir im abgeänderten Druckmodul zeigen, wie ich die Druckerauswahl und Vorschau möglich machen kann?
Das sind nun wieder 2 paar Stiefel !
Für MEINE Druckvorschau musst du zwingend die Druckausgaben in die Methoden Print() und PrintForm() auslagern. Dabei ist dann auch der Druckerauswahl Dialog. Wenn du den nutzen möchtest ist das etwas mehr arbeit. Im Moment komme ich nicht dazu, aber in meinen Beispieldateien ist das schon erklärt ;-)
messing hat geschrieben: Jedenfalls funktioniert es mit dem Standarddrucker einwandfrei.
Da jedoch in meinem Prog. die EIngaben an einem PC gemacht werden, mit LIST Funktionen, und an einem anderen die Auswertungen, wollte ich alles auf denselben Drucker schicken.
Ohne Druckerauswahl, müsste ich den Standarddrucker ändern, was zur Folge hat, das alles andere auch dahin geht.
Das Ändern des Standarddruckers ist NICHT nötig, auch OHNE meine Druckerauswahl !

Solange der PC den Drucker als Windowsdruckersymbol anzeigt (Systemsteuerung / Drucker ...) kann man den auch direkt angeben. Hier gibt es 2 Möglichkeiten:

1. Du kennst den Namen des Druckers und speicherst diesen in eine INI ...

Code: Alles auswählen

cZielDrucker := "Drucker am Server"  // dieser NAME muss genau mit dem Druckernamen übereinstimmen !
oHBPrinter := HBPrinter():New():create(cZielDrucker)  // siehe Doku zu XbpPrinter():create() und XbpPrinter():list()
2. Du verwendest die Systemdruckerauswahl (ohne Druckvorschau, daher Windows-Original !) mit der XBase++ Funktion und übergibst dieses Druckerobjekt dem HBPrinter ... ist auch recht neu ;-)

Code: Alles auswählen

oDlg := XbpPrintDialog():new() 
oDlg:create() 
oXbpPrinter := oDlg:display() 
oDlg:destroy() 

oHBPrinter := HBPrinter():New(oXbpPrinter):create()
Gruß
Hubert
Benutzeravatar
messing
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 216
Registriert: Mi, 13. Jan 2010 9:42
Wohnort: Lauterbach / Hessen

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

Beitrag von messing »

:D Vielen Dank :D
Funktioniert mit Druckerauswahl bestens ( Windows Auswahl )
Nachdem ich soweit gebastelt hab, hab ich festgestellt, das der Abbruch nicht funktioniert.
Wenn ich den Drucker auswähle und bestätige, druckt er auf diesem ausgewählten. Jedoch wenn ich auf abbrechen gehe, druckt er auf dem Standarddrucker ??? :? bekommt Deine Klasse keine Meldung bei einem Abbruch?

Gruß

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

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

Beitrag von brandelh »

Hallo Messing,

bei eim Abbruch gibt XbpPrinterDialog() NIL zurück.
NIL ist aber die Vorgabe für Standarddrucker bei meiner Druckerklasse ... ;-)
Das Beispiel muss also so lauten ...

Code: Alles auswählen

oDlg := XbpPrintDialog():new()
oDlg:create()
oXbpPrinter := oDlg:display()
oDlg:destroy()

if oXbpPrinter # NIL
   oHBPrinter := HBPrinter():New(oXbpPrinter):create()
   if oHBPrinter:IsPrinterError()             // Fehler verhindern, avoid errors

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

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

Beitrag von brandelh »

Hi,

so steht es auch in der Beispieldatei TEST-XbpPrinterDialog.PRG aus dem HBPrint Verzeichnis ....

Code: Alles auswählen

#include "Gra.ch"
#include "Xbp.ch"
#include "Common.ch"
#include "Appevent.ch"
#include "Font.ch"

#pragma Library( "XppUI2.lib" )

PROCEDURE Main
   LOCAL oXbpPrinter, oDlg, oHBPrinter

   oDlg := XbpPrintDialog():new()
   oDlg:enablePrintToFile := .f.
   oDlg:printToFile       := .f.
   oDlg:create()
   oXbpPrinter := oDlg:display()
   oDlg:destroy()

   if oXbpPrinter # NIL

      oHBPrinter := HBPrinter():New(oXbpPrinter):create()

      if oHBPrinter:IsPrinterError()             // Fehler verhindern, avoid errors

         ? "Standarddrucker ist nicht verfgbar !"
         ? "Standardprinter is not ready !"
         ?
         ? "Status: ",oHBPrinter:printerStatus(),"=",cPrinterStatus(oHBPrinter:printerStatus())

      else

         oHBPrinter:addFont("12.Arial")
         oHBPrinter:setFont(1)

         oHBPrinter:StartDoc()
         oHBPrinter:say(15,30,"Hello World")
         oHBPrinter:say(20,10,"Drucker: ")
         oHBPrinter:say(20,20,oHBPrinter:DevName)
         oHBPrinter:say( 5,70,dtoc(date()))
         oHBPrinter:EndDoc()

      endif

      oXbpPrinter:destroy()
      oHBPrinter:destroy()

   endif

return
Gruß
Hubert
Benutzeravatar
messing
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 216
Registriert: Mi, 13. Jan 2010 9:42
Wohnort: Lauterbach / Hessen

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

Beitrag von messing »

Danke,

jetzt steh ich vor dem nächten Problem.

Wenn ich die Druckfunktion aus dem Hauptprogramm starte, funktioniert es, aber wenn ich aus einem DLL Modul darauf zurückgreife, bekomme ich beim linken [Fatal Error] : ALK4102: 1 external symbols unresolved.

Als Einzelnes Prog. läuft es wie geschmiert.

Greift eine DLL nicht auf die Klasse zu?

Oder muß ich beim Linken was beachten?

Ich hab hbprint im Hauptprogramm eingebunden, muß ich es auch in die DLL einbinden?

Gruß
[ERLEDIGT]

Messing
[ERLEDIGT]
Zuletzt geändert von messing am Mo, 22. Mär 2010 13:56, insgesamt 1-mal geändert.
Gruß
Bruno
Messing
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

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

Beitrag von brandelh »

Hi,

ich bin der AllesInEineExe Typ ;-) also nicht sooo bewandert mit DLLs.

Aber soweit ich weiß, ruft die aktuelle EXE immer Funktionen aus der DLL auf, nicht umgekehrt.

DLL geben ja nach außen die exportierten Funktionen bekannt, eine EXE exportiert aber nichts oder ?
Gruß
Hubert
Benutzeravatar
Markus Walter
Programmier-Gott
Programmier-Gott
Beiträge: 1018
Registriert: Di, 24. Jan 2006 10:22
Wohnort: Saarland

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

Beitrag von Markus Walter »

Also meiner Meinung nach muss man es in der DLL einbinden. Ich wüsste keinen Weg, aus einer DLL eine Funktion aus einer exe zu rufen (was nicht unbedingt heisst, das es das nicht gibt...)
Gruß
Markus

Mitglied der XUG Saarland-Pfalz
Günter Beyes
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 315
Registriert: Mo, 16. Okt 2006 13:04
Wohnort: Region Stuttgart

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

Beitrag von Günter Beyes »

Hallo Markus,

über den Makro-Operator. Die Funktion darf keine STATIC FUNCTION sein.

Code: Alles auswählen

if isfunction( "FunktionInExe" )
  PRIVATE p1 := 1
  PRIVATE p1 := 2
  ? &("FunktionInExe( p1, p2 )")
endif

oder so, wobei die Parameter LOCAL sein können.

if isfunction( "FunktionInExe" )
  ? eval(  &("{ | p1, p2 |FunktionInExe(p1, p2)}"), 1, 2 )
endif

return

FUNCTION FunktionInExe( p1, p2 )

MsgBox( var2char(p1) + " " + var2char( p2 ) )

return .T.
Gruß
Günter
Benutzeravatar
messing
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 216
Registriert: Mi, 13. Jan 2010 9:42
Wohnort: Lauterbach / Hessen

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

Beitrag von messing »

Servus an alle,

Kann man bei der HB Klasse und den SAY Anweisungen den Zeilenabstand ändern?

Dachte mir, wenn Die Schriftart kleiner ist, könnte mehr aufs Papier.

Gruß

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

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

Beitrag von brandelh »

Code: Alles auswählen

:say(nRow,nCol,xData,cAusrichtung,nCPI,nLPI)
mit dem Parameter nLPI wird die Anzahl der Zeilen pro INCH (Standard 6 bei 10CPI und 8 bei 12CPI) eingestellt.
Die Berechnung geht wie immer über die ganze Seite, aber du kannst natürlich verschiedene LPI auf einer Seite verwenden.
Der nCPI Parameter ändert nur die Schriftgröße, sonst könnte man keine Schriftgrößen in einer Zeile mischen.
Gruß
Hubert
Benutzeravatar
messing
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 216
Registriert: Mi, 13. Jan 2010 9:42
Wohnort: Lauterbach / Hessen

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

Beitrag von messing »

brandelh hat geschrieben:

Code: Alles auswählen

:say(nRow,nCol,xData,cAusrichtung,nCPI,nLPI)
mit dem Parameter nLPI wird die Anzahl der Zeilen pro INCH (Standard 6 bei 10CPI und 8 bei 12CPI) eingestellt.
Die Berechnung geht wie immer über die ganze Seite, aber du kannst natürlich verschiedene LPI auf einer Seite verwenden.
Der nCPI Parameter ändert nur die Schriftgröße, sonst könnte man keine Schriftgrößen in einer Zeile mischen.

Danke, das hab ich schon durch, meinte, wenn ich die Schriftart nur auf eine Größe festlege, um mehr Informationen aus Papier zu bekommen.

Gruß

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

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

Beitrag von brandelh »

messing hat geschrieben:
brandelh hat geschrieben:

Code: Alles auswählen

:say(nRow,nCol,xData,cAusrichtung,nCPI,nLPI)
mit dem Parameter nLPI wird die Anzahl der Zeilen pro INCH (Standard 6 bei 10CPI und 8 bei 12CPI) eingestellt.
Die Berechnung geht wie immer über die ganze Seite, aber du kannst natürlich verschiedene LPI auf einer Seite verwenden.
Der nCPI Parameter ändert nur die Schriftgröße, sonst könnte man keine Schriftgrößen in einer Zeile mischen.

Danke, das hab ich schon durch, meinte, wenn ich die Schriftart nur auf eine Größe festlege, um mehr Informationen aus Papier zu bekommen.

Gruß

Messing
genau das meine ich doch !
6 Zeilen je Inch sind weniger als 8 Zeilen je Inch:

A4 = 29,7 cm / 2,54 * 6 ergibt 70 Zeilen
A4 = 29,7 cm / 2,54 * 8 ergibt 93 Zeilen

Die eingestellte Schriftart wirkt aber nicht automatisch auf die Schrittweite der Zeilen !!!
Das wäre fatal beim Mischen der Schriften. Du musst diesen Parameter angeben, wenn du engere Zeilen willst.
Gruß
Hubert
Benutzeravatar
messing
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 216
Registriert: Mi, 13. Jan 2010 9:42
Wohnort: Lauterbach / Hessen

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

Beitrag von messing »

brandelh hat geschrieben:
messing hat geschrieben:
brandelh hat geschrieben:

Code: Alles auswählen

:say(nRow,nCol,xData,cAusrichtung,nCPI,nLPI)
mit dem Parameter nLPI wird die Anzahl der Zeilen pro INCH (Standard 6 bei 10CPI und 8 bei 12CPI) eingestellt.
Die Berechnung geht wie immer über die ganze Seite, aber du kannst natürlich verschiedene LPI auf einer Seite verwenden.
Der nCPI Parameter ändert nur die Schriftgröße, sonst könnte man keine Schriftgrößen in einer Zeile mischen.

Danke, das hab ich schon durch, meinte, wenn ich die Schriftart nur auf eine Größe festlege, um mehr Informationen aus Papier zu bekommen.

Gruß

Messing
genau das meine ich doch !
6 Zeilen je Inch sind weniger als 8 Zeilen je Inch:

A4 = 29,7 cm / 2,54 * 6 ergibt 70 Zeilen
A4 = 29,7 cm / 2,54 * 8 ergibt 93 Zeilen

Die eingestellte Schriftart wirkt aber nicht automatisch auf die Schrittweite der Zeilen !!!
Das wäre fatal beim Mischen der Schriften. Du musst diesen Parameter angeben, wenn du engere Zeilen willst.

Danke, :D
hab mir HBPRINT mal reingezogen, da ist in der METHOD SAY die Festlegeung auf 6 / nLpi.
Kann man diesen Parameter im Prgramm festlegen, ohne in HBPRINT was zu ändern?
Sonst müsste man bei jeder SAY Anweisung die nLpi angeben.
Eine einmalige Festlegung ???

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

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

Beitrag von brandelh »

Hallo,

ich habe das nicht vorgesehen und komme im Moment nicht dazu, ABER dafür ist es ja eine KLASSE und keine einfache Anhäufung einer Funktion ...
JEDER kann die Klasse ableiten und eigene Vorgaben machen OHNE mit der ursprünglichen Klasse inkompatibel zu werden ... so wie ich es in den Beispielen ja auch mache.
Das sollte deinen Wünschen entsprechen ...

Code: Alles auswählen

CLASS  MyHBPrinter from HBPrinter
   EXPORTED:
      VAR nVorgabeLPI 
      METHOD SAY
ENDCLASS
*-------------------------------------------------------------------
METHOD MyHBPrinter:say(nRow,nCol,xData,cAlign,nCPI,nLPI)
return HBPrinter:say(nRow,nCol,xData,cAlign,nCPI, ::nVorgabeLPI  )
Im Programm verwendest du nun MyHBPrinter (Name könnte besser sein) statt HBPrinter.

Code: Alles auswählen

oPrinter := MyHBPrinter()....
...
oPrinter:say(...)      // druckt wie bisher mit 6 LPI
...
oPrinter:nVorgabeLPI := 8
oPrinter:say(...)      // druckt nun mit 8 LPI
...
Solange ::nVorgabeLPI nicht gesetzt ist, wird genau so gedruckt wie bisher.
Eventuell baue ich die Variable auch mal ein, aber selbst dann wird das Programm sauber drucken wie gewünscht.
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

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

Beitrag von brandelh »

Genauso könnte man auch eine nVorgabeCPI einbauen ;-)
Gruß
Hubert
Benutzeravatar
messing
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 216
Registriert: Mi, 13. Jan 2010 9:42
Wohnort: Lauterbach / Hessen

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

Beitrag von messing »

Danke, läuft prima :lol:

Gruß Messing

[erledigt]
Gruß
Bruno
Messing
Antworten