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
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,

bin mal wieder doof. Ich habe die Einleitung vergessen.

Aber anfänglich habe ich schon geschrieben, wie ich es löse. Ich habe ein Druckobjekt erzeugt und dort schicke ich es hin.

Warum ich die Zeichen einzeln drucke?

Nun, ich speicher die Vorgänge in eine Textdatei. So habe ich den Vorteil etliche Druckversionen zu mischen, ohne jedesmal wissen zu müssen, was ich drucke.
Dann drucke ich es so aus, weil..... nun wie immer, mir ist nichts besseres eingefallen. Ich weiß ja vorher nie, wie groß die Datei ist und irgendwie habe ich dann keine Idee gehabt, wie ich das lösen soll, das ich voher weiß, wieviel Buffer ich zur Verfügung stellen muß. Und dann bin ich ganz ehrlich lief der Druck (auf einem Rechner mit Drucker) und da habe ich erstmal nicht weiter nachgedacht.

Asche auf mein Haupt.

Die Texte sind aber auch nicht groß. Es sind meistens DIN-A 4 Blätter halbiert.
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,

ich wollte dein Programm nicht schlecht reden :wink:

Wenn es übers Netz bei eingeschaltetem Drucker geht und beim Ausgeschalteten irgendwann eine Fehlermeldung kommt, liegt es an einem Timeout - sprich der Sender ist schneller als der Empfänger, die Puffer speichern etwas zwischen, bis dann das Betriebssystem zurückmeldet, die Datei sei nicht verfübar. Offene Dateihandles und offene druckerschnittstellen sind für das BS das gleiche.

Offensichtlich kann das Xbase++ Programm nicht schnell genug erkennen, dass der Drucker nicht geht, das war schon immer so mit den set printer to befehlen unter einem Multitasking Betriebssystem.

Nur unter DOS konnte er direkt die Leitung abfragen, darum funktionierte damals ja auch die Tools Funktion.

Ich lass mich gerne widerlegen, aber ich denke so ist es.
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 glaube ich habe die ganze Zeit fehlgedacht. Ich dachte Windows hat einen Spooler, in den die Daten geschickt werden. Da ist es doch egal, ob ein Drucker dran, an oder sonstwas ist? Die Meldung von Windows selbst sollte eigentlich nur kommen.
Wenn ein lokaler Drucker benutzt wird, dann gibt es doch auch keine Probleme. Dort kann ich drucken, bis mir die Petersilie aus den Ohren wächst. Ist kein Drucker dran, oder an, gibt es trotzdem keine fehlermeldung vom Programm, sondern maximal nur eine Meldung von Windows.
ich wollte dein Programm nicht schlecht reden
Das hatte ich auch nicht so aufgefasst. Kritik ist immer willkommen, ich bin nicht perfekt. Dazu habe ich hier schon viel zu viel gute Tipps erhalten
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 »

Ich dachte Windows hat einen Spooler, in den die Daten geschickt werden. Da ist es doch egal, ob ein Drucker dran, an oder sonstwas ist?
Hallo Manfred,

wenn du direkt auf LPT1 druckst, geht das nicht über den Windowsspooler. Eventuell puffern einige Treiber noch etwas dazwischen, aber es geht nicht über die Spooler.

Versuche eines:

Ein Drucker an LPT1: anschalten und im Spooler auf 'angehalten' setzen.
set printer to lpt1 ... druckt dennoch.
Schalte ihn ab und nach einer gewissen Zeit meldet Windows vom System einen Fehler, der NICHT vom Spooler kommt.

Wenn du einen freigegebnen Netzwerkdrucker ansprichst, müsste der immer gepuffert werden, aber was passiert wenn er aus ist und du mit
set printer to \\server\drucker druckst, weiß ich jetzt auch nicht.

NUR XbpPrinter kann den Druckspooler ansprechen und darauf reagieren ... ein Anhalten endet in einer Liste mit Druckaufträgen, welche jeweils eine Warnung zurückgeben. Da das Verhalten aber auch nicht immer sinnvoll ist, habe ich in meiner Druckerklasse HBPrinterX diesen Zustand z.B. als Fehler gewertet.

