vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
vb@rchiv Offline-Reader - exklusiv auf der vb@rchiv CD Vol.4  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Fortgeschrittene
Allgemeiner Fehler in GDI+ (MeasureString / Windows 10) 
Autor: Bringtnix
Datum: 07.05.16 11:10

Hallo,

beim Drucken aus meiner Anwendung unter Windows 10 kommt es zu folgendem Fehler:

Allgemeiner Fehler in GDI+.
bei System.Drawing.Graphics.MeasureString(String text, Font font, SizeF layoutArea, StringFormat stringFormat, Int32& charactersFitted, Int32& linesFilled)
bei WindowsApplication1.Form1.pdoc_PrintPage(Object sender, PrintPageEventArgs e)

Unter Windows XP und 7 funktioniert das problemlos. Hat jemand eine Idee woran das liegt?

Hier der Code:
Imports System.Drawing.Printing
Public Class Form1
    Friend PrintDocument1 As New PrintDocument
    Friend PrintPreviewDialog1 As New PrintPreviewDialog
 
    Public Sub New()
 
        ' Dieser Aufruf ist für den Designer erforderlich.
        InitializeComponent()
 
        ' Fügen Sie Initialisierungen nach dem InitializeComponent()-Aufruf 
        ' hinzu.
        AddHandler PrintDocument1.PrintPage, AddressOf pdoc_PrintPage
 
    End Sub
    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) _
      Handles MyBase.Load
        SeitenEinrichtungLaden()
    End Sub
    Private Sub SeitenEinrichtungLaden()
 
        PrintDocument1.DefaultPageSettings.PaperSize.Height = CInt(210 / 0.254)
        PrintDocument1.DefaultPageSettings.PaperSize.Width = CInt(297 / 0.254)
 
 
        PrintDocument1.DefaultPageSettings.Margins.Left = CInt(18 / 0.254)
        PrintDocument1.DefaultPageSettings.Margins.Top = CInt(18 / 0.254)
        PrintDocument1.DefaultPageSettings.Margins.Right = CInt(18 / 0.254)
        PrintDocument1.DefaultPageSettings.Margins.Bottom = CInt(18 / 0.254)
        PrintDocument1.DefaultPageSettings.Landscape = True
 
    End Sub
    Private Sub cmdVorschau_Click(sender As System.Object, e As _
      System.EventArgs) Handles cmdVorschau.Click
        PrintPreviewDialog1.Document = PrintDocument1
        PrintPreviewDialog1.WindowState = FormWindowState.Maximized
        PrintPreviewDialog1.ShowDialog()
    End Sub
    Private Sub pdoc_PrintPage(ByVal sender As Object, ByVal e As _
      System.Drawing.Printing.PrintPageEventArgs) 'Handler wird in New erstellt
 
        Try
            Dim intPrintAreaHeight, intPrintAreaWidth, marginLeft, marginTop, _
              intCharsFitted, intLinesFilled As Int32
            With PrintDocument1.DefaultPageSettings
                ' Lokale Variablen initialisieren, die die Begrenzungen des 
                ' Druckbereichrechtecks enthalten.
                intPrintAreaHeight = .PaperSize.Height - .Margins.Top - _
                  .Margins.Bottom
                intPrintAreaWidth = .PaperSize.Width - .Margins.Left - _
                .Margins.Right
 
                ' Lokale Variablen initialisieren, die die Randwerte enthalten, 
                ' die als X- und Y-Koordinaten für die oberen linke Ecke des 
                ' Druckbereichrechtecks verwendet werden.
                marginLeft = .Margins.Left ' X-Koordinate
                marginTop = .Margins.Top ' Y-Koordinate
            End With
            Dim rectPrintingArea As New RectangleF(marginLeft, marginTop, _
              intPrintAreaWidth, intPrintAreaHeight)
 
            Dim fntBody As New Font("Arial", 10, FontStyle.Regular)
            Dim fmt As New StringFormat(StringFormatFlags.LineLimit)
            Dim strDruck As New String(ChrW(65), 40000)
 
            ' "MeasureString" aufrufen, um die Anzahl von Zeichen zu ermitteln, 
            ' die das Druckbereichrechteck aufnehmen kann. 
            e.Graphics.MeasureString(strDruck, fntBody, New SizeF( _
              intPrintAreaWidth, intPrintAreaHeight), fmt, intCharsFitted, _
              intLinesFilled)
 
            MsgBox(intCharsFitted.ToString & " - " & intLinesFilled.ToString)
 
 
            ' Text an die Seite ausgeben.
            e.Graphics.DrawString(strDruck.Substring(0, intCharsFitted), _
              fntBody, Brushes.Black, rectPrintingArea, fmt)
 
 
            e.HasMorePages = False
 
        Catch ex As Exception
            Dim st = New StackTrace(ex, True) : MsgBox(ex.Message & vbCrLf & _
              st.ToString)
        End Try
    End Sub
End Class
Danke schon mal für die Hilfe!


Carsten

