Fehler nach NewPrinterPage()

Für allgemeine Fragen zur Programmierung mit PureBasic.
Dieter
Beiträge: 22
Registriert: 14.08.2014 14:32
Computerausstattung: MacMini (2018 (2020), I7 3.2GHz, 32GB), OSX 10.15.5, PB 5.61 x64 - VmWare-Fusion: Win10 Home Premium, XP Professional
History: ZX81 - ZX Spectrum - Apple II - Atari ST - PC (MS-DOS 3.2 ... WIN 10) - Linux/UNIX - Mac

Fehler nach NewPrinterPage()

Beitrag von Dieter »

Hallo zusammen!

Ich habe mit PB 5.31 64Bit unter Mac OSX 10.10 ein anscheinend alt bekanntes Problem:

Beim Druck der ersten Seite ist alles perfekt. Aber nachdem ich einen NewPrinterPage()
ausgeführt habe, wird bei jedem DrawText() nur der Anfangsbuchstabe gedruckt. Auf
allen Folgeseiten!

Hier in diesem Forum wurde der Fehler 2006 schon mal erwähnt, leider ohne Lösung.
Jemand meinte dass der Fehler nur auftritt, wenn Unicode eingeschalten ist. Unicode
kann ich aber nicht aussschalten, da ich Verzeichnisse meine Festplatte scanne usw.
und wenn in Datei- oder Verzeichnisnamen Umlaute usw. vorkommen, muss ich Unicode
verwenden.

Hat hierfür inzwischen jemand einen Lösung?
MacMini (2020, I7 3.2GHz, 32GB), OSX 10.15.x, PB 5.72 LTS x64 - VmWare-Fusion: Win7 Home Premium, XP Professional, Ubuntu 14.04 - ZX81 - Apple II - Atari ST
Benutzeravatar
Vera
Beiträge: 928
Registriert: 18.03.2009 14:47
Computerausstattung: Win XP SP2, Suse 11.1
Wohnort: Essen

Re: Fehler nach NewPrinterPage()

Beitrag von Vera »

Hallo Dieter,

nur ein kleiner Tip: im englischen Forum gibt es eine Seite mit gesammelten Lösungen speziell zu MAC, und auch (weiter unten auf der Seite) eine Sammlung von Crossplattform-Lösungen.
Da könntest Du vielleicht gelegentlich fündig werden: Carbon API list for Mac

Gruß ~ Vera
°
<°)))o><
~~~~~~~~~
echo "Don't worry"
echo "Keep quiet"
@echo off
format forum:\
Dieter
Beiträge: 22
Registriert: 14.08.2014 14:32
Computerausstattung: MacMini (2018 (2020), I7 3.2GHz, 32GB), OSX 10.15.5, PB 5.61 x64 - VmWare-Fusion: Win10 Home Premium, XP Professional
History: ZX81 - ZX Spectrum - Apple II - Atari ST - PC (MS-DOS 3.2 ... WIN 10) - Linux/UNIX - Mac

Re: Fehler nach NewPrinterPage()

Beitrag von Dieter »

Hallo Vera,

vielen Dank für die Info. Habe schon mal drüber geschaut, allerdings noch nichts gefunden.

Parallel dazu habe ich mal Unicode im Compiler ausgeschalten und siehe da, auch auf der zweiten
Seite wird alles gedruckt. ABER die Umlaute kann ich dann vergessen. Ist also doch keine Lösung.
Leider macht die 32Bit-Version da keinen Unterschied, habe ich eben probiert.
Also dann muss ich halt weitersuchen ...

Gruß
Dieter
MacMini (2020, I7 3.2GHz, 32GB), OSX 10.15.x, PB 5.72 LTS x64 - VmWare-Fusion: Win7 Home Premium, XP Professional, Ubuntu 14.04 - ZX81 - Apple II - Atari ST
Benutzeravatar
Vera
Beiträge: 928
Registriert: 18.03.2009 14:47
Computerausstattung: Win XP SP2, Suse 11.1
Wohnort: Essen

Re: Fehler nach NewPrinterPage()

Beitrag von Vera »