ABER in allen mir bekannten Programmiersprachen wird heute empfohlen erst drucken (oder kopieren) und erst wenn es schief geht den Fehler behandeln.
Sprich eine lokale Fehlerbehandlung installieren (Auszug aus Hilfe - abgewandelt:

Code: Alles auswählen

bSaveError := ErrorBlock( {|e| Break(e)} )  // Standardfehlerverhalten sichern, jetzt nur noch Break
set printer to lpt1   // hier druckausgabe öffnen, damit Zustand eindeutig ist.
...
BEGIN SEQUENCE 
    ...
    ? Druckausgaben         
    ...

RECOVER USING oError 
    ErrorBlock( bSaveError )   // schon hier zurück auf normale Fehlerbehandlung
    ... Fehlermeldung je nach Wahl ...
    IF oError:osCode == 2       // Fehler: Datei existiert 
        ...
    endif
END SEQUENCE 
set printer to  
ErrorBlock( bSaveError ) 
So erhält der Anwender wenigstens eine Fehlermeldung von Xbase++.
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 »

Manfred hat geschrieben:Hi Hubert,Aber anfänglich habe ich schon geschrieben, wie ich es löse. Ich habe ein Druckobjekt erzeugt und dort schicke ich es hin.
Hallo Manfred,

also laut meinen Test und was ich so höre nutz der Befehl

set printer to OBJECT oP

das Drucker Object oP hier nur zur Ermittlung von einigen Einstellungen (Portname etc.) aber es wird weder nach Windowsart gedruckt (sonst gingen auch GDI Drucker) noch der Druckspooler angesprochen.
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 »

Moin Hubert,

ich hatte früher auch immer eine Fehlerroutine eingebaut unter DOS, war aber wie oben schon erwähnt bei Windows der Meinung, dass es eben dann einfach in den internen Spooler geht. Also baue ich das wieder ein.

Tj, man lernt nie aus.
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 »

Tj, man lernt nie aus.
Hoffentlich :wink:
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 »

Jajaja,

wo soll das nur hinführen.

Ich habe den Fehler gefunden. Ich habe aus Pennerei den Printer ganz am Anfang des Programmes dem Printerobjekt zugewiesen. Klar, nach dem gedruckt wird, folgt ein Set Printer TO. Das war es dann. Danach jibbet keinen Printer mehr in dem Object.

Naja, wer keine Arbeit hat, der macht sich welche.
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 »

Tja unter DOS war sowas leichter :wink:
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 »

Das blöde an der Sache ist immer folgendes:

Routine läuft.

Im Kopf abgehakt.

Der Rechner an dem man testet hat nicht immer die Konfig, wie der Liverechner. Da klappt es. Also wird kein Gedanke mehr verschwendet.

Dann passieren so blöde Fehler.
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 »

Hi,

darum verwende ich für solche Sachen (Drucken, Suchen, Lookuptabellen etc.) gerne Funktionen. Darin werden:

1. alle Umgebungsvariablen sichern
2. Drucker oder Datei öffnen bzw. einstellen
3. BEGIN SEQUENCE
4. Aktion
5. Recover
6. Recover-Action
7. END SEQUENCE
8. Alles zurücksetzten ...

UND alles mit lokalen Variablen.

Natürlich kann man nicht gleichzeitig aus 2 Funktionen auf einen LPT drucken, aber alles andere geht gleichzeitig ohne Nebenwirkungen.
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,

wieder etwas dazugelernt.

verkürzt sieht es so aus:

oPrinter:create((oWsPara:nArea)->stddrucker)

Die Sache hat nur einen Haken, ich schreibe den Drucker in eine Datei, in ein Feld, welches eine grössere Breite hat, als die Bezeichnung des Druckers. Was zur Folge hat, das der Standarddrucker genommen wird und nicht der, der gewählt wurde.

So ist es richtig:

oPrinter:create(TRIM(oWsPara:nArea)->stddrucker))

Watt´n Mist, Fehler gesucht bis zum Blödwerden.
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