Wie einfach auf USB-Drucker zugreifen ?

Von Ausgaben mit der Gra-Engine über Generatoren bis zum Export in diversen Formaten

Moderator: Moderatoren

Antworten
wolfgang

Wie einfach auf USB-Drucker zugreifen ?

Beitrag von wolfgang »

Hallo,
mein Name ist Wolfgang und ich bin ein Anwender, der gelegentlich für betriebl. Belange der Abteilung Anwendungen programmiert. Über dBASE, dann CLIPPER bin ich schliesslich zu Xbase (Vers. 1.6) gelangt, wobei es immer nur darum ging, die "alten" Programme unter dem jeweils aktuellen WINDOWS (im DOS-Fenster) lauffähig zu halten.
Mein jetziges Problem: der LPT-Drucker will nicht mehr und die Druckausgaben sollen an div. Arbeitsplätzen über USB-Drucker erfolgen können. LPT-Geräte werden abgeschafft und Netzdrucker machen über NET USE häufig Probleme (doppeldruck, Spoolerblockade etc).
Kann mir jemand Programmcode zur Verfügung stellen, mit dem ich schnell die Druckausgaben umleiten kann ? Bin für jede Unterstützung dankbar :wink:
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo Wolfgang,

zuerst, es wäre nett, wenn du den Vorstellungsteil in den Vorstellungs Thread kopieren könntest, da man nur dort danach sucht.

Nun zu deinem Problem.

Wie willst du Drucken ?

1. nach clipper manier ... PCL / ESC/P IBMProprinter ...
ab der Version 1.90 kann man mit
set printer to oPrinterObject
auch USB Drucker wie bisherige LPT etc ansprechen, aber
der Drucker muss die z.B. über Variablen eingestreuten Steuerzeichen auch verstehen. Normale (billige) GDI Drucker können das nicht und somit ist das Funktionieren immer auch vom Druckermodell abhängig.
Auch wenn diese Methode einfach ist, sie ist nicht sicher und schon gar nicht zukunftssicher !
Ich habe hier z.B. einen PCL/PS Farblaser, der alle Druckstandards beherrscht und per Bedienungspannel auf PC8 Zeichensatz eingesstellt ist.
Dennoch druckt er keine Umlaute, wenn ich nicht im Programm Roman8 einstelle. Der alte 'DOS' Druck wird eben von den Druckerherstellern weder getestet noch unterstützt !

2. Windowsdruck

Sieh dir meine HBPrinterX Druckerklasse an (Adressen hier in der Wissensbasis, bei Alaska download etc), mit dieser kann man recht einfach alle möglichen Druckausgaben machen. Diese funktionieren auf JEDEM Windowsdrucker, und das schon mit der Xbase Version 1.30, wobei die 1.90 eindeutig vorzuziehen ist ;-)
Damit kann man - wenn man will - auch eine Druckerauswahl mit Vorschau nutzen.
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo,

je nach Bedarf könnte auch die Fernsteuerung (ActiveX) von OpenOffice oder MS Word genutzt werden. Im Forum ActiveX und in den Programmbeispielen von 1.90 (diese ist dafür nötig) sieht man Beispiele von Word.DOT Dateien, welche Lesezeichen (z.B. {NAME}) im Text haben. Der Endanwender könnte diese ändern oder neu erstellen und das Xbase++ Programm ruft dann Word per ActiveX auf, füllt die Platzhalter mit Text aus, speichert und druckt (wie man es will).

Grundsätzlich ginge natürlich auch ein Reportgenerator ...
Gruß
Hubert
Benutzeravatar
Rolf Ramacher
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1930
Registriert: Do, 09. Nov 2006 10:33
Wohnort: Bergheim
Danksagung erhalten: 3 Mal
Kontaktdaten:

Druckerauswahl

Beitrag von Rolf Ramacher »

Hallo Wolfgang,

ich nutze die hierbei den XbpPrintDialog von Xbase. Hierbei kann ich ebenfalls die entsprechenden Drucker auswählen, wie wenn du aus
Word-Excel druckst.

Ich setze die Version 1.90 ein. Ob xbpPrintDialog bei der Version 1.6 enthalten ist weiß ich nicht. Prüf dies in der Hilfe von Alaska mal nach.
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Beitrag von Tom »

Hallo, Wolfgang.

Wenn Du den Code nicht ändern willst, hilft vielleicht das hier. Empfehlung ohne Gewähr, ich habe von diesem Tool bisher nur gehört und es noch nie eingesetzt, weil unsere Xbase-App komplett GUI ist und einen Reporter benutzt.

