set printer to OBJECT oP - geht das bei euch ?

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

Moderator: Moderatoren

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

set printer to OBJECT oP - geht das bei euch ?

Beitrag von brandelh »

Hallo,

mit folgendem Testprogramm wollte ich die neuen Möglichkeiten testen:

Code: Alles auswählen

procedure main()
   local oP, x, aP
   oP := XbpPrinter():New()
   oP:create()
   ? oP:devName, "drucken ..."
   ?
   SET PRINTER TO OBJECT oP
   set printer on
   ? oP:devName,"an",oP:devPort
   ? "Dies ist ein Test"
   ? "Ende äöü"
   set printer to
   oP:destroy()
   wait
return
das Ergebnis ist ernüchternd:

? oP:devName,"an",oP:devPort gibt die erwarteten Werte zurück, also geht es vom Prinzip, aber ...

Der Ausdruck auf meinem Netzwerkdrucker (mit eigenem Port # LPT), der PCL und PS kann geht, aber die Umlaute werden geschluckt, obwohl dort PC8 Zeichensatz eingestellt ist ?

Der Ausdruck auf meinem GDI-Drucker an USB001 geht nicht, nach einiger Zeit meldet der Druckertreiber 'LPT1' wäre nicht bereit. Logisch da hängt ja auch nix !

Also werde ich auch weiterhin grundsätzlich über meine HBPrinterX Klasse (XbpPrinter) drucken.

Habt Ihr andere Erfahrungen ?
Gruß
Hubert
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21192
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Hubert,

die 1.90.xx Version habe ich schon seit längerer Zeit in Betrieb und mache es eigentlich so:

oPrinter := xbpPrinter():new():create()

SET PRINTER TO OBJECT oPrinter

SET DEVICE TO PRINTER
SET PRINTER ON

Hier kommt dann mein Text (allerdings aus dem Hybridprogramm!)

SET DEVICE TO SCREEN
SET PRINTER OFF
SET PRINTER TO

Die Umlaute werden alle einwandfrei gedruckt, soweit ich es nachvollziehen kann.

Ich hoffe das war jetzt das, was Du meintest?

Der Drucker druckt über das Netzwerk (einem anderen WinXP Drucker) auf LPT1:
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: 15696
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo Manfred,

ich dachte man könnte mit der Methode einfache Listen sicher auf jeden Drucker drucken, das scheint aber nicht zu funktionieren, wenn ein GDI Drucker dran hängt (Drucker hat selbst keine Druckersprache wie ESC/P, PCL, PS oder IBM Proprinter).

Ist nicht weiter schlimm, ich habe nur noch ein Programm mit der alten Ausdruckart und zur Zeit steht da noch ein 'richtiger' Drucker an LPT1.
Gruß
Hubert
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21192
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Hubert,

das entzieht sich im Moment meiner Kenntnis. Bei mir ist es ein Oki ML 320 Nadeldrucker, der druckt....
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: 15696
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo Manfred,

Nadeldrucker sind alle 'normale' Drucker !
Gruß
Hubert
MaBeLa
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 21
Registriert: Mi, 08. Mär 2006 14:08
Wohnort: bei Berlin

Beitrag von MaBeLa »

Hallo Hubert,

bei mir sieht es ähnlich aus.

Folgender Code:
LOCAL oPrinter
LOCAL oTestprint := "ABCabc1234567891„”
MaBeLa
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 21
Registriert: Mi, 08. Mär 2006 14:08
Wohnort: bei Berlin

Beitrag von MaBeLa »

Nachtrag:

der HP LJ 1020 tut auch unter Windows 2000 Prof. SP4 an USB002 nix, nicht mal zucken.

Gruß MaBeLa
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
Beiträge: 1418
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich
Kontaktdaten:

Beitrag von Rudolf »

Hallo,
ich müsste auch einen Drucker, der bis jetzt direkt aus Clippper über die LPT angesteuert wird, über Windows ansprechen. Der Ausdruck im Grafikmodus ist leider wesentlich langsamer als direkt unter Clipper und DOS.
Ich habe daher das o.a. Beispiel mit der 1.9er probiert, funktionert aber leider nicht bei mir. Bekomme immer einen Fehler beim qOut :
Access to method not allowed in this context

Grüsse
Rudolf
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15696
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo Rudolf,

wie sieht dein Quellcode aus ?
Ist er lokal am LPT1 ?
Ging es unter 1.82 ?
Welcher Drucker ist es ?

Die einfachste Form ist:

Code: Alles auswählen

set printer to lpt1
set printer on 
? "Ausdruck"
set printer to
geht das ?
Gruß
Hubert
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
Beiträge: 1418
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich
Kontaktdaten:

Beitrag von Rudolf »

Hallo Hubert,
anbei mein Code, geht unter beiden Versionen nicht.
Wenn ich nur mit "set printer to" arbeite, habe ich leider keine Kontrolle, ob der Drucker auch aktiv ist. Die Funktionen printready() etc. funktionieren nicht, da diese über den Spooler arbeiten.
Grüsse
Rudolf


function printtest()
******************************************************************
LOCAL oPrinter
LOCAL oTestprint := "ABCabc1234567891„”
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15696
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Rudolf hat geschrieben: Wenn ich nur mit "set printer to" arbeite, habe ich leider keine Kontrolle, ob der Drucker auch aktiv ist.
Wenn ich recht verstehe, würde dieser Ausdruck aber gehen ?
An LPT1 auf dem Standarddrucker ?
Rudolf hat geschrieben:Hallo Hubert,
oPrinter := xbpPrinter():new():create()
...
set device to printer
...
? oTESTPRINT
? CHR(12)
set printer off
set printer to
set device to screen
Nur zur Vollständigkeit, wenn man mit ? oTestprint arbeitet, ist es nicht nötig den device auf printer umzustellen, lösche bitte die beiden
set device to ... Befehle, teste erneut und gib uns dann die XppError.log hier im Quellcode bekannt (inkl. der aktuellen PRG Datei).

PS: Ist der Drucker auch wirklich unter Windows als Standarddrucker eingetragen ? Was ist das für ein Druckermodell ?
Gruß
Hubert
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2935
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 13 Mal
Danksagung erhalten: 34 Mal
Kontaktdaten:

Beitrag von Wolfgang Ciriack »

Hallo Rudolf,
setze doch noch ein set console off ein.
Viele Grüße
Wolfgang
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15696
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Wolfgang Ciriack hat geschrieben:Hallo Rudolf,
setze doch noch ein set console off ein.
Ahh, das hatte ich vergessen, wenn es kein XbpCrt sondern ein XbpDialog ist, muss die console abgeschaltet werden
Gruß
Hubert
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
Beiträge: 1418
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich
Kontaktdaten:

Beitrag von Rudolf »

Hallo an alle,
danke für den Hinweis, jetzt funkt's
Grüsse
Rudolf
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15696
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

brandelh hat geschrieben:Ahh, das hatte ich vergessen, wenn es kein XbpCrt sondern ein XbpDialog ist, muss die console abgeschaltet werden
ich muss mich verbessern, immer wenn eine Anwendung mit GUI=YES gelinkt wird, muss die console abgeschaltet werden
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15696
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Rudolf hat geschrieben:Wenn ich nur mit "set printer to" arbeite, habe ich leider keine Kontrolle, ob der Drucker auch aktiv ist.
also ich meine, dass auch ein XbpPrinter-Objekt nur erkennen kann, ob der Drucker aktiviert oder deaktiviert wurde, bzw. ein Objekt erstellt werden kann. Der Druckspooler gibt erstmal ok, Druckerstörungen werden vom Druckertreiber abgearbeitet. Die ? Ausgaben gehen doch aber dennoch direkt an die Schnittstelle, oder sollte ich mich da irren ?
Gruß
Hubert
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
Beiträge: 1418
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich
Kontaktdaten:

Beitrag von Rudolf »

sorry, ich war noch bei der alten 1.8er Version, da ging das mit dem Objekt zuweisen noch nicht. Ich muss erst ausprobieren was bei der 1.9er passiert wenn der Drucker nicht erreichbar ist oder mitten drunter abschmiert.
Grüsse
Rudolf
MaBeLa
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 21
Registriert: Mi, 08. Mär 2006 14:08
Wohnort: bei Berlin

Beitrag von MaBeLa »

Hallo!

Alle Druckbefehle die über XbpPrintDialog laufen, werden von Windows über die Druckerverwaltung gezogen, incl. Fehlermeldungen etc., gehen nicht wie bei SET PRINTER TO LPT1 direkt an die Schnittstelle.

Gruß MaBeLa
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
Beiträge: 1418
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich
Kontaktdaten:

Beitrag von Rudolf »

Hallo,
das Problem ist bei mir nur die Geschwindigkeit. Mein Kunde druckt sehr viele Formular auf Matrixdruckern mit Durchschlag aus, im Direktdruck ist die Geschwindigkeit wesentlich schneller als grafisch über Windows. Nun suche ich eine Möglichkeit das Ganze trotzdem in den Griff zu bekommen.
Grüsse
Rudolf
MaBeLa
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 21
Registriert: Mi, 08. Mär 2006 14:08
Wohnort: bei Berlin

Beitrag von MaBeLa »

Hallo Rudolf,

wir drucken auch viel mit Durchschlag auf Nadeldruckern, haben deshalb "ganz" schnelle von EPSON, aber der "DOS - CLIPPER - DIREKT" -Vorteil ist unter Windows nicht ohne weiteres zu toppen. Deshalb haben wir auch noch einige Clipper-Anwendungen am Laufen oder Direktdruck an LPT in xBase. Vorteil ist: der Anwender kann nicht an den Drucker einstellungen rumfummeln wie in Windows.
Solange man Drucker an LPT hat sind das gute Argumente.

Eine weitere Möglichkeit ist der Druck in eine Datei (SET PRINTER TO 123.TXT) unter Windows. "gedruckt" wird mit "DOS - CLIPPER - Zeichensatz" in eine Datei, die man dann über Windows ausdruckt.

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

Beitrag von brandelh »

Hallo,

genau deshalb hatte ich auch noch solche alten Druckroutinen drinn.
Obwohl der Anwender seit einiger Zeit auf Laser umgestellt hat, drucken die immer noch wunderbar (es ist ein PCL4 Laser an LPT1).

Ich habe bei dieser Ausgabe einen Abfrage vor dem Ausdruck, die auf einen Tastendruck wartet:

Code: Alles auswählen

1. Drucken ? ESC=Abbruch, sonst Drucker bereit machen ...
2. set printer to lpt1
    set printer on
    set console off   // wichtig bei GUI=YES
    ? 'Druckausgaben'

hier kann eine Abfrage auf ESC nicht schaden
und bei GUI Programmen auch ein Aufruf der 
Ereignisschleife

    set printer to
3. Erfolgsmeldung ...
Mal ehrlich, ist der Anwender so doof, dass er auf fehlendes Papier vom Programm hingewiesen werden muß ? Das sagt auch der Drucker.
Und wenn es beim ersten mal schief geht, kann er ja nochmal drucken.
Eventuell kannst du ja auch optional eine Start und Zielseite angeben lassen und alle anderen Seiten überspringen.
Gruß
Hubert
MaBeLa
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 21
Registriert: Mi, 08. Mär 2006 14:08
Wohnort: bei Berlin

Beitrag von MaBeLa »

Hallo Hubert,

ganz meine Meinung. Und ich kenne keinen Anwender, der, wenn's läuft !,
meint es müsste "Windows-Like" sein.
Aber insgeheim hatte ich schon gehofft, dass man bei Set Printer to anstatt LPTX einfach USBX setzen könnte ab 1.9.
Man kann nicht alles haben.

Schönen Abend noch

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

Beitrag von brandelh »

Hallo MaBeLa,
MaBeLa hat geschrieben:meint es müsste "Windows-Like" sein.
diese speziellen Druckausgaben sind z.B. Lagerlisten zur Kontrolle bzw. Erfassung der Inventur, da kommt es nicht drauf an.

Für die Ablösung der Rechnungsformulare habe ich dann voll in die Xbase++ Gra-Funktionen gegriffen (damals war HBPrinter noch nicht auf Xbase portiert). Dort drucke ich Linien, Kästchen, Schriften von 6 bis 14 Punkt und alles was das Herz begehrte. Nur der Briefkopf rechts oben kommt noch von der Druckerei, da dieser in Farbe und gedruckt einfach besser wirkt als in schwarz/weiß, aber mit nem Farblaser könnte man das auch noch machen. :D

Hauptvorteil für den Anwender des Programmes: Nur noch einen Briefbogen auf normalem DinA4 Papier für alle Rechnungen, egal welcher Art. Keine Neuauflagen nur wegen Änderungen der eigenen Daten.

Hauptvorteil für mich: Endlich keine Fusselei mehr mit 1/2 und 1/4 Vorschüben um endlich in die Kästchen zu treffen. Die alten 3 lagigen Durchschlagformulare waren bei jeder Lieferung um einige mm verschoben. Das Drucken ist hierbei auf die Xbase++ Art wirklich leichter. :D
Gruß
Hubert
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21192
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hallo,

ich bin jetzt etwas verwirrt. Wenn ich über einen anderen PC drucke, dann habe ich das Problem, wenn ich mehrmals hintereinander drucke, dass eine Fehlermeldung kommt.

Hier mal die "Druckroutine"

Code: Alles auswählen

          SET PRINTER TO OBJECT M->oPrinter
********************************************************************************
METHOD drucker:druckbelegKopie()
       LOCAL nBytes  := 1
       LOCAL nI      := 0
       LOCAL cText   := ""
       LOCAL cReturn := ""

       ::nHandle := FOPEN(::cDateiName)
       SET DEVICE TO PRINTER
       SET PRINTER ON
       DO WHILE .T.
          IF cReturn <> CHR(13)
             cReturn := FREADSTR(::nHandle,nBytes)
             IF ASC(cReturn) = 0
                EXIT
             ENDIF
             cText += cReturn
          ELSE
             ? cText    ----> für diese Stelle komt die Meldung: siehe unten
             cText   := ""
             cReturn := ""
          ENDIF
       ENDDO
       FOR nI = 1 TO 10                                                         // Für den Zeilenvorschub zur Abrißkante (sollte als Parameter einstellbar sein)
           ?
       NEXT
       SET DEVICE TO SCREEN
       SET PRINTER OFF
       SET PRINTER TO
       FCLOSE(::nHandle)
RETURN (.T.)
********************************************************************************
BetriebssystemFehler : 2
Das System kann die angegebene Datei nicht finden.

In dem Fall war der Drucker aus. Beim 1. Druck klappte alles. Beim 2. direkt danach kam die Meldung.

Weiterhin kam aber auch die Meldung Gerät ist nicht angeschlossen. Und das obwohl es an war.

Wird das Programm neu gestartet, kann man wieder 1x drucken und beim 2. Mal kommt der Fehler.

PS: Sorry Hubert, ich habe die Enleitung vergessen.
Zuletzt geändert von Manfred am Di, 23. Mai 2006 17:56, insgesamt 1-mal geändert.
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: 15696
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo Manfred,

du hast kein set printer to xxxx also druckt er auf LPT1, wieso dann auf einem anderen PC ?

Warum liest du die Datei ZEICHEN für Zeichen ?
Auch wenn das hier kein Problem sein sollte.

Wenn ich es richtig verstehe, ist der Drucker an LPT1 aus, du druckst aber dennoch (dein Programm gibt Text aus) und dann kommt die Fehlermeldung (es scheint bei der 2. Kopie).
Kann es nicht sein, dass dann gerade zufällig der timeout auf LPT1 aktiv ist und den Fehler anzeigt ?
Gruß
Hubert
Antworten