Dieter hat geschrieben:vielen Dank für die Info. Habe schon mal drüber geschaut, allerdings noch nichts gefunden.
gern geschehen ... es kommen bestimmt noch Gelegenheiten ;-)

Wenn es zunächst nur um den Ausdruck geht, dann könnte folgendes ja zunächst ausreichen, im normal-Modus die String-Pfade von UTF-8 (lesen) nach ASCII (schreiben) zu wandeln.
Probier doch mal, ob diese Procedure bei Dir läuft:

Code: Alles auswählen

Procedure.s UTF8ToAscii(UTF8.s)          ;converts UTF8 to Ascii. Output as String
  Protected *mem     = AllocateMemory(StringByteLength(UTF8, #PB_UTF8) + 1)
  Protected *len     = PokeS(*mem, UTF8, -1,  #PB_Ascii)
  Protected.s SAscii = PeekS(*mem, -1, #PB_UTF8)
  FreeMemory(*mem)
  ProcedureReturn SAscii
EndProcedure


; hier direkten Pfad angeben oder unterhalb den PathRequester nehmen

Verzeichnis$ = "/home/your/target/folder/"


If OpenWindow(0, 0, 0, 316, 216, "StringGadget Flags", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  EditorGadget(0, 8,  8, 300, 200)

  ; Verzeichnis$=PathRequester("Verzeichnis Wählen:",Verzeichnis$)

  If Verzeichnis$ <> ""
    If ExamineDirectory(0, Verzeichnis$, "*.*")
      While NextDirectoryEntry(0)
        If DirectoryEntryType(0) = #PB_DirectoryEntry_File


          CompilerIf #PB_Compiler_Unicode
          AddGadgetItem(0, -1, DirectoryEntryName(0))
          Debug DirectoryEntryName(0)
          
          CompilerElse
          string.s = DirectoryEntryName(0)   ; path string is UTF8
          string   = UTF8ToAscii(string.s)
          
          AddGadgetItem(0, -1, string )
          Debug string
          CompilerEndIf


        EndIf
      Wend
      FinishDirectory(0)
    EndIf
  EndIf


  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
(CompilerIf hab ich rein gemacht, damit man einfacher über Kreuz testen könnte)

Ein Auslesen und Schreiben von Dateien, sollte ähnlich funktionieren können.

Gruß ~ Vera
°
<°)))o><
~~~~~~~~~
echo "Don't worry"
echo "Keep quiet"
@echo off
format forum:\
Benutzeravatar
Shardik
Beiträge: 752
Registriert: 25.01.2005 12:19

Re: Fehler nach NewPrinterPage()

Beitrag von Shardik »

Dieter hat geschrieben:Beim Druck der ersten Seite ist alles perfekt. Aber nachdem ich einen NewPrinterPage()
ausgeführt habe, wird bei jedem DrawText() nur der Anfangsbuchstabe gedruckt. Auf
allen Folgeseiten!
Der Text in der DrawText()-Funktion muß im Unicode-Modus ins ASCII-Format umgewandelt werden, damit der Ausdruck der ersten und zweiten Seite sowohl im ASCII- als auch im Unicode-Modus funktioniert und Umlaute korrekt ausgedruckt werden. Dies ist anscheinend ein Fehler in der NewPrinterPage()-Funktion von PureBasic, weil dieses Problem in der Tat erst bei der zweiten Seite auftritt!

Ich habe daher das Beispiel aus der Hilfe zu NewPrinterPage() einmal entsprechend abgewandelt und unter MacOS X 10.6.8 (Snow Leopard) mit PB 5.31 x86 und x64 und im ASCII- und Unicode-Modus erfolgreich getestet:

Code: Alles auswählen

Define ASCIIText.S
Define Text.S

LoadFont(0, "Arial", 80)

If PrintRequester()
  If StartPrinting("Zwei Blätter")
    If StartDrawing(PrinterOutput())
      DrawingMode(#PB_2DDrawing_Transparent)
      DrawingFont(FontID(0))

      DrawText(100, 100, "Seite 1 mit ÄÖÜäöüß")

      ; Dem Drucker sagen, dass eine neue Seite begonnen wird
      NewPrinterPage()

      Text = "Seite 2 mit ÄÖÜäöüß"

      CompilerIf #PB_Compiler_Unicode
        ASCIIText = Space(StringByteLength(Text, #PB_Ascii) / 2)
        PokeS(@ASCIIText, Text, -1, #PB_Ascii)
      CompilerElse
        ASCIIText = Text
      CompilerEndIf  
    
      DrawingFont(FontID(0))
      DrawText(100, 100, ASCIIText, RGB(0, 0, 0))
      
      StopDrawing()
    EndIf
    
    StopPrinting()
  EndIf
EndIf
Update 1: #PB_Unicode in #PB_Compiler_Unicode abgeändert. Danke Sicro für den Hinweis auf den Fehler!
Update 2: Länge des durch Space() angelegten ASCII-Strings im Unicode-Modus durch 2 dividiert, um nicht unnötigerweise die doppelte Menge an Speicherplatz zu allokieren. Danke Sicro für Deine genaue Analyse und Dein anschauliches Beispielprogramm!
Zuletzt geändert von Shardik am 16.11.2014 19:50, insgesamt 2-mal geändert.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Fehler nach NewPrinterPage()

Beitrag von ts-soft »

@Shardik

Ist aber sehr gefährlich, was Du da machst :wink:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Sicro
Beiträge: 969
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: Fehler nach NewPrinterPage()

Beitrag von Sicro »

Shardik hat geschrieben:

Code: Alles auswählen

CompilerIf #PB_Unicode
        ASCIIText = Space(StringByteLength(Text, #PB_Ascii))
#PB_Compiler_Unicode muss hier stehen.

Eigentlich nicht tragisch, aber Space() erzeugt hier doppelten Buffer, weil das Leerzeichen im Unicode zwei Bytes benötigt. Siehe folgenden Code:

Code: Alles auswählen

Text.s = Space(1)
Debug StringByteLength(Text, #PB_Ascii)   ; Ausgabe: 1
Debug StringByteLength(Text, #PB_Unicode) ; Ausgabe: 2
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Fehler nach NewPrinterPage()

Beitrag von ts-soft »

ASCIIText.s mit ASCII Text vom StringManager im Unicode-Modus verwalten lassen, halte ich
auf jeden Falle für sehr leichtsinnig. Sofortiger Aufruf von DrawText, ohne weitere Stringfunktion,
läßt dies zwar Funktionieren, aber ... :lol:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Dieter
Beiträge: 22
Registriert: 14.08.2014 14:32
Computerausstattung: MacMini (2018 (2020), I7 3.2GHz, 32GB), OSX 10.15.5, PB 5.61 x64 - VmWare-Fusion: Win10 Home Premium, XP Professional
History: ZX81 - ZX Spectrum - Apple II - Atari ST - PC (MS-DOS 3.2 ... WIN 10) - Linux/UNIX - Mac

Re: Fehler nach NewPrinterPage()

Beitrag von Dieter »

Ich bekomme die Umlaute in Datei- und Verzeichnisnamen nur wenn ich den Compiler auf Unicode stelle. Eine Konvertierung
nach ASCII kommt da anscheinend immer zu spät und ich erhalte statt der Umlaute nur Fragezeichen.

So wie es aussieht erwartet TextDraw() trotz Unicode-Einstellung ab der zweiten Seite einen ASCII-codierten String und bricht
beim ersten 0-Byte des druckenden Strings ab.

Nachdem ich alle Vorschläge ausprobiert habe und auch die eine oder andere Modifikation am Code nicht den erhofften Erfolg
gebracht hat, kam mir eine ganz andere Idee :roll:

Ich habe einfach:

Code: Alles auswählen

NewPrinterPage()
durch

Code: Alles auswählen

NewPrinterPage()
StopDrawing()
StartDrawing(PrinterOutput())
ersetzt.

Ist vielleicht nicht ganz im Sinne des Erfinders, aber es funktioniert! Und die Seiten bleiben auch zusammen in einem Druckauftrag
bzw. PDF-Datei.

Gruß
Dieter
MacMini (2020, I7 3.2GHz, 32GB), OSX 10.15.x, PB 5.72 LTS x64 - VmWare-Fusion: Win7 Home Premium, XP Professional, Ubuntu 14.04 - ZX81 - Apple II - Atari ST
Benutzeravatar
Shardik
Beiträge: 752
Registriert: 25.01.2005 12:19

Re: Fehler nach NewPrinterPage()

Beitrag von Shardik »

Sicro hat geschrieben:#PB_Compiler_Unicode muss hier stehen.

Eigentlich nicht tragisch, aber Space() erzeugt hier doppelten Buffer, weil das Leerzeichen im Unicode zwei Bytes benötigt.
Danke Sicro, Du hast natürlich recht. Leider ist mir dies peinlicherweise nicht zum ersten Mal passiert, ich bin sozusagen ein "Wiederholungstäter"... :lol: Ich habe meinen Beispiel-Code entsprechend abgeändert.
ts-soft hat geschrieben:ASCIIText.s mit ASCII Text vom StringManager im Unicode-Modus verwalten lassen, halte ich auf jeden Falle für sehr leichtsinnig. Sofortiger Aufruf von DrawText, ohne weitere Stringfunktion, läßt dies zwar Funktionieren, aber ... :lol:
Thomas, leider scheint bei mir jemand auf der Leitung zu stehen, aber ich verstehe leider nicht, was daran auszusetzen ist. Ich wäre Dir dankbar, wenn Du mir dies erklären könntest, da ich diese und ähnliche Lösungen (auch in vielen Workarounds im englischen Forum) schon oft verwendet habe und mich bisher nie jemand auf ein Problem damit aufmerksam gemacht hat. Wenn ich die Problematik verstehe, werde ich gerne meine alten und zukünftigen Workarounds entsprechend anpassen...
Dieter hat geschrieben:Ich bekomme die Umlaute in Datei- und Verzeichnisnamen nur wenn ich den Compiler auf Unicode stelle. Eine Konvertierung nach ASCII kommt da anscheinend immer zu spät und ich erhalte statt der Umlaute nur Fragezeichen.
Dies ist ja ein Problem, das mit anderen PureBasic-Funktionen auftritt. Wenn Du ein kleines Code-Beispiel zeigen könntest, dann könnte ich Dir wahrscheinlich auch weiterhelfen...
Dieter hat geschrieben:So wie es aussieht erwartet TextDraw() trotz Unicode-Einstellung ab der zweiten Seite einen ASCII-codierten String und bricht beim ersten 0-Byte des druckenden Strings ab.

Nachdem ich alle Vorschläge ausprobiert habe und auch die eine oder andere Modifikation am Code nicht den erhofften Erfolg gebracht hat, kam mir eine ganz andere Idee :roll:
Hattest Du auch mein Code-Beispiel ausprobiert? Wie angemerkt, hatte ich es unter MacOS X 10.6.8 (Snow Leopard) x86 und x64 im ASCII- und Unicode-Modus getestet. Leider kann ich es derzeit noch nicht unter dem neuen MacOS X 10.10 (Yosemite) testen, da ich dieses noch nicht heruntergeladen habe. Mein Beispiel sollte trotz des kleinen Fehlers mit #PB_Unicode statt #PB_Compiler_Unicode auch unter Yosemite korrekt funktioniert haben...
Dieter hat geschrieben:Ich habe einfach:

Code: Alles auswählen

NewPrinterPage()
durch

Code: Alles auswählen

NewPrinterPage()
StopDrawing()
StartDrawing(PrinterOutput())
ersetzt.

Ist vielleicht nicht ganz im Sinne des Erfinders, aber es funktioniert! Und die Seiten bleiben auch zusammen in einem Druckauftrag
bzw. PDF-Datei.
Danke für die von Dir gefundene Lösung, die natürlich auch eine Möglichkeit darstellt. Trotzdem sollte natürlich der offensichtliche Fehler in PureBasic behoben werden. Wenn keiner diesen Fehler im englischen Forum meldet, werde ich dies erledigen.
Antworten