http://www.dosprint.com/
Herzlich,
Tom
wolfgang

Schon mal Danke für die Hilfe aber .....

Beitrag von wolfgang »

Hallo Hubert und die freundlichen Helfer im Forum,
habe zwischenzeitlich Xbase 1.9 erhalten und kann Netzdrucker (mit kleinen Anpassungen an Fonts und Layout) bedienen.
Jetzt möchte ich aber gerne, ohne große Änderungen an Programmcode, USB-Drucker aus meinen Programmen (ohne Zukauf von Fremdprodukten) ansprechen können. Mit deinem "HBPRINTER" , dass du mir freundlicherweise per email zugesandt hattest, habe ich experementiert, bin aber zu keinem brauchbaren Ergebnis gekommen. Ich verstehe nicht, wie ich das Programm bei mir einbinden kann und wo ich die Druckerausgaben plazieren kann (2 x die Anweisung MAIN und ohne MAIN Compilerfehler).
Mein Programm ist so gestaltet, das der Anwender zuerst den Drucker und den Druckort (Netzdrucker / lokaler Drucker) wählen muß und dann über Menü bestimmt, was er drucken will. Die Ausgabe erfolgt dann top-down, wobei mehrere Dateien angesprochen werden und auch Berechnungen vor der Ausgabe erfolgen. Kannst du mir noch Hinweise geben oder hat noch jemand eine "einfachere" Lösung ?

Gruss Wolfgang
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Wolfgang,

ich bin mehr jetzt nicht ganz sicher ob ich Dich richtig verstanden habe, aber der Druckerport ist eigentlich egal. Du erzeugst ein Druckerobjekt mit xbpPrinter() und sagst diesem Objekt bei create() welchen Drucker Du ansprechen möchtest. Solange dieser Drucker dem System bekannt ist, also auf der WS installiert ist, wird automatisch der Druckerport angesprochen, der im Drucker als Ausgabeport angegeben ist. Dabei ist es egal, ob es ein lokaler oder ein freigegebener Drucker einer anderen WS ist. Hauptsache er ist auf der eigentlichen WS bekannt.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo Manfred,

nicht ganz, der Drucker muss auch das alte Drucken unterstützen, d.h. er selbst oder sein Druckertreiber muss in der Lage sein, sich wie ein alter PCL oder IBMProprinter zu verhalten. Gerade billige GDI Drucker (meist mit USB) können das nämlich nicht. In diesem Falle sendet zwar Xbase++ über die Schnittstelle die Rohdaten, nur der Drucker kann damit nichts anfangen.
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Beitrag von AUGE_OHR »

hi,
brandelh hat geschrieben: nicht ganz, der Drucker muss auch das alte Drucken unterstützen, d.h. er selbst oder sein Druckertreiber muss in der Lage sein, sich wie ein alter PCL oder IBMProprinter zu verhalten.
Idee : ... ich hab da ein DBF mit 361 Drucker und deren ESC Sequenzen.
wenn man nun aus dem zu "druckenden" Test die ESC Sequenzen
"herraus filter" und die mit den in der DBF zum Drucker vorhandenen
"vergleicht" könnte man daraus die ensprechende "oFont" Änderrung
durchführen ...

Anmerkung : wenn ich mich recht erinnere waren die ESC Sequenzen
sehr oft die "gleichen" und viel Auswahl an "Fonts" gabs auch nicht ...

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

Beitrag von brandelh »

Hi,

die Neuprogrammierung mit Xbase++ GUI Mitteln bzw. Reportgeneratoren erscheint mir da aber wesentlich einfacher und auch zukunftsträchtiger.
Gruß
Hubert
Benutzeravatar
Rolf Ramacher
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1930
Registriert: Do, 09. Nov 2006 10:33
Wohnort: Bergheim
Danksagung erhalten: 3 Mal
Kontaktdaten:

Beitrag von Rolf Ramacher »

Hi Wolfgang,

also wenn du möchtest kann ich dir meinen Teil mal posten. Ich drucke mit xbpprintdialog- hierbei erscheint dann die Druckerauswahl, wie du sie auch unter word kennst.
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
Daniel

Beitrag von Daniel »

brandelh hat geschrieben:... der Drucker muss auch das alte Drucken unterstützen, d.h. er selbst oder sein Druckertreiber muss in der Lage sein, sich wie ein alter PCL oder IBMProprinter zu verhalten. Gerade billige GDI Drucker (meist mit USB) können das nämlich nicht. In diesem Falle sendet zwar Xbase++ über die Schnittstelle die Rohdaten, nur der Drucker kann damit nichts anfangen.
Hallo XBase-Cracks!