------------
Alle Menschen sind klug. Die einen vorher, die anderen nachher. (Voltaire)

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Allgemeiner Fehler in GDI+ (MeasureString / Windows 10) 
Autor: Manfred X
Datum: 07.05.16 14:05

Hallo!

GDI+ ist eine "alte" Bibliothek, die nicht jede x-beliebige
Konstellation von "theoretisch" möglichen Funktions-Parametern
verarbeiten kann.

Schau Dir deshalb mal die Werte an, die Du übergibst.

Die "MeasureString"-Methode soll benutzt werden, um den Raum-Bedarf
für einen tatsächlich zu druckenden Text zu ermitteln, aber nicht
um eine hypothetisch mögliche Zeichenmenge (ohne Umbruch o.ä.)
zu berechnen.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Allgemeiner Fehler in GDI+ (MeasureString / Windows 10) 
Autor: Bringtnix
Datum: 07.05.16 15:25

In der ursprünglichen Anwendung mache ich auch genau das. Um andere Ursachen auszuschließen, habe ich den relevanten Code in ein neues Projekt eingefügt und einfach einen String mit "A" gefüllt.

Was gibt es denn für "moderne" Möglichkeiten zu ermitteln wie viele Zeichen und Zeilen in einem bestimmten Bereich gedruckt werden können?

------------
Alle Menschen sind klug. Die einen vorher, die anderen nachher. (Voltaire)

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Allgemeiner Fehler in GDI+ (MeasureString / Windows 10) 
Autor: Manfred X
Datum: 07.05.16 15:44

Das hat nichts mit "modern" zu tun. Dein Gedanke ist verkehrt.
Es kann nicht "abstrakt" quantitativ ermittelt werden,
wie viele Zeichen in einen Paint-Bereich passen.

Du mußt Dich auf den konkreten Content beziehen, der ausgegeben
werden soll (Daten-Formatierung, Zeilen-Umbrüche, Wort-Trennung,
Font-Eigenarten usw.).

Du kannst den Text zeilenweise aufbereiten und für jede
Zeile sukzewssive ermitteln, wie viel Raum sie benötigt (Size).
Beispiel

Du kannst auch den Text in einzelne Abschnitte/Sätze o.ä. gliedern
und in einer Schleife ermitteln (Measurestring, Abschnitt hinzufügen),
wie viele dieser Text-Teile jeweils auf eine Seite passen, bis die
verfügbare Seiten-Höhe überschritten ist.

Oder Du nutzt MS-Word (Automatisierung) oder eine andere Textbibliothek,
um den Ausdruck durchführen zu lassen.

Bei mir liefert der Code übrigens keinen Fehler.
Hast Du PaperSize auf benutzerdefiniert gestellt?
PrintDocument1.DefaultPageSettings.PaperSize = New PaperSize("Custom", width, _
  height)


Beitrag wurde zuletzt am 07.05.16 um 16:10:14 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Allgemeiner Fehler in GDI+ (MeasureString / Windows 10) 
Autor: Bringtnix
Datum: 07.05.16 18:06

Vielleicht habe ich das etwas ungünstig formuliert
In einer Anwendung wo dieses Problem ursprünglich auftrat (sehr großes Projekt) gibt es einen konkreten Text (Wörter, Zahlen, Leezeichen) mit einer definierten Schriftart, -größe usw.
Ich versuche zu ermitteln wie viele Zeichen dieses Textes auf die erste Seite passen und wie viele Zeilen das sind.

Um auszuschließen, daß das Problem woanders liegt, habe ich ein paar Zeilen des relevanten Codes in ein neues Projekt kopiert.

Das Beispiel (Dein Link "Beispiel") nutzt ja ebenfalls Graphics.MeasureString, also macht quasi das gleiche wie ich.

Deinen Vorschlag bzgl. Papersize habe ich eingefügt.
Damit "richtiger" Text vorhanden ist, ist im String jedes zehnte Zeichen nun ein Leerzeichen.
Leider bleibt der Fehler.

Interessant finde ich, daß das Problem bei Dir unter Windows 10 nicht auftritt.

------------
Alle Menschen sind klug. Die einen vorher, die anderen nachher. (Voltaire)

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Allgemeiner Fehler in GDI+ (MeasureString / Windows 10) 
Autor: Manfred X
Datum: 07.05.16 18:34

Prinzipiell ist das Problem bei GDI+, daß die
in Net verfügbaren Methoden und Einstellungen
nicht bei jedem Device-Kontext auch vollständig
(=alle Parameter-Konstellationen) funktionieren.
Es könnte also auch am Druckertreiber liegen.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Allgemeiner Fehler in GDI+ (MeasureString / Windows 10) 
Autor: Bringtnix
Datum: 29.05.16 16:21

Das Problem ist gelöst.

Die einzige Änderung ist die Zeile:
 Dim strTest As New String(Chr(65), 20000)
die vorher so aussah:
Dim strTest As New String(ChrW(65), 40000)
Vielen Dank an Manfred und alle die sich sonst noch Gedanken dazu gemacht haben!

------------
Alle Menschen sind klug. Die einen vorher, die anderen nachher. (Voltaire)

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel