Drucken mit HBPrinter - Was geht wie warum ???
Moderator: Moderatoren
- brandelh
- Foren-Moderator
- Beiträge: 15701
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 69 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Drucken mit HBPrinter - Was geht wie warum ???
Hi,
ab und an erhalte ich private eMail mit Fragen zu meiner Druckerklasse.
Seit es dieses Forum gibt, verweise ich die Anfragen an dieses Forum.
Einerseits spart mir das Zeit, andererseits nützt es mehreren.
In all den Jahren habe ich zwar - aus meiner Sicht - viele Beispiele erstellt, die alles erklären sollten, aber wie immer ist die Sicht des Autors weit von der Anderer entfernt
Auch gibt es Anforderungen, die ich selbst nicht habe, aber der Klasse dienen. Zuletzt habe ich auch gerne resonanz darüber, ob die Klasse überhaupt von anderen verwendet wird, daher gleich noch eine Abstimmung dazu
PS: meine Stimme (die 1. gezählte) ist natürlich ganz oben, denn ich nutzte meine Druckerklasse ausschließlich für alle Programme, seit ich diese erstellt habe.
PS: Ich lösche alle nicht wirklich zum Thema wichtigen postings (auch von mir) hier nach einiger Zeit wieder raus, damit dieser Thread leicht lesbar bleibt und eine Art Anleitung wird. Bitte nicht böse sein, Thread Punkte hat jeder jetzt wohl genug
ab und an erhalte ich private eMail mit Fragen zu meiner Druckerklasse.
Seit es dieses Forum gibt, verweise ich die Anfragen an dieses Forum.
Einerseits spart mir das Zeit, andererseits nützt es mehreren.
In all den Jahren habe ich zwar - aus meiner Sicht - viele Beispiele erstellt, die alles erklären sollten, aber wie immer ist die Sicht des Autors weit von der Anderer entfernt
Auch gibt es Anforderungen, die ich selbst nicht habe, aber der Klasse dienen. Zuletzt habe ich auch gerne resonanz darüber, ob die Klasse überhaupt von anderen verwendet wird, daher gleich noch eine Abstimmung dazu
PS: meine Stimme (die 1. gezählte) ist natürlich ganz oben, denn ich nutzte meine Druckerklasse ausschließlich für alle Programme, seit ich diese erstellt habe.
PS: Ich lösche alle nicht wirklich zum Thema wichtigen postings (auch von mir) hier nach einiger Zeit wieder raus, damit dieser Thread leicht lesbar bleibt und eine Art Anleitung wird. Bitte nicht böse sein, Thread Punkte hat jeder jetzt wohl genug
Zuletzt geändert von brandelh am Do, 01. Mär 2007 9:02, insgesamt 2-mal geändert.
Gruß
Hubert
Hubert
- brandelh
- Foren-Moderator
- Beiträge: 15701
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 69 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Frage: Wie binde ich HBPrinter ein ...
per eMail erreichte mich diese Frage. Hier die Antwort für alle (die es interessiert):
Grundsätzlich wird je nach Bedarf entweder nur HBPrinter.PRG oder alle 3 *.PRG Dateien in das eigene Projectfile unter den PRG eingefügt und pbuild /G aufgerufen.
PBUILD /G nicht vergessen !
Nun stehen die Klassen und Funktionen im eigenen Programm zur Verfügung.
Die TEST*.PRG Dateien zeigen wie man im eigenen Programm diese Klassen und Funktionen aufruft. Die MAIN im Test entspricht also entweder deiner Main oder einer anderen Prozedur die von deiner main aufgerufen wurde. Bitte ansehen !
Wenn es unklar ist, wie man die Sachen einbindet, mach doch einfach ein kleines Xbase++ Programm, das eine Liste mit set printer to druckt und die passende kleine project Datei. Beides bitte als Code-Tag ins Forum posten und ich binde dann HBPrinter ein. Vielleicht wird es dann ersichtlicher.[/code]
Grundsätzlich wird je nach Bedarf entweder nur HBPrinter.PRG oder alle 3 *.PRG Dateien in das eigene Projectfile unter den PRG eingefügt und pbuild /G aufgerufen.
Code: Alles auswählen
Beispiel Project File:
[DeineExe.EXE]
...
DeineExe.PRG
Sonstige.PRG
HBPrint.PRG // reicht wenn man keinen Dialog braucht.
HBPrintD.PRG // nötig für Druckdialog mit preview.
_HBPrintD.PRG
...
Nun stehen die Klassen und Funktionen im eigenen Programm zur Verfügung.
Die TEST*.PRG Dateien zeigen wie man im eigenen Programm diese Klassen und Funktionen aufruft. Die MAIN im Test entspricht also entweder deiner Main oder einer anderen Prozedur die von deiner main aufgerufen wurde. Bitte ansehen !
Wenn es unklar ist, wie man die Sachen einbindet, mach doch einfach ein kleines Xbase++ Programm, das eine Liste mit set printer to druckt und die passende kleine project Datei. Beides bitte als Code-Tag ins Forum posten und ich binde dann HBPrinter ein. Vielleicht wird es dann ersichtlicher.[/code]
Gruß
Hubert
Hubert
- Lutz Rübe
- Rekursionen-Architekt
- Beiträge: 144
- Registriert: Mi, 02. Aug 2006 18:13
- Wohnort: 24536 Neumünster
- Danksagung erhalten: 6 Mal
- Kontaktdaten:
Hallo Hubert,
ich arbeite mit VX 2.0. Wo kann ich da die Option /G für den PBUILD angeben ?
ich möchte den Printing-Dialog einbinden und bekomme laufend Fehlermeldungen
xxxx already defined in _HBPrintD.obj
bzw.
unresolved external symbol _HBPRINTDIALOG.
Deine 3 Dateien habe ich in mein "Projektverzeichnis" kopiert und dort in die Programm-Liste mit aufgenommen.
Ohne den PrintingDialog funktioniert alles bestens !!
Gruß
Lutz
ich arbeite mit VX 2.0. Wo kann ich da die Option /G für den PBUILD angeben ?
ich möchte den Printing-Dialog einbinden und bekomme laufend Fehlermeldungen
xxxx already defined in _HBPrintD.obj
bzw.
unresolved external symbol _HBPRINTDIALOG.
Deine 3 Dateien habe ich in mein "Projektverzeichnis" kopiert und dort in die Programm-Liste mit aufgenommen.
Ohne den PrintingDialog funktioniert alles bestens !!
Gruß
Lutz
- brandelh
- Foren-Moderator
- Beiträge: 15701
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 69 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Hallo Lutz,
zunächst, ich arbeite nicht mit VX. Auf jeden Fall sollte es möglich sein im Project-Verzeichnis eine CMD Eingabeseite aufzumachen und Pbuild /g aufzurufen. Hast du irgendwo INCLUDE ... auf meine _HBPRINT.PRG im Quellcode eingetragen ? Das sollte man nicht.
Eventuell mal alle OBJ Dateien von den PRG Dateien löschen.
zunächst, ich arbeite nicht mit VX. Auf jeden Fall sollte es möglich sein im Project-Verzeichnis eine CMD Eingabeseite aufzumachen und Pbuild /g aufzurufen. Hast du irgendwo INCLUDE ... auf meine _HBPRINT.PRG im Quellcode eingetragen ? Das sollte man nicht.
Eventuell mal alle OBJ Dateien von den PRG Dateien löschen.
Gruß
Hubert
Hubert
- Jan
- Marvin
- Beiträge: 14659
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Lutz,
unter VX brauchst Du das /g nicht. Wenn Du ein neues Projekt erstellt hast klickst Du links im Fenster einfach mit der rechten Maustaste auf den .exe-Namen. Du kannst dann eine neue Datei anlegen oder eine bestehende hinzufügen. Die wird dann sofort ganz korrekt in die Projektdatei eingefügt.
Jan
unter VX brauchst Du das /g nicht. Wenn Du ein neues Projekt erstellt hast klickst Du links im Fenster einfach mit der rechten Maustaste auf den .exe-Namen. Du kannst dann eine neue Datei anlegen oder eine bestehende hinzufügen. Die wird dann sofort ganz korrekt in die Projektdatei eingefügt.
Jan
- Lutz Rübe
- Rekursionen-Architekt
- Beiträge: 144
- Registriert: Mi, 02. Aug 2006 18:13
- Wohnort: 24536 Neumünster
- Danksagung erhalten: 6 Mal
- Kontaktdaten:
Hallo Hubert,
ich habe keine Eintragungen beim INCLUDE auf Deinen Quellcode. Außerdem habe ich schon mehrfach alle OBJ-Dateien gelöscht, habe die Dependencies und mit REBUILD das Project neu erstellt (löscht u.a. die OBJ-Dateien).
Was mache ich da jetzt falsch ? Reihenfolge ? Denkfehler ?
Kann ich statt Deinem PrintingDialog() den "Standard" Dialog
benutzen ?
Im Moment brauche ich auch keine Vorschau, mag zwar sein, dass ich diese irgendwann mal einbauen möchte, aber derzeit benutze ich den Adobe Acrobat Writer als "Vorschau".
Gruß
Lutz[[/code]
ich habe keine Eintragungen beim INCLUDE auf Deinen Quellcode. Außerdem habe ich schon mehrfach alle OBJ-Dateien gelöscht, habe die Dependencies und mit REBUILD das Project neu erstellt (löscht u.a. die OBJ-Dateien).
Ich möchte eigentlich nur folgendes:brandelh hat geschrieben: Hast du irgendwo INCLUDE ... auf meine _HBPRINT.PRG im Quellcode eingetragen ? Das sollte man nicht.
Eventuell mal alle OBJ Dateien von den PRG Dateien löschen.
Code: Alles auswählen
oHBPrinter := HBPrinter():New():create()
oHBPrinter:PrintingDialog()
// setzen der sonstigen Druck-Parameter (Fonts, Copies etc.)
oHBPrinter:StartDoc("Teilnehmer-Liste")
oHBPrinter:PrintText( nCol , nLine, "Mein Text","C")
oHBPrinter:EndDoc()
oHBPrinter:Destroy()
Kann ich statt Deinem PrintingDialog() den "Standard" Dialog
Code: Alles auswählen
oDlg := XbpPrintDialog():new()
oDlg:create()
oHBPrinter := oDlg:display()
oDlg:destroy()
Im Moment brauche ich auch keine Vorschau, mag zwar sein, dass ich diese irgendwann mal einbauen möchte, aber derzeit benutze ich den Adobe Acrobat Writer als "Vorschau".
Gruß
Lutz[[/code]
- brandelh
- Foren-Moderator
- Beiträge: 15701
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 69 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
genau das ist die Frage, was möchtest du ?Lutz Rübe hat geschrieben: Ich möchte eigentlich nur folgendes:Code: Alles auswählen
oHBPrinter := HBPrinter():New():create() oHBPrinter:PrintingDialog() // setzen der sonstigen Druck-Parameter (Fonts, Copies etc.) oHBPrinter:StartDoc("Teilnehmer-Liste") oHBPrinter:PrintText( nCol , nLine, "Mein Text","C") oHBPrinter:EndDoc() oHBPrinter:Destroy()
1. Einfach den Text auf den Standarddrucker (oder bekannten Namen) senden, dann muss man:
Code: Alles auswählen
oHBPrinter := HBPrinter():New():create(cDruckerName)
if oHBPrinter:IsPrinterError() //// IMMER ABFRAGEN
Fehlermeldung
else
// setzen der sonstigen Druck-Parameter (Fonts, Copies etc.)
oHBPrinter:StartDoc("Teilnehmer-Liste")
oHBPrinter:PrintText( nCol , nLine, "Mein Text","C")
... weitere Druckkomandos
oHBPrinter:EndDoc()
oHBPrinter:Destroy()
endif
2. Du möchtest die Druckerauswahl (und Vorschau) haben, dann musst
du aber eine eigene Klasse von HBPrinter ableiten und Print und
Printform definieren !
Als Muster kannst du in TEST.PRG MyHBPrinter ansehen.
Natürlich könnte man auch in HBPRINT.PRG ändern, aber beim nächsten Update
ist dann alles weg
In diesem Falle also dieses:
Code: Alles auswählen
oHBPrinter := MyHBPrinter():New():create()
oHBPrinter:PrintingDialog() // hier wird alles geregelt
...
aber man muss die Druckausgabe definieren:
CLASS MyHBPrinter from HBPrinter
EXPORTED:
METHOD Print // Alle variablen Druckausgaben
METHOD PrintForm // Alle fixen Bestandteile einer Seite
ENDCLASS
METHOD MyHBPrinter:PrintForm()
local altFont, x,y, nWinkel
::HBPrinter:PrintForm()
altFont := ::SetFont(HB_FONT_14Arial)
// Reihenfolge ist egal, hier die Kopfzeile
::PrintText( 200,150, "Kopfzeile" )
// Fußzeile oder einfach alles gemischt.
::PrintText( 200,2800, "Seite:"+str(::nPageNo),,, "box" )
::SetFont(altFont)
// eventuell auch Abhängig von ::nPageNo, aber diese hier nicht ändern !
return self
*-------------------------------------------------------------
METHOD MyHBPrinter:Print() // diese Funktion wird nur einmal aufgerufen !
local x, nMaxX, PosX, PosY, cTxt
::nPageNo := 1
::lFirstPageForm := .f. // Formular 1. Seite noch nicht gedruckt
* Hier folgt ihr Code
::HBPrinter:Print()
* in abgeleiteten Klasse
::nFirstLine := 250
PosX := 200
PosY := ::nFirstLine
::SetFont(HB_FONT_12TimesNewRoman)
nMaxX := 600
::PrintForm() // erste Seite Formular drucken
for x := 1 to nMaxX
if PosY >= 2750 .or. PosY < 0 // Seite voll
::NewPage()
::PrintForm()
if ::IsAfterLastPage() // spart Zeit bei Seitenauswahl
exit
endif
PosY := ::nFirstLine
endif
::PrintText( PosX, PosY , "Zeile:"+str(x)+str(PosY) )
PosY += ::LineFeed()
next
return self
Code: Alles auswählen
*--------------------- allgemeine Funktionen - einmalig im Programm -------
Function ErrBox(uText,cTitel)
local cText,x,xMax
DEFAULT cTitel TO "Fehlermeldung"
do case
case valtype(uText) = "A"
cText := uText[1]
xMax := len(uText)
for x := 2 to xMax
cText += chr(13) + uText[x]
next
case valtype(uText) = "C"
cText := uText
otherwise
cText := "ErrBox wurde mit falschem Parameter "+;
" uText aufgerufen ! Type "+valtype(uText)+;
" statt C oder A"+chr(13)+;
"Bitte diesen Fehler melden."
endcase
MsgBox(cText,cTitel)
return NIL
*---------------------------------------------------------------------------
function ntrim( nVar )
return strTran(alltrim( str( nVar ) ),".",",")
Gruß
Hubert
Hubert
- brandelh
- Foren-Moderator
- Beiträge: 15701
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 69 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Der Standarddialog gibt immer einen Standarddrucker zurück, keinen HBPrinter(). Daher geht das so nicht.Lutz Rübe hat geschrieben: Kann ich statt Deinem PrintingDialog() den "Standard" DialogCode: Alles auswählen
oDlg := XbpPrintDialog():new() oDlg:create() oHBPrinter := oDlg:display() oDlg:destroy()
Das Einbinden in VX ist einfach, aber man muss folgendes beachten:
1. Der Editor und Compiler kommt damit klar, dass die PRG nicht im aktuellen Verzeichnis liegen. Der LINKER aber nicht. Daher immer die
Quellcodes zuerst per Explorer in das Projektverzeichnis kopieren, falls diese nicht schon dortliegen.
2. Im Projekt selbst (VX) die neuen (bestehenden) PRG einbinden, dann geht alles automatisch.
3. Die PROJECT.PRG nicht mehr direkt ändern, da VX diese dauernd aus den Einstellungen neu erzeugt ! Einstellungen ändern !
4. Ich hatte Probleme mit dem ß in meinem Dialog, da die PRG noch OEM war. Trotz Konverterschalter in den Einstellungen gab es Probleme.
Wieder mein Rat, alle PRGs in ANSI speichern und KEINE Konvertierung einstellen - wer es anders hinbekommt gut für ihn.
Gruß
Hubert
Hubert
- Lutz Rübe
- Rekursionen-Architekt
- Beiträge: 144
- Registriert: Mi, 02. Aug 2006 18:13
- Wohnort: 24536 Neumünster
- Danksagung erhalten: 6 Mal
- Kontaktdaten:
Hallo Hubert,
ich hatte irgendwie eine "Denksperre".
Ich habe das Problem jetzt wie folgt gelöst:
Was ich eigentlich wollte und mit dem obigen Code jetzt gelöst ist, war folgendes:
Die vorhandenen Drucker anzeigen, einen davon auswählen und für den jeweiligen Druckjob zum "Standard-Drucker" machen, ohne dass die Windows-Einstellungen ("Drucker als Standard definieren") konstant verändert werden.
Was ich also gesucht habe war die Auswahl eines Druckers, die Bestimmung seines Namens und die Übergabe des Namen an Deine Druckerklasse.
Gibt es dafür eigentlich eine elegantere Lösung als die, welche ich jetzt gefunden habe ?
Auf jeden Fall haben mir hier die Diskussion und die Lösungsansätze zu einer Lösung verholfen. Danke.
Gruß
Lutz
ich hatte irgendwie eine "Denksperre".
Ich habe das Problem jetzt wie folgt gelöst:
Code: Alles auswählen
oDlg := XbpPrintDialog():new()
oDlg:create()
oStdDrck := oDlg:display()
oDlg:destroy()
cDruckerName:= oStdDrck:devName
oStdDrck:destroy()
oHBPrinter := HBPrinter():New():create(cDruckerName)
Die vorhandenen Drucker anzeigen, einen davon auswählen und für den jeweiligen Druckjob zum "Standard-Drucker" machen, ohne dass die Windows-Einstellungen ("Drucker als Standard definieren") konstant verändert werden.
Was ich also gesucht habe war die Auswahl eines Druckers, die Bestimmung seines Namens und die Übergabe des Namen an Deine Druckerklasse.
Gibt es dafür eigentlich eine elegantere Lösung als die, welche ich jetzt gefunden habe ?
Auf jeden Fall haben mir hier die Diskussion und die Lösungsansätze zu einer Lösung verholfen. Danke.
Gruß
Lutz
- brandelh
- Foren-Moderator
- Beiträge: 15701
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 69 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Hi,
meine Druckerdialog ist in meiner Klasse integriert etwas 'eleganter', aber vielleicht fällt dir das mit den Klassen schwerer oder du willst den Standarddialog wählen ...
In eigenen Programmen habe ich auch eine einfache Listboxauswahl ähnlich einem achoice die die Namen anzeigt und in der einer speichert.
Vom Grundsatz her druckt man entweder wie du oben alles in der Liste die man Programmiert hat, oder man übergibt gleich an meinen Druckerdialog, der dann Print aufruft, das wiederum Printpage aufruft.
Bei diesem muss man sich num startdoc und destroy nicht kümmern, allerdings kann man auch noch keinen Namen für den Druckauftrag vergeben. Da muss ich nochwas anpassen.
meine Druckerdialog ist in meiner Klasse integriert etwas 'eleganter', aber vielleicht fällt dir das mit den Klassen schwerer oder du willst den Standarddialog wählen ...
In eigenen Programmen habe ich auch eine einfache Listboxauswahl ähnlich einem achoice die die Namen anzeigt und in der einer speichert.
Vom Grundsatz her druckt man entweder wie du oben alles in der Liste die man Programmiert hat, oder man übergibt gleich an meinen Druckerdialog, der dann Print aufruft, das wiederum Printpage aufruft.
Bei diesem muss man sich num startdoc und destroy nicht kümmern, allerdings kann man auch noch keinen Namen für den Druckauftrag vergeben. Da muss ich nochwas anpassen.
Gruß
Hubert
Hubert
- Lutz Rübe
- Rekursionen-Architekt
- Beiträge: 144
- Registriert: Mi, 02. Aug 2006 18:13
- Wohnort: 24536 Neumünster
- Danksagung erhalten: 6 Mal
- Kontaktdaten:
Hallo Hubert,
ich habe jetzt - wie schon vorher beschrieben - meinen Drucker-Auswahldialog in die Anwendung integriert. Das funktioniert zur vollsten Zufriedenheit.
Jetzt habe ich jedoch noch eine Frage: Wenn ich jetzt im Rahmen des Druckerauswahldialoges die Druckereigenschaften ändere (Anzahl Kopien, Querformat, Beidseitig, Fachauswahl etc.), werden diese nicht in Deine Druckerklasse übernommen.
Ist das richtig ? Muß ich alle diese Einstellungen über Deine Druckerklasse vornehmen ?
Gruß
Lutz
ich habe jetzt - wie schon vorher beschrieben - meinen Drucker-Auswahldialog in die Anwendung integriert. Das funktioniert zur vollsten Zufriedenheit.
Jetzt habe ich jedoch noch eine Frage: Wenn ich jetzt im Rahmen des Druckerauswahldialoges die Druckereigenschaften ändere (Anzahl Kopien, Querformat, Beidseitig, Fachauswahl etc.), werden diese nicht in Deine Druckerklasse übernommen.
Ist das richtig ? Muß ich alle diese Einstellungen über Deine Druckerklasse vornehmen ?
Gruß
Lutz
- Lutz Rübe
- Rekursionen-Architekt
- Beiträge: 144
- Registriert: Mi, 02. Aug 2006 18:13
- Wohnort: 24536 Neumünster
- Danksagung erhalten: 6 Mal
- Kontaktdaten:
Hallo Andreas,
der XbpPrinterDialog bietet mir die Möglichkeit, einen vorhandenen, installierten Drucker auszuwählen. Wenn ich im Rahmen dieses Dialoges auf die Druckereigenschaften des Drucker gehe, kann ich ja diverse Einstellungen vornehmen (Fachauswahl, Querformat, Papierformat etc).
Diese werden aber anscheinend nicht in das XbpPrinter Objekt übernommen bzw. in die HBPrinterClass Objekte.
Beispiel: ich habe in meinem xBase Programm keine Querformat-Angaben. Übernehme daher die Standardvorgaben. Nun wollte ich im Rahmen des XbpPrinterDialogs über die Druckereigenschaften ausnahmsweise einmal im Querformat drucken. Dafür will und wollte ich nicht den Source Code verändern. Diese Änderung im "Druckertreiber" wurde in der PrinterClass von Hubert nicht übernommen.
Gruß
Lutz
der XbpPrinterDialog bietet mir die Möglichkeit, einen vorhandenen, installierten Drucker auszuwählen. Wenn ich im Rahmen dieses Dialoges auf die Druckereigenschaften des Drucker gehe, kann ich ja diverse Einstellungen vornehmen (Fachauswahl, Querformat, Papierformat etc).
Diese werden aber anscheinend nicht in das XbpPrinter Objekt übernommen bzw. in die HBPrinterClass Objekte.
Beispiel: ich habe in meinem xBase Programm keine Querformat-Angaben. Übernehme daher die Standardvorgaben. Nun wollte ich im Rahmen des XbpPrinterDialogs über die Druckereigenschaften ausnahmsweise einmal im Querformat drucken. Dafür will und wollte ich nicht den Source Code verändern. Diese Änderung im "Druckertreiber" wurde in der PrinterClass von Hubert nicht übernommen.
Gruß
Lutz
- brandelh
- Foren-Moderator
- Beiträge: 15701
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 69 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Hallo Lutz, Hallo Andreas,
die HBPrinter-Klasse entspricht einem Presentationspace und nicht dem Drucker. Meine Klasse geht natürlich davon aus, dass der eigene Druckerauswahldialog benutzt wird. Dieser würde das intern regeln, wobei wie schon öffters geschrieben meine Druckerklasse auf älteren Xbase++ Versionen geschrieben wurde und auch funktionieren muss.
Grundsätzlich gibt es die Möglichkeit die Einstellungen die interessieren Anzahl der Kopien etc. abzufragen und neu zu setzen. Die 1.90 Methoden dazu sind integriert, aber bisher nicht in der Praxis im Einsatz (ich mach das anders...).
wie gesagt. Eigentlich müsste es genau wie gewünscht funktionieren, aber ich habe es nicht so im Einsatz ... bei der Entwicklung wurde es so getestet und muss wohl funktioniert haben.
die HBPrinter-Klasse entspricht einem Presentationspace und nicht dem Drucker. Meine Klasse geht natürlich davon aus, dass der eigene Druckerauswahldialog benutzt wird. Dieser würde das intern regeln, wobei wie schon öffters geschrieben meine Druckerklasse auf älteren Xbase++ Versionen geschrieben wurde und auch funktionieren muss.
Grundsätzlich gibt es die Möglichkeit die Einstellungen die interessieren Anzahl der Kopien etc. abzufragen und neu zu setzen. Die 1.90 Methoden dazu sind integriert, aber bisher nicht in der Praxis im Einsatz (ich mach das anders...).
Code: Alles auswählen
[color=red]jetzt einfach so aus dem Gedächtnis, ohne es getestet zu haben:[/color]
oPrnDlg := XbpPrinterDialog():new():create()
oPrnXP := oPrnDlg:display()
oPrnDlg:destroy()
if oPrnXP # NIL
oHBPrn := HbPrinter():New():create(oPrn:devName) // Name des Druckers übergeben
oHBPrn:SetCollationMode( oPrnXP:SetCollationMode() )
oHBPrn:SetNumCopies( oPrnXP:SetNumCopies() )
etc.
Gruß
Hubert
Hubert
- Lutz Rübe
- Rekursionen-Architekt
- Beiträge: 144
- Registriert: Mi, 02. Aug 2006 18:13
- Wohnort: 24536 Neumünster
- Danksagung erhalten: 6 Mal
- Kontaktdaten:
Hallo Hubert,
danke für Deinen Hinweis, so habe ich es ja auch in meinem Programm bereits eingebaut.
Nun habe ich aber die Situation, dass ich nur für einen einzigen Ausdruck eine besondere Eigenschaft eines Druckers (z.B. Duplex) nutzen. Dafür möchte oder kann ich aber nicht mein Programm ändern (für diese einmalige Situation) sondern die Einstellungen, wie ich sie im Druckertreiber vornehmen kann.
Dies funktionierte nicht bisher nicht bei mir.
Gruß
Lutz
danke für Deinen Hinweis, so habe ich es ja auch in meinem Programm bereits eingebaut.
Nun habe ich aber die Situation, dass ich nur für einen einzigen Ausdruck eine besondere Eigenschaft eines Druckers (z.B. Duplex) nutzen. Dafür möchte oder kann ich aber nicht mein Programm ändern (für diese einmalige Situation) sondern die Einstellungen, wie ich sie im Druckertreiber vornehmen kann.
Dies funktionierte nicht bisher nicht bei mir.
Gruß
Lutz
- brandelh
- Foren-Moderator
- Beiträge: 15701
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 69 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Hallo Lutz,
also wenn im Xbase++ Programm nichts eingestellt wird, müsste er eigentlich die Standardeinstellungen des Druckertreibers nutzen.
So habe ich das ja früher geregelt.
2 Druckerobjekte, der eine druckt normal, der andere immer Dublex.
Das sollte immer funktionieren, du mußt das aber VOR dem Ausdruck direkt im Druckertreiber ändern, nicht erst in der Druckerauswahl.
Der eine heißt z.B. LASER SINGEL und der zweite LASER DUBLEX.
Den gewünschten wählst du dann nur noch aus und ab damit.
Einstellungen am DRUCKER selbst werden vom Druckertreiber oft zurückgesetzt, außer du hast dort die Auswahl Standard oder Vorgabe, das kommt aufs Druckermodell an.
also wenn im Xbase++ Programm nichts eingestellt wird, müsste er eigentlich die Standardeinstellungen des Druckertreibers nutzen.
So habe ich das ja früher geregelt.
2 Druckerobjekte, der eine druckt normal, der andere immer Dublex.
Das sollte immer funktionieren, du mußt das aber VOR dem Ausdruck direkt im Druckertreiber ändern, nicht erst in der Druckerauswahl.
Der eine heißt z.B. LASER SINGEL und der zweite LASER DUBLEX.
Den gewünschten wählst du dann nur noch aus und ab damit.
Einstellungen am DRUCKER selbst werden vom Druckertreiber oft zurückgesetzt, außer du hast dort die Auswahl Standard oder Vorgabe, das kommt aufs Druckermodell an.
Gruß
Hubert
Hubert
Hallo Hubert,
ich habe zwischzeitlich (wir haben Ende März Nachwuchs bekommen und unser Sohn beansprucht unsere Zeit) auch abgestimmt. Ich nutze Deine Klasse ausschließlich.
Allerdings habe ich einige Änderungen vorgenommen, zum Beispiel das Umgehen des Druckdialogs, wenn mal einfach nur mit den Standardeinstellungen durch Klick auf das Druck-Icon geduckt werden soll. Oder die Anzahl der Drucke aus meinem Programm heraus voreingestellt.
Ich will Dich ermutigen, die Klasse weiterzuentwickeln. Mir jedenfalls hat sie sehr geholfen und vieles vereinfacht.
Grüße
Heinz
ich habe zwischzeitlich (wir haben Ende März Nachwuchs bekommen und unser Sohn beansprucht unsere Zeit) auch abgestimmt. Ich nutze Deine Klasse ausschließlich.
Allerdings habe ich einige Änderungen vorgenommen, zum Beispiel das Umgehen des Druckdialogs, wenn mal einfach nur mit den Standardeinstellungen durch Klick auf das Druck-Icon geduckt werden soll. Oder die Anzahl der Drucke aus meinem Programm heraus voreingestellt.
Ich will Dich ermutigen, die Klasse weiterzuentwickeln. Mir jedenfalls hat sie sehr geholfen und vieles vereinfacht.
Grüße
Heinz
Das einzige, was ich weiß ist, dass ich nichts weiß, Sokrates
- brandelh
- Foren-Moderator
- Beiträge: 15701
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 69 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Version 1.33 freigegeben
Hallo,
die neue Version meiner Druckerklasse ist nun in 2 Versionen erhältlich, ANSI / OEM
-> http://www.familie-brandel.de
weitere Infos gibt es hier
-> http://www.xbaseforum.de/viewtopic.php?f=17&t=3659
ob der Marktplatz aber der richtige Ort ist ... schließlich wird ja nix verkauft, is ja FREEWARE .
die neue Version meiner Druckerklasse ist nun in 2 Versionen erhältlich, ANSI / OEM
-> http://www.familie-brandel.de
weitere Infos gibt es hier
-> http://www.xbaseforum.de/viewtopic.php?f=17&t=3659
ob der Marktplatz aber der richtige Ort ist ... schließlich wird ja nix verkauft, is ja FREEWARE .
Gruß
Hubert
Hubert
- Schorsch
- Cut&Paste-Entwickler
- Beiträge: 45
- Registriert: So, 21. Sep 2008 19:21
- Wohnort: Sinsheim im Kraichgau
Re: Drucken mit HBPrinter - Was geht wie warum ???
Hallo Hubert,
ich habe deine Durckerklasse ersmals benutzt und stehe vor folgendem Problem:
Ich nutze den Dialog zur Druckerauswahl und bei der ersten Anzeige der Vorschau wird nur das "Formular" angezeigt (ohne den variablen print() Teil). Blättere ich allerdings zurück , dann wird die Seite komplett und richtig dargestellt _ auch wenn ich weiter vor und zurückblättere.
Das Problem tritt beim ersten Anzeigen auf und beim Drucken stell es sich so dar, dass die 1ste Seite das Formular druckt und die 2te Seite dann das Formular + inhalt der ersten Seite.
Ich habe leider keine Idee mehr, wo ich suchen soll um dies zu beheben. Für einen "systematischen" Tip wäre ich sehr dankbar.
Schorsch
ich habe deine Durckerklasse ersmals benutzt und stehe vor folgendem Problem:
Ich nutze den Dialog zur Druckerauswahl und bei der ersten Anzeige der Vorschau wird nur das "Formular" angezeigt (ohne den variablen print() Teil). Blättere ich allerdings zurück , dann wird die Seite komplett und richtig dargestellt _ auch wenn ich weiter vor und zurückblättere.
Das Problem tritt beim ersten Anzeigen auf und beim Drucken stell es sich so dar, dass die 1ste Seite das Formular druckt und die 2te Seite dann das Formular + inhalt der ersten Seite.
Ich habe leider keine Idee mehr, wo ich suchen soll um dies zu beheben. Für einen "systematischen" Tip wäre ich sehr dankbar.
Schorsch
Gruß
Schorsch
Schorsch
- brandelh
- Foren-Moderator
- Beiträge: 15701
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 69 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Drucken mit HBPrinter - Was geht wie warum ???
Hi,
auf der ersten Seite darf noch kein Seitenvorschub definiert werden, ansonsten bräuchte ich den (gekürzten) Quellcode um mehr zu sehen. Notfalls per eMail an meine Adresse hubert PUNKT brandel AT gmx PUNKT de
auf der ersten Seite darf noch kein Seitenvorschub definiert werden, ansonsten bräuchte ich den (gekürzten) Quellcode um mehr zu sehen. Notfalls per eMail an meine Adresse hubert PUNKT brandel AT gmx PUNKT de
Gruß
Hubert
Hubert
- brandelh
- Foren-Moderator
- Beiträge: 15701
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 69 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Drucken mit HBPrinter - Was geht wie warum ???
Hallo Schorsch,
mir vielen 3 Sachen auf, 2 sind Schönheitsfehler, der 3. der Grund warum es bei dir so ist
1. In Print die Vorgaben richtig setzen, also am Anfang:
::nPageNo := 1 // das ist zwar nicht nötig, aber sicherer
::lFirstPageForm := .f. // Formular 1. Seite noch nicht gedruckt - form 1. page not printed
diese Variable verhindert, dass bereits auf der ersten Seite eine NewPage() ausgeführt wird.
Intern wird diese dann auf .t. gesetzt und somit erfolgt später denn alles richtig.
Bei .t. KANN es sein, dass am Anfang eine leere Seite gedruckt wird !
::nFirstLine // legt in der Klasse die Position fest, an der der Ausdruck von oben beginnt.
Sehr wichtig falls automatisch eine neue Seite benötigt wird (PrintMemo) ...
Diese Variablen sind in den Beispielen immer gesetzt.
2. Gerade für die Vorschau ist es wichtig, dass die unnötigen Seiten NACH der aktuell angezeigten
nicht berechnet werden müssen, daher ist diese Abfrage in den Beispielen enthalten
Wenn diese Abfrage fehlt, und man auf der 2. von 10000 Seiten ist, versteht man, warum es eingebaut wurde
3. Unglückliche Verkettung von fehlender Vorgabe und dieser Abfrage ...
Beim 1. Aufruf ist also PosY NEGATIV ! und trifft auf ...
hier wird dann, da ja PosY negativ ist, erst auf der nächsten Seite mit der ersten Zeile begonnen.
Sobald man blättert wird aber PosY richtig gesetzt und die Zeilen erscheinen wie gewohnt.
LÖSUNG: Reihenfolge hier umdrehen:
mir vielen 3 Sachen auf, 2 sind Schönheitsfehler, der 3. der Grund warum es bei dir so ist
1. In Print die Vorgaben richtig setzen, also am Anfang:
Code: Alles auswählen
::nPageNo := 1
::lFirstPageForm := .f. // Formular 1. Seite noch nicht gedruckt - form 1. page not printed
* Hier folgt ihr Code
::HBPrinter:Print() // m”glich, aber eigentlich unn”tig - it's possible, but I think useless
* in abgeleiteten Klasse - in derived classes
::nFirstLine := 250
::lFirstPageForm := .f. // Formular 1. Seite noch nicht gedruckt - form 1. page not printed
diese Variable verhindert, dass bereits auf der ersten Seite eine NewPage() ausgeführt wird.
Intern wird diese dann auf .t. gesetzt und somit erfolgt später denn alles richtig.
Bei .t. KANN es sein, dass am Anfang eine leere Seite gedruckt wird !
::nFirstLine // legt in der Klasse die Position fest, an der der Ausdruck von oben beginnt.
Sehr wichtig falls automatisch eine neue Seite benötigt wird (PrintMemo) ...
Diese Variablen sind in den Beispielen immer gesetzt.
2. Gerade für die Vorschau ist es wichtig, dass die unnötigen Seiten NACH der aktuell angezeigten
nicht berechnet werden müssen, daher ist diese Abfrage in den Beispielen enthalten
Code: Alles auswählen
if ::IsAfterLastPage() // Ist Shortcut möglich ? (spart Zeit, wichtig für Vorschau !)
exit // is shortcut possible ? (saves time. Preview needs this ! )
endif
3. Unglückliche Verkettung von fehlender Vorgabe und dieser Abfrage ...
Code: Alles auswählen
PosY := ::nFirstLine // ::nFirstLine ist noch auf Vorgabe, je nach Drucker auch NEGATIV !
::PrintForm() // erste Seite Formular drucken
do case
case ::nPageNo = 1
::nFirstLine := n1TextZeile
otherwise
::nFirstLine := n2TextZeile
endcase
Code: Alles auswählen
do while AuftPos->AuftragNr = Auftrag->AuftragNr .and. .not. eof()
nPosBetrag := 0.00
nFrachtBetrag := 0.00
nRabattBetrag := 0.00
nRabattPreis := 0.00
if PosY >= 2485 .or. PosY < 0 // Seite voll
Sobald man blättert wird aber PosY richtig gesetzt und die Zeilen erscheinen wie gewohnt.
LÖSUNG: Reihenfolge hier umdrehen:
Code: Alles auswählen
::PrintForm() // erste Seite Formular drucken
do case
case ::nPageNo = 1
::nFirstLine := n1TextZeile
otherwise
::nFirstLine := n2TextZeile
endcase
PosY := ::nFirstLine // nun ist ::nFirstLine auf jeden Fall gesetzt
Gruß
Hubert
Hubert
- Schorsch
- Cut&Paste-Entwickler
- Beiträge: 45
- Registriert: So, 21. Sep 2008 19:21
- Wohnort: Sinsheim im Kraichgau
Re: Drucken mit HBPrinter - Was geht wie warum ???
Hallo Hubert,
vielen Dank für die Mühe - aber es hat sich gelohnt - ich habe alle deine Vorschläge eingebaut und zack- es klappt genau so wie gewünscht.
Aber alleine wäre ich nicht auf diese Lösung gekommen. (grün hüpfender Smily)
vielen Dank für die Mühe - aber es hat sich gelohnt - ich habe alle deine Vorschläge eingebaut und zack- es klappt genau so wie gewünscht.
Aber alleine wäre ich nicht auf diese Lösung gekommen. (grün hüpfender Smily)
Gruß
Schorsch
Schorsch
- messing
- Rekursionen-Architekt
- Beiträge: 216
- Registriert: Mi, 13. Jan 2010 9:42
- Wohnort: Lauterbach / Hessen
Re: Drucken mit HBPrinter - Was geht wie warum ???
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
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
? "Gebhren: ",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 "Gebhren:"
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 "Gebhren:"
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 "Gebhren / 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 *
Gruß
Bruno
Messing
Bruno
Messing