Genau so ein Problem habe ich jetzt auch.
Die Applikation habe ich vor etlichen Jahren aus Clipper migriert, d.h. so lange an XBase 1.7 angepasst, bis sie im Hybrid-Modus wieder lief. Die Drucker werden über LPT1 ... angesprochen, im Netz ebenfalls (mit Capture ...).
Nun muss ich eine schnelle Lösung finden, um die Arbeitsplatzdrucker über USB ansprechen zu können. Später soll das Ganze dann mal überarbeitet werden, doch das braucht bekanntlich Zeit ... ;-)

Das Meiste ist reiner ASCII-Text mit Umlauten, z.T. kommt noch Fettdruck vor, aber sonst kaum Steuerzeichen im Text drin.
Kann ich denn in einer Hybrid-App einfach so Xbp-Funktionen anwenden? Natürlich habe ich inzwischen XB++1.9 und arbeite in neuen Projekten auch mit GUI und Klassen/Meth.

Und eben, was macht ein neuer USB-Drucker dann aus dem ASCII-Text?

P.S. Irgendwie bin ich da aus den Antworten noch nicht ganz schlau geworden. Ich steh wohl irgendwie auf der Leitung ...?
Benutzeravatar
Rolf Ramacher
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1930
Registriert: Do, 09. Nov 2006 10:33
Wohnort: Bergheim
Danksagung erhalten: 3 Mal
Kontaktdaten:

Beitrag von Rolf Ramacher »

Hallo Daniel,

hier ein Code-auszug von mir. In diesem Fall, habe ich in einer vorherigen Funciton eine RTF-Datei erstellt. Du kannst dies aber genauso deine Ausgabe mit GraStringAT() machen.

Code: Alles auswählen

#include "Gra.ch"
#include "Xbp.ch"
#include "Appevent.ch"
#include "Font.ch"
#include "Inkey.ch"
#include "xbpdev.ch"

#pragma Library( "XppUI2.lib" ) 

Function ListeDrucken()
	Local cVerz:=""

	FAttr("filbestandliste.rtf","-H")
	FAttr("filbestandliste.rtf","-R")
	cVerz:=CurDrive()+":\"+CurDir()

   oDlg := XbpPrintDialog():new() 
   // Druckausgabe nicht standardmäßig in Datei umleiten 
   oDlg:enablePrintToFile := .f. 
   oDlg:printToFile       := .f. 
   oDlg:create() 

   // Konfiguriertes Drucker Objekt erzeugen 
   oPrinter := oDlg:display() 
   oDlg:destroy() 

   IF oPrinter <> NIL 
		cPrinter:=oPrinter:DevName
		Drucken(cVerz+"\filbestandliste.rtf",cPrinter)
	EndIf
	FAttr("filbestandliste.rtf","H")
	FAttr("filbestandliste.rtf","R")
Return Nil



#include "Gra.ch"
#include "Xbp.ch"
#include "Appevent.ch"
#include "Font.ch"
#include "Inkey.ch"
#include "xbpdev.ch"

#pragma Library( "XppUI2.lib" ) 
#pragma library( "ascom10.lib" ) 

Function Drucken( cDoc, cDrucker) 
Local cActivePrinter 
Local oWord 
Local oDoc 

    oWord := CreateObject("Word.Application") 

   IF Empty( oWord ) 
     MsgBox( "Microsoft Word ist nicht installiert" ) 
     RETURN Nil
   ENDIF 

   oWord:visible   := .F.                               // Word unsichtbar! 
   cActivePrinter  := oWord:Activeprinter     // aktuellen Drucker feststellen 
   oWord:Activeprinter:= cDrucker               // Neuen Drucker setzen 
   oWord:documents:Open(cDoc)                  
   oDoc       := oWord:ActiveDocument 
   oDoc:PrintOut(.f.)                                  // .T.= Druck im Hintergrund 
   oWord:Activeprinter:= cActivePrinter       // alten Drucker setzen 
   oDoc:close() 
   oWord:Quit() 
   oWord:destroy() 
   oWord := NIL 
Return ( NIL )
Mit der Function Drucken() druckt die RTF-Datei über Word. Wenn du deine Texte mit GraStringAT druckst, dann brauchst due Drucken ()
NICHT.

XbpPrintDialog() erzeugt die Druckerauswahl
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo,

wenn dein USB Drucker den CODE (PCL, ESC/P etc.) des bisherigen Druckers versteht, reicht es bei 1.90 aus

Code: Alles auswählen

oXbpPrinter := XbpPrinter():new():create("DruckerName")
SET PRINTER TO OBJECT oXbpPrinter

? Steuerzeichenstring ...
diese beiden Zeilen vor die ? Druckausgabe zu bringen.
Wenn der neue Drucker ein GDI (alle billigen und viele teureren auch) ist, geht kein Weg an der Neuprogrammierung mit XbpPrinter() ... vorbei.
Gruß
Hubert
Daniel

Beitrag von Daniel »

Rolf Ramacher hat geschrieben: In diesem Fall, habe ich in einer vorherigen Funciton eine RTF-Datei erstellt. Du kannst dies aber genauso deine Ausgabe mit GraStringAT() machen.

Mit der Function Drucken() druckt die RTF-Datei über Word. Wenn du deine Texte mit GraStringAT druckst, dann brauchst due Drucken ()
NICHT.

XbpPrintDialog() erzeugt die Druckerauswahl
Hallo Rolf

besten Dank!
Ich drucke dort nicht über GraStringAT() und auch nicht über eine Datei, sondern direkt in der Art:

SET Printer to LPT1 // resp. &cPrinterLocal
@Prow()+1, 5 say ....
...
...
EJECT

Natürlich würde ich das in einer neuen Version anders lösen, doch leider blieb das liegen und jetzt drängt der Kunde...
Daniel

Beitrag von Daniel »

brandelh hat geschrieben: wenn dein USB Drucker den CODE (PCL, ESC/P etc.) des bisherigen Druckers versteht ...
Hallo Hubert

vielen Dank!
Ist soweit klar. Das muss ich mal ausprobieren.
Vielleicht kann ich dem Kunden klarmachen, dass er besser einen richtigen Drucker kauft, statt einen billigen, auch wenn er da noch eine Kaffeemaschine oder Extrameilen dazu bekommt ... :roll: :tongue:

Und Dein Tool, das wäre nur für voll-GUI-Apps?
Wie will das die Druckdaten oder Druckzeilen haben?
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Beitrag von Koverhage »

Für alle die diese Probleme bei der Umstellung haben, oder noch Nadeldrucker bedienen müssen, habe ich das was wir benutzen zum ownload bereitgestellt.

www.energy-softwareservice.de/prntest.zip
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Daniel hat geschrieben:Und Dein Tool, das wäre nur für voll-GUI-Apps?
Meine Druckerklasse kann man wie XbpPrinter() dann verwenden, wenn in der Projektdatei GUI=YES steht. Ob die Anwendung dann noch nach Clipper aussieht spielt keine Rolle.

Damit hat man auf jeden Fall Ruhe vor allen Druckeränderungen die da kommen können.

In einem meiner Programme habe ich noch die alte Ansteuerung und extra per Hand mit NET USE einen passenden Drucker auf eine lokale LPT gemappt. Nun haben sie einen neuen Rechner bekommen, da der alte kaputt ging. Dumm nur, dass das mit dem 'per Telefon einrichten' der Netzzuordnung einfach nicht funktionieren will - 200 KM Luftlinie :?
Gruß
Hubert
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Hubert,

VNC

8)
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Manfred hat geschrieben:Hi Hubert,
VNC
8)
habe ich im Hause hinter meinem Router auch, aber ohne Verschlüsselung übers Netz und dann beim Zielrechner in den Router einen Port durchschleifen ?
Dort müsste ich ja VNC Server einrichten, dass er aus dem Internet erreichbar ist - das ist mir ehrlich gesagt viel zu unsicher :?
Gruß
Hubert
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Hubert,

ich meine VNC kann SSL..

Aber Du kannst natürlich auch Dameware benutzen. Da brauchst Du nur die derzeitige IP vom Zielrechner und der Rest läuft von alleine..
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Manfred hat geschrieben:Aber Du kannst natürlich auch Dameware benutzen.
SSL kostet Geld und ich müsste es immer noch zuerst installieren.

Dameware werde ich mir mal ansehen, aber ich denke nicht, dass ich durch die Firewall komme.
Gruß
Hubert
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Naja, Firewall.

Wenn der Anstreicher kommt, dann nutzt es nichts, wenn er durch den Briefschlitz seine Arbeit machen muß, dann sollt man ihm schon die Türe öffnen und ihn reinlassen. Das erleichtert seine Arbeit ungemein. :lol:

Außer er war früher Gynäkologe
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Antworten