vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
sevDataGrid - Gönnen Sie Ihrem SQL-Kommando diesen krönenden Abschluß!  
 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 - Ein- und Umsteiger
Problem / Druck auf nächster Seite (n) fortsetzen 
Autor: Dirk01
Datum: 28.10.13 16:25

Hallo zusammen!

Ich bin dabei mir ein kleines Tool zu schreiben, mit dem ich Dateien aus einem Verzeichnis
auslese, Bildchen und weitere Informationen drucke.

Das funktioniert auch schon soweit ganz gut, bis auf das, dass ich es nicht hinbekomme, das
wenn eine bestimmte Anzahl von Bildchen erreicht wird der Druck auf der nächsten bzw. den nächsten Seiten fortgeführt wird.

Wie bekomm ich das mit dem Seitenumbruch hin?

Private Sub PrintDocument1_PrintPage(ByVal sender As Object, ByVal e As _
  System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
 
Dim acXPos As VariantType = 10
Dim acYPos As VariantType = 5
 
PrintDocument1.PrinterSettings.PrinterName = P5_CB_Druckerauswahl.Text
Dim MyFont14 As New System.Drawing.Font("Arial", 14, Drawing.FontStyle.Bold)
Dim MyFont12 As New System.Drawing.Font("Arial", 12, Drawing.FontStyle.Regular)
Dim MyFont10 As New System.Drawing.Font("Arial", 10, Drawing.FontStyle.Regular)
 
Dim MyDir As New System.IO.DirectoryInfo(DWGFile)
Dim MyFiles As System.IO.FileInfo() = MyDir.GetFiles("*.dwg")
Dim MyFile As System.IO.FileInfo
 
Dim gr As Graphics = e.Graphics
gr.PageUnit = GraphicsUnit.Millimeter
 
'...
'...
Dim i As Integer
 
Do While ParentFileName <> ""
    BasicFileName = ParentFileName.Remove(ParentFileName.Length - 6, 6)
    Dim BildName As String
    BildName = BasicFileName & "_D.wmf"
 
    Dim BlockBild As Bitmap = New Bitmap(ImportPfad & BildName)
    gr.DrawImage(BlockBild, acXPos, acYPos + 30)
 
    i = i + (BlockBild.Height * 2).ToString
 
    e.HasMorePages = (e.PageBounds.Height <= i + 50)
    Page += 1
 
    acYPos = acYPos + 60
    ParentFileName = Microsoft.VisualBasic.Dir()
Loop
Vielen Dank im Voraus.

mfg.

Dirk

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem / Druck auf nächster Seite (n) fortsetzen 
Autor: ModeratorFZelle (Moderator)
Datum: 28.10.13 20:32

Indem du eine der gefühlten hundert tausend Erklärungen zum Drucken unter .NET anschaust.

http://openbook.galileocomputing.de/visual_basic/Kapitel_23-001.htm

Besonders HasMorePages beachten.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem / Druck auf nächster Seite (n) fortsetzen 
Autor: Dirk01
Datum: 29.10.13 13:52

Hallo FZelle!

Das mit den "gefühlten hundert tausend Erklärungen zum Drucken unter .NET" glaub ich Dir ja und ich habe mir auch sicherlich einige davon im Vorfeld angesehen und ausprobiert, denoch bekomme ich es nicht hin.

Mein Problem ist, dass ich durch meine Schleife Blockabschitte erstelle:
je Durchlauf = Block bzw. Artikelbezeicnung
- links ein Bild
- rechts die Bezeichnungen und weiter Infomationen
Solch ein Block ergibt Druckabschnitt Höhe = ca. 60mm

Diese Blockabschnitte werden auch erstellt nur bekomme ich es nicht hin, dass wenn
x Antahl an Blockabschnitte erreicht sind auf der nächsten Seite weitergedruckt wird.

Blockabschnitt = Bildhöhe + acYPos

Seitenumbruch nach 3 Blockabschnitten.

Ich bekomme es einfach nicht hin.

Für Lösungsansätze wäre ich dankbar.


mfg.

Dirk

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem / Druck auf nächster Seite (n) fortsetzen 
Autor: JangoF
Datum: 29.10.13 14:07

Der Wechsel auf die neue Seite findet statt wenn du PrintDocument1_PrintPage verlässt und Hasmorepages auf True setzt.
Du musst halt prüfen wann die aktuelle Seite voll ist und dir dann den Zustand merken an dem du dich in deinem Schleifenablauf gerade befindest für das nächste PrintDocument1_PrintPage Event = nächste Seite.
Dort musst du dann mit der Ausgabe fortfahren wo du auf der Seite vorher aufgehört hat.
Das ganze machst du solange bis alle deine Daten ausgegeben sind und dann setzt du Hasmorepages=False.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem / Druck auf nächster Seite (n) fortsetzen 
Autor: Manfred X
Datum: 29.10.13 15:19

Das Beispiel macht Thumbnails aus den JPEGs in MyPictures
und druckt sie hintereinander aus.
Public Class frmPrintPictures
 
    Dim WithEvents pd As New Printing.PrintDocument
    Dim picindex As Integer
    Dim piclist As New List(Of Bitmap)
 
    Private Sub frmPrintPictures_Load(sender As System.Object, _
        e As System.EventArgs) Handles MyBase.Load
 
 
        Dim picfolder As String = _
        My.Computer.FileSystem.SpecialDirectories.MyPictures
 
        For Each picfile As String In IO.Directory.GetFiles(picfolder, "*.jpg")
            'Bild laden
            Dim bmpin As New Bitmap(picfile)
            'Thumbnail Size festlegen
            Dim width As Integer = 100
            Dim height As Integer = CInt(bmpin.Height * 100 / bmpin.Width)
            If height > 100 Then
                width = CInt(bmpin.Width * 100 / bmpin.Height)
                height = 100
            End If
 
            'Thumbnail erstellen und listen
            Dim bmp As New Bitmap(width, height)
            Using g As Graphics = Graphics.FromImage(bmp)
                g.DrawImage(bmpin, 0, 0, bmp.Width, bmp.Height)
                piclist.Add(bmp)
            End Using
        Next picfile
 
        'Drucken
        pd.Print()
    End Sub
 
    Private Sub pp_PrintPage(sender As Object, _
        e As System.Drawing.Printing.PrintPageEventArgs) Handles pd.PrintPage
 
        Dim ph As Integer = 0 'Position in y-Richtung
 
        Do While picindex < piclist.Count - 1 AndAlso _
            ph + piclist(picindex + 1).Height <= e.PageBounds.Height
            picindex += 1
            e.Graphics.DrawImage(piclist(picindex), 10, ph)
            ph += piclist(picindex).Height + 10
        Loop
 
        e.HasMorePages = picindex < piclist.Count - 1
    End Sub
End Class
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem / Druck auf nächster Seite (n) fortsetzen 
Autor: Dirk01
Datum: 30.10.13 10:20

Hallo Manfred!

Ich möchte nicht nerven, aber ich bekomme es einfach nicht.

Zumindest bekomme ich schon mal hin, wieviele Seiten gedruckt werden sollen
Bild list.count / 3 da nur 3 Bilder auf je eine Seite passen.

Wo muß ich was wie machen, damit nach den ersten 3 Bildern auf die 2 ... 3 etc. Seite gedruckt wird.

Private aktuelleSeite As Integer
'...
Private Sub P5_CMB_Drucken_Click(sender As System.Object, e As _
  System.EventArgs) _
                                                    Handles P5_CMB_Drucken.Click
aktuelleSeite = 0
With PrintPreviewDialog1
    .Document = PrintDocument1
    If .ShowDialog() = System.Windows.Forms.DialogResult.OK Then
       PrintDocument1.Print()
    End If
End With
End Sub
 
Private Sub PrintDocument1_PrintPage(ByVal sender As Object, ByVal e As _       _
                       System.Drawing.Printing.PrintPageEventArgs) _
                            Handles PrintDocument1.PrintPage
 
 
       Dim gr As Graphics = e.Graphics
        gr.PageUnit = GraphicsUnit.Millimeter
        gr.PageScale = 1.0
 
        Dim acXPos As VariantType = 15
        Dim acYPos As VariantType = 5
 
        Dim ok As Bitmap = Me.ImageList1.Images(0)
        Dim no As Bitmap = Me.ImageList1.Images(1)
 
        Dim BildDir As New System.IO.DirectoryInfo(WMFFile)
        Dim BildFiles As System.IO.FileInfo() = BildDir.GetFiles("*_D.wmf")
        Dim BildFile As System.IO.FileInfo
 
        PrintDocument1.PrinterSettings.PrinterName = P5_CB_Druckerauswahl.Text
        Dim MyFont14 As New System.Drawing.Font("Arial", 14, _
          Drawing.FontStyle.Bold)
        Dim MyFont12 As New System.Drawing.Font("Arial", 12, _
        Drawing.FontStyle.Regular)
        Dim MyFont10 As New System.Drawing.Font("Arial", 10, _
        Drawing.FontStyle.Regular)
 
        Dim MyDir As New System.IO.DirectoryInfo(DWGFile)
        Dim MyFiles As System.IO.FileInfo() = MyDir.GetFiles("*.dwg")
        Dim MyFile As System.IO.FileInfo
 
        Dim MGruppe As String = Microsoft.VisualBasic.Right(DWGFile, 3)
 
        Try
            gr.DrawString(DWGFile, MyFont14, Brushes.Black, acXPos, acYPos)
            gr.DrawLine(Pens.Red, acXPos, acYPos + 12, acXPos + 190, acYPos + _
              12)
 
            gr.DrawString("Für die Materialgruppe - " & MGruppe & " - gibt es" & _
              "folgende Blöcke:", _                                             _
                   MyFont12, Brushes.Black, acXPos, acYPos + 20)
 
            'gr.DrawImage(BlockBild, acXPos, acYPos + 30)
            Dim ImportPfad As String
            ImportPfad = ALLPA_TB_Pfad.Text & "\"
            Dim DateiName As String
            DateiName = "*_D.dwg"
            Dim ParentFileName As String = Microsoft.VisualBasic.Dir(ImportPfad _
              & DateiName)
            Dim BasicFileName As String
 
            Dim fso As System.IO.File
 
            Dim wmfList As New List(Of Bitmap)
 
            Do While ParentFileName <> ""
 
                BasicFileName = ParentFileName.Remove(ParentFileName.Length - _
                  6, 6)
                Dim BildName As String
                BildName = BasicFileName & "_D.wmf"
 
                '--Bild einfügen---
                Dim BlockBild As Bitmap = New Bitmap(ImportPfad & BildName)
                wmfList.Add(BlockBild)
 
                gr.DrawImage(BlockBild, acXPos, acYPos + 30)
 
                '--Dateinamen _D.dwg einfügen--
                Dim FileName_D As String
                FileName_D = BasicFileName & "_D.dwg"
                gr.DrawString(FileName_D, MyFont10, Brushes.Black, acXPos + _
                  100, acYPos + 30)
                If fso.Exists(ImportPfad & FileName_D) Then
                    gr.DrawImage(ok, acXPos + 90, acYPos + 30)
                Else
                    gr.DrawImage(no, acXPos + 90, acYPos + 30)
                End If
 
'...
'...
                acYPos = acYPos + 70
                ParentFileName = Microsoft.VisualBasic.Dir()
            Loop
 
            e.HasMorePages = (aktuelleSeite < (wmfList.Count / 3))
            aktuelleSeite += 1
 
End Sub
Für Hilfe wäre ich echt dankbar.

mfg.

Dirk

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem / Druck auf nächster Seite (n) fortsetzen 
Autor: Manfred X
Datum: 30.10.13 10:47

Hallo!

Du hast offenbar ein grundlegendes Verständnisproblem.

Der PrintPage-Eventhandler wird für JEDE EINZELNE Seite aufgerufen
(abhängig von HasMorePages).

Wenn ich das richtig verstehe, willst Du den Inhalt von wmfList ausdrucken???

Deine Liste (wmflist) muß selbstverständlich zunächst ausserhalb dieser Routine
erstellt werden. Schau doch mal mein Beispiel an.

Innerhalb dieser Routine wird pro Aufruf jeweils ein Abschnitt dieser Liste
bearbeitet (=gedruckt).




Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem / Druck auf nächster Seite (n) fortsetzen 
Autor: Manfred X
Datum: 30.10.13 11:30

Ich vermute, Du benötigst zunächst folgende Variable
(z.B. formular-global deklariert)

    Dim importpfad As String = "C:\daten"
 
    Dim ParentFileNames As List(Of String) = _
          (IO.Directory.GetFiles(importpfad)).ToList
 
    Dim ParentFileIndex As Integer = -1
 
    Dim WithEvents prntdoc As New Printing.PrintDocument
Und in etwa folgenden Aufbau der PrintPage ....
    Private Sub prntdoc_PrintPage(sender As Object, _
        e As System.Drawing.Printing.PrintPageEventArgs) _
        Handles prntdoc.PrintPage
 
        Dim pageindex As Integer = 0
        Dim parentfilename As String
 
        Do While ParentFileIndex < ParentFileNames.Count - 1 And pageindex <3
            pageindex += 1
            ParentFileIndex += 1
            parentfilename = ParentFileNames(ParentFileIndex)
 
            'Hier dein Code zum Drucken der Bilder/Texte zur akt. Datei
 
        Loop
 
        e.HasMorePages = ParentFileIndex < ParentFileNames.Count - 1
    End Sub


Beitrag wurde zuletzt am 30.10.13 um 11:48:59 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem / Druck auf nächster Seite (n) fortsetzen 
Autor: Dirk01
Datum: 31.10.13 17:39

Hallo Manfred!

In der Druckvorschau wird nun alles richtig angezeit.
- Anzahl der Seiten
- Je Seite 3 Druckblöcke

Sag ich dann drucken, so wird nur eine Seite und nur mit diesen Zeilen gedruckt:
'  Den Überschriftenblock festlegen 
' *************************************************
'  Blockverzeichnis
gr.DrawString(DWGFile, MyFont14, Brushes.Black, acXPos, acYPos)
'  Trennlinie
gr.DrawLine(Pens.Red, acXPos, acYPos + 12, acXPos + 190, acYPos + 12)
'  Materialgruppe filtern und drucken
Dim MGruppe As String = Microsoft.VisualBasic.Right(DWGFile, 3)
gr.DrawString("Für die Materialgruppe - " & MGruppe & " - gibt es folgende" & _
  "Blöcke:", MyFont12, Brushes.Black, acXPos, acYPos + 20)
Lass ich diese Zeile weg, wird in der Druckvorschau nur die erste Seite angezeigt - vollständig -
e.HasMorePages = ParentFileIndex < ParentFileNames.Count - 1
aber nur die zweite Seite gedruck, aber immerhin so wie sie sein sollte.

Hier noch mal die Übersicht:
'--global
Dim ParentFileIndex As Integer = -1
'...
Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As _
  System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
 
'  Drawing aktivieren 
' ***************************************************************
Dim gr As Graphics = e.Graphics
'...
'  Den Überschriftenblock festlegen 
' *************************************************
gr.DrawString(DWGFile, MyFont14, Brushes.Black, acXPos, acYPos)
'  Trennlinie
gr.DrawLine(Pens.Red, acXPos, acYPos + 12, acXPos + 190, acYPos + 12)
'...
Dim MyDir As New System.IO.DirectoryInfo(DWGFile)
Dim MyFiles As System.IO.FileInfo() = MyDir.GetFiles("*_D.dwg")
Dim MyFile As System.IO.FileInfo
'...
Dim ParentFileNames As List(Of String) = New List(Of String)
For Each MyFile In MyFiles
    ParentFileNames.Add(MyFile.Name)
Next
'...
Do While ParentFileIndex < ParentFileNames.Count - 1 And pageindex < 3
pageindex += 1
ParentFileIndex += 1
ParentFileName = ParentFileNames(ParentFileIndex)
 
'ab hier kommt der Druckblock sprich 3 je Seite
'dieses funktioniert auch.
'...
Loop
 
e.HasMorePages = ParentFileIndex < ParentFileNames.Count - 1
 
End Sub
Diese letzte Zeile e.HasMorePage ... habe ich in den verschiedensten Varianten probiert.

Aber immer wieder wird nur die letzte Seite gedruckt, oder eine Seite mit nur den Überschriften.

Woran kann dies denn nun liegen?






mfg.

Dirk

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem / Druck auf nächster Seite (n) fortsetzen 
Autor: Manfred X
Datum: 31.10.13 18:15

Nochmal .....

BITTE BITTE
Nicht die Dateiliste in der PrintPage füllen!

Global definieren:
Dim ParentFileNames As List(Of String)

Und vor dem Erstellen der Druckvorschau füllst Du einmal die Liste,
z.B. mit Deinem Code, der jetzt in "PrintPage" steht.

Nach dem Durchführen der Druckvorschau, vor dem Druckbefehl, mußt Du
einfach die Variable ParentFileIndex wieder auf -1 setzen,
damit der Druck wieder von vorne anfängt.



Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem / Druck auf nächster Seite (n) fortsetzen 
Autor: Dirk01
Datum: 03.11.13 14:29

Hallo Manfred!

Ich hoffe, dass ich es nun halbwegs verstanden habe.

Global:
Dim ParentFileNames As List(Of String) = New List(Of String)
Dim ParentFileIndex As Integer = -1
Dim WithEvents prntdoc As New Printing.PrintDocument
Dim ImportFile As String
Form load:
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As _
  System.EventArgs) _
Handles MyBase.Load
'...
ImportFile = TextBox1.Text & "\"
End Sub
Die Liste füllen:
Private Sub ListenDruck()
    Dim myDir As New DirectoryInfo(ImportFile)
    Dim myFiles() As FileInfo
    myFiles = myDir.GetFiles("*.dwg")
 
    For Each MyFile In myFiles
        ParentFileNames.Add(MyFile.Name)
    Next
End Sub
Die PrintPage erstellen:
Private Sub prntdoc_PrintPage(ByVal sender As System.Object, ByVal e As _
  System.Drawing.Printing.PrintPageEventArgs) Handles prntdoc.PrintPage
        Dim PositionX As Integer = e.MarginBounds.X * 25.4 \ 100 - 25
        Dim PositionY As Integer = e.MarginBounds.Y * 25.4 \ 100 - 25
        e.Graphics.PageUnit = GraphicsUnit.Millimeter
        Dim gr As Graphics = e.Graphics
 
        prntdoc.PrinterSettings.PrinterName = Me.P5_CB_Druckerauswahl.Text
 
        '  Startpositionen für X und Y festlegen 
        ' ********************************************
        Dim acXPos As VariantType = 15
        Dim acYPos As VariantType = 5
 
        '  Die Bitmaps für ok und no bestimmen 
        ' **********************************************
        Dim ok As Bitmap = Me.ImageList1.Images(0)
        Dim no As Bitmap = Me.ImageList1.Images(1)
 
        '  Die unterschiedlichen Schriftarten bzw. Höhen etc. definieren 
        ' ********************
        Dim MyFont14 As New System.Drawing.Font("Arial", 14, _
          Drawing.FontStyle.Bold)
        Dim MyFont12 As New System.Drawing.Font("Arial", 12, _
        Drawing.FontStyle.Regular)
        Dim MyFont10 As New System.Drawing.Font("Arial", 10, _
        Drawing.FontStyle.Regular)
 
        Dim fso As System.IO.File
 
        Dim pageindex As Integer = 0
        Dim parentfilename As String
 
        Do While ParentFileIndex < ParentFileNames.Count - 1 AndAlso pageindex < 3
            pageindex += 1
            ParentFileIndex += 1
            parentfilename = ParentFileNames(ParentFileIndex)
 
            Dim BasicFileName As String
 
            Label1.Text = ImportFile
 
            BasicFileName = parentfilename.Remove(parentfilename.Length - 6, 6)
            Dim BildName As String
            BildName = BasicFileName & "_D.wmf"
 
 
            '--Bild einfügen---
            Dim BlockBild As Bitmap = New Bitmap(ImportFile & BildName)
            gr.DrawImage(BlockBild, acXPos, acYPos + 30)
 
            '--Dateinamen _D.dwg einfügen--
            Dim FileName_D As String
            FileName_D = BasicFileName & "_D.dwg"
            gr.DrawString(FileName_D, MyFont10, Brushes.Black, acXPos + 100, _
              acYPos + 30)
            If fso.Exists(ImportFile & FileName_D) Then
                gr.DrawImage(ok, acXPos + 90, acYPos + 30)
            Else
                gr.DrawImage(no, acXPos + 90, acYPos + 30)
            End If
 
            '--Dateinamen _S.dwg einfügen--
            '...
            '--Dateinamen _F.dwg einfügen--
            '...
            '--Dateinamen _P.dwg einfügen--
            '...
        Loop
        e.HasMorePages = ParentFileIndex < ParentFileNames.Count - 1
    End Sub
Vorschau erstellen und drucken:
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _
      System.EventArgs) Handles Button1.Click
        Try
            ListenDruck()
            With PrintPreviewDialog1
                .Document = prntdoc
                If .ShowDialog() = System.Windows.Forms.DialogResult.OK Then
                    ParentFileIndex = -1
                    prntdoc.Print()
                End If
 
            End With
        Catch ex As System.Exception
            MsgBox("Problem:" & vbCrLf & ex.Message)
        End Try
    End Sub
Ergebnis nun ist, die Vorschau wird erstellt, jedoch jedes auf eine Seite und nicht die ersten 3 aus der liste auf Seite 1, nächsten 3 auf Seite 2, etc..
Sag ich dann drucken ok, wird nur eine leere Seite gedruckt.

Ich weiß, dass ich mich damit echt schwer hingebe und benötige eben drum Deine bzw. eure Hilfe.

Vielen Dank noch mal.

mfg.

Dirk

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem / Druck auf nächster Seite (n) fortsetzen 
Autor: Manfred X
Datum: 03.11.13 16:22

Hallo!

Nutze "Option Strict On" (z.B. als erste Anweisung in der Codedatei)

und überdenke mal folgende Berechnung (Ganzzahlen runden?):
Dim PositionX As Integer = e.MarginBounds.X * 25.4 \ 100 - 25
Dim PositionY As Integer = e.MarginBounds.Y * 25.4 \ 100 - 25
Wieso sind acXPos, acYPos keine Integer?
Ich sehe nicht, das acYPos im Code (Loop-Schleife) hochgesetzt wird.

Füge hinter dieser Zeile ...
e.HasMorePages = ParentFileIndex < ParentFileNames.Count - 1
diese Zeile ein .... (garantiert das Zurücksetzen nach PrintPreview)
If Not e.HasMorePages Then ParentFileIndex = -1
Füge vor dem Ausführen von PrintPreviewDialog
ParentFileIndex = -1
ein.


Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem / Druck auf nächster Seite (n) fortsetzen 
Autor: Outi77
Datum: 15.11.13 07:56

Guten Morgen zusammen,
ich klinke mich mal in dieses Thema ein, ich habe zwar ein etwas anderes Problem, aber ich denke, dass ich hier richtig bin. Falls nicht, bitte bescheidsagen, dass ich ein neues Thema eröffnen kann.
Zum Problem:
Ich lese aus einer Text-Datei zeilenweise Daten aus, welche dann auf Etiketten gedruckt werden sollen.
Über den Punkt, dass nicht mehr als eine Seite grdruckt wird, bin ich bereits hinaus, es werden tatsächlich alle Seiten gedruckt. Allerdings, und das ist das Problem, wird nach jeder Seite eine Leerzeile gedruckt, heißt, der Drucker schiebt am Ende jeder Zeile um eine Zeile vor.
Jetzt gibt es 2 Möglichkeiten:
Entweder stimmt etwas am Code nicht, oder an den Settings des Druckers (hierbei handelt es sich übrigens um einen Lexmark Form Printer 2500).
Ich poste mal meinen Code in der Hoffnung, dass vielleicht jemand einen Fehler findet.
Falls nicht, gibt es eine Möglcihkeit in Form eines Befehls, den Zeilenvorschub am Seitenende zu verhindern?
Ich habe den Code stark vereinfacht, damit weniger gelesen werden muss.
Imports System.Drawing.Printing
 
Public Class Form1
 
    Dim abstand_x As Integer, abstand_y As Integer, seitenzahlen As Integer, _
      seitenzahl As Integer = 1, zähler As Integer = 0
    Dim arr As New List(Of String)
 
    Private WithEvents doc As New PrintDocument()
 
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As _
      System.EventArgs) Handles MyBase.Load
        abstand_x = 838
        abstand_y = 602
 
        For a As Integer = 0 To 300
            arr.Add(CStr(a))
        Next
 
        seitenzahlen = CInt(Math.Ceiling(arr.Count / 72))
 
    End Sub
 
    Private Sub Draw(ByVal g As Graphics, ByVal x As Integer, ByVal y As _
      Integer)
        Dim c As Color = Color.Black
        Dim f As Font = New Font(schriftart, schriftgröße)
 
        For i As Integer = zähler To arr.Count - 1
            If (i + 1) Mod 6 = 0 Then
                g.TextRenderingHint = _
                  Drawing.Text.TextRenderingHint.SingleBitPerPixelGridFit
                g.DrawString(arr(i), f, New SolidBrush(c), New Point(x, y))
                x = 0 : y = CInt(y + abstand_y)
            Else
                g.TextRenderingHint = _
                  Drawing.Text.TextRenderingHint.SingleBitPerPixelGridFit
                g.DrawString(arr(i), f, New SolidBrush(c), New Point(x, y))
                x = CInt(x + abstand_x)
            End If
            zähler += 1
            If (zähler Mod 72) = 0 Then Exit For
        Next
    End Sub
 
    Private Sub Drucker(ByVal sender As Object, ByVal e As PrintPageEventArgs) _
      Handles doc.PrintPage
        Dim g As Graphics = e.Graphics
        g.PageUnit = GraphicsUnit.Pixel
        g.TextRenderingHint = _
          Drawing.Text.TextRenderingHint.SingleBitPerPixelGridFit
        Me.Draw(g, 0, 0)
        e.HasMorePages = seitenzahl < seitenzahlen
        seitenzahl += 1
    End Sub
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _
      System.EventArgs) Handles Button1.Click
        doc.Print()
    End Sub
 
End Class
[/VB]
Folgende Daten einer Seite Etiketten: 12 Reihen a 6 Etiketten.
Ich hatte anfangs mit
g.PageUnit = GraphicsUnit.Millimeter
gearbeitet, leider konnte ich da die Abstände zwischen den Etiketten nicht mit Komma-Stellen setzen.
Es wurde immer auf die nächste ganze Zahl gerundet.

Danke für die Hilfe!
Gruß Outi
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem / Druck auf nächster Seite (n) fortsetzen 
Autor: Manfred X
Datum: 15.11.13 09:25

Hallo!

Du solltest jeweils den tatsächlichen Platzbedarf
des ausgegebenen Textes bestimmen (Measurestring-Methode
des Graphics-Objekts) - und die Position der nächsten zu druckenden
Zeile von der Höhe abhängig machen.

Auch die Prüfung der Page- oder Margin-"Bounds" wäre
bei der Beurteilung, wann der Seitenumbruch erfolgen muß,
einzubeziehen. (Schau Dir auch mal die HardMarginX-Eigenschaft
der Pagesettings an.)

Bei der Rundung der Werte für die X-, Y-Position kann es
zu Ungereimtheiten kommen - besser stets abrunden (Math.Floor).








Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem / Druck auf nächster Seite (n) fortsetzen 
Autor: Outi77
Datum: 15.11.13 10:46

Hallo,
also ich habe jetzt mal folgende Werte herausgefunden:
PageBounds.Height = 1169
PageSettings.PrintableArea.Top = 25
PageSettings.PrintableArea.Height = 1100
daraus ergibt sich der untere Seitenrand = 1,1176

MeasureString(text, font).Height = 4

Jetzt weiß ich allerdings noch nicht wirklich, wie ich die Werte verwenden muss, damit die Positionierung der Etiketten klappt. Könntest Du mir das bitte erklären?

Danke für die Hilfe!

Beitrag wurde zuletzt am 15.11.13 um 11:15:59 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem / Druck auf nächster Seite (n) fortsetzen 
Autor: Outi77
Datum: 15.11.13 11:31

Sorry für Doppel-Post, zu spät den letzten editieren gewollt...
Also mein Denkansatz zum Positionieren wäre:
1.Zeile: y = PageSettings.PrintableArea.Top
folgende Zeilen : y += String-Höhe (zeile 1) + Abstand Etiketten

Für die Seiten:
Solange y < (PageBounds.Height - PageSettings.PrintableArea.Top) wird erste Seite gedruckt.
Wenn y >= (PageBounds.Height - PageSettings.PrintableArea.Top HasMorePages = True und y wieder zurücksetzen auf y = PageSettings.PrintableArea.Top

Kommt das so in etwa hin?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem / Druck auf nächster Seite (n) fortsetzen 
Autor: Manfred X
Datum: 15.11.13 12:02

Ich weiß nicht, wie genau das positioniert werden soll.
Versuch es mal in diese Richtung ....

Imports System.Drawing.Printing
 
Public Class frmPrintDemoV2
 
    Dim WithEvents button1 As New Button With {.Parent = Me, .Text = "Drucken"}
 
    Dim zähler As Integer = 0
 
    Dim arr As New List(Of String)
 
    Dim schriftart As New Font("Arial", 12, FontStyle.Regular)
 
    Private WithEvents doc As New PrintDocument()
 
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As  _
      System.EventArgs) Handles MyBase.Load
 
        For a As Integer = 0 To 300
            arr.Add(CStr(a))
        Next
    End Sub
 
    Private Sub Draw(ByVal g As Graphics, e As PrintPageEventArgs)
 
        Dim c As Color = Color.Black
        Dim f As Font = schriftart
 
        Dim x, y As Double
        x = e.PageSettings.Margins.Left * 25.4 / 100 '1/100 Zoll in Millimeter
        y = e.PageSettings.Margins.Top * 25.4 / 100
 
        For i As Integer = zähler To arr.Count - 1
            If (i + 1) Mod 6 = 0 Then
 
                Dim h As Integer = CInt(Math.Ceiling(g.MeasureString(arr(i), _
                  f).Height))
 
                g.DrawString(arr(i), f, New SolidBrush(c), _
                             New Point(CInt(x), CInt(Math.Ceiling(y))))
 
                x = e.PageSettings.Margins.Left * 25.4 / 100
                y += h
 
            Else
                'Standardbreite der Felder ermitteln, anhand einer Zeichenfolge 
                Dim w As Integer = CInt(Math.Ceiling(g.MeasureString("XXXX", _
                  f).Width))
 
                g.DrawString(arr(i), f, New SolidBrush(c), _
                             New Point(CInt(x), CInt(Math.Ceiling(y))))
                x += w
 
            End If
 
            zähler += 1
 
            If y > e.MarginBounds.Height * 25.4 / 100 Then Exit For
        Next i
    End Sub
 
 
 
    Private Sub Drucker(ByVal sender As Object, ByVal e As PrintPageEventArgs) _
      Handles doc.PrintPage
        Dim g As Graphics = e.Graphics
 
        g.PageUnit = GraphicsUnit.Millimeter
 
        g.TextRenderingHint = _
            Drawing.Text.TextRenderingHint.SingleBitPerPixelGridFit
 
        Me.Draw(g, e)
 
        e.HasMorePages = zähler < arr.Count - 1
 
    End Sub
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As  _
      System.EventArgs) Handles button1.Click
        zähler = 0
        doc.Print()
    End Sub
 
End Class


Beitrag wurde zuletzt am 15.11.13 um 12:10:15 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem / Druck auf nächster Seite (n) fortsetzen 
Autor: Outi77
Datum: 15.11.13 12:45

Hallo,
um das mit dem Positionieren zu verdeutlichen, hier mal ein Bild.

So sehen unsere Etiketten aus, jetzt soll jedes Element der ListofString auf ein Etikett.
Ich muss dazu sagen, dass hier der Einfachheit wegen nur fortlaufende Nummern gedruckt werden.
Tatsächlich besteht ein zu zeichnender String aus 4 Zeilen Daten...


Ich hoffe, ich konnte das mit dem Positionieren jetzt besser verdeutlichen.
Den Versatz vom linken Rand und den für die erste Zeile nach oben kann ich am Drucker direkt ändern.
Der Abstand zwischen den Etiketten paßt hier noch nicht...

Grüße

Beitrag wurde zuletzt am 15.11.13 um 13:00:11 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem / Druck auf nächster Seite (n) fortsetzen 
Autor: Manfred X
Datum: 15.11.13 13:05

Du mußt zunächst die Druckseite korrekt einrichten
(Breite/Ränder usw.), damit das zu Deinen Etiketten paßt.
Das VB-Programm kann nicht erkennen, was Du in den
Drucker eingespannt hast. Es fragt die Seiteneinstellungen ab.

Die Größe der Etiketten kannst Du (wie in Deinem Code)
natürlich absolut angeben (im Beispiel: Maßstab Millimeter)

Zusätzlich mußt Du die X-,Y-Abstände zwischen den Druckbereichen
der Etiketten als Parameter beim Positionieren separat einbeziehen.
x += (etiketten_druckbereich_breite + etiketten_druckbereich_abstandX)
y += (etiketten_druckbereich_höhe + etiketten_druckbereich_abstandY)

Die MeasureString- und die DrawString-Methoden besitzen jeweils
eine Überladung, bei der die LayoutArea/RectangleF
(=Etikettenformat/Druckbereich) mit angegeben werden kann.

Auf diese Weise kannst Du zunächst auch prüfen, ob der Text kurz
genug ist, um auf ein Etikett zu passen.

Bei Zeichenobjekten (z.B. SolidBrush) nach Gebrauch Dispose aufrufen
oder einen Using-Block nutzen.

Beitrag wurde zuletzt am 15.11.13 um 13:28:51 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Beispiel für LayoutRectangle 
Autor: Manfred X
Datum: 15.11.13 13:41

Etwa so ...

Imports System.Drawing.Printing
 
Public Class frmPrintDemoV2
 
    Dim WithEvents button1 As New Button With {.Parent = Me, .Text = "Drucken"}
 
    Dim zähler As Integer = 0
 
    Dim arr As New List(Of String)
 
    Dim schriftart As New Font("Arial", 12, FontStyle.Regular)
 
    Private WithEvents doc As New PrintDocument()
 
    'Angabe zu der Größe und Position des Druckbereichs der Etiketten 
    'in Millimeter
    Dim edb_breite As Single = 50
    Dim edb_höhe As Single = 30
    Dim edb_abstandX As Single = 10
    Dim edb_abstandY As Single = 15
 
 
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As  _
      System.EventArgs) Handles MyBase.Load
 
        For a As Integer = 0 To 300
            arr.Add("Nummer " & CStr(a) & vbCrLf & _
                    "Patz für die Kennung" & vbCrLf & Now.ToString)
        Next a
 
    End Sub
 
 
 
    Private Sub Draw(ByVal g As Graphics, e As PrintPageEventArgs)
 
        Dim br As New SolidBrush(Color.Black)
        Dim f As Font = schriftart
 
        Dim x, y As Single
        x = CSng(e.PageSettings.Margins.Left * 25.4 / 100) '1/100 Zoll in 
        ' Millimeter
        y = CSng(e.PageSettings.Margins.Top * 25.4 / 100)
 
        For i As Integer = zähler To arr.Count - 1
            If (i + 1) Mod 6 = 0 Then
 
                Dim h As Integer = CInt(Math.Ceiling(g.MeasureString(arr(i), _
                  f).Height))
 
                g.DrawString(arr(i), f, br, _
                New RectangleF(New PointF(x, y), New SizeF(edb_breite, _
                edb_höhe)), _
                StringFormat.GenericDefault)
 
                x = CSng(e.PageSettings.Margins.Left * 25.4 / 100)
                y += (edb_abstandY + edb_höhe)
            Else
 
                g.DrawString(arr(i), f, br, _
                New RectangleF(New PointF(x, y), New SizeF(edb_breite, _
                edb_höhe)), _
                StringFormat.GenericDefault)
 
                x += (edb_abstandX + edb_breite)
            End If
 
            zähler += 1
            If (y - edb_abstandY) > e.MarginBounds.Height * 25.4 / 100 Then _
              Exit For
        Next i
    End Sub
 
 
 
    Private Sub Drucker(ByVal sender As Object, ByVal e As PrintPageEventArgs) _
      Handles doc.PrintPage
        Dim g As Graphics = e.Graphics
 
        g.PageUnit = GraphicsUnit.Millimeter
 
        g.TextRenderingHint = _
            Drawing.Text.TextRenderingHint.SingleBitPerPixelGridFit
 
        Me.Draw(g, e)
 
        e.HasMorePages = zähler < arr.Count - 1
 
    End Sub
 
 
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As  _
      System.EventArgs) Handles button1.Click
        zähler = 0
        doc.Print()
    End Sub
 
End Class


Beitrag wurde zuletzt am 15.11.13 um 13:44:28 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem / Druck auf nächster Seite (n) fortsetzen 
Autor: Outi77
Datum: 15.11.13 13:45

Oh man, so langsam raucht mir der Kopf und ich verstehe rein gar nichts mehr
Das liegt allerdings nicht an Deinen Erklärungen, sondern an meiner Unwissenheit!
Ich dachte ursprünglich, dass der Code aus meinem ersten Post funktioniert und da der Drucker lediglich eine unnötige Leerzeile an jedem Seitenende einfügt.
Ich will eigentlich nicht, dass mir jemand alles vorkaut, aber in diesem Fall möchte ich Dich nochmal um Deine Hilfe bitten.
Wie richte ich denn die Druckseite ein? Klar, die Maße habe ich, aber mit welchen Befehlen lege ich die Werte in Programm fest?
Würde mich über Hilfe diesbezüglich sehr freuen, da ich mich bereits zu sehr "verrannt" habe.

Danke!

Ups, da war ich wohl zu voreilig...schau mir das sofort an

Beitrag wurde zuletzt am 15.11.13 um 13:48:57 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem / Druck auf nächster Seite (n) fortsetzen 
Autor: Outi77
Datum: 15.11.13 14:23

So, ich habe Deinen Code (angepaßt an unsere Etiketten-Größe) direkt mal am Etiketten-Drucker ausprobiert...hier das Ergebnis.

Jetzt müßte der Rand oben links nur noch eine Zeile höher und eine Reihe weiter links,
damit alle 6 Etiketten gedruckt werden.
Und diese 3 freien Zeilen, wenn ich nur wüßte, wie ich die verhindern könnte.

Imports System.Drawing.Printing
 
Public Class frmPrintDemoV2
 
    Dim WithEvents button1 As New Button With {.Parent = Me, .Text = "Drucken"}
 
    Dim zähler As Integer = 0
 
    Dim arr As New List(Of String)
 
    Dim schriftart As New Font("Arial", 12, FontStyle.Regular)
 
    Private WithEvents doc As New PrintDocument()
 
    'Angabe zu der Größe und Position des Druckbereichs der Etiketten 
    'in Millimeter
    Dim edb_breite As Single = 30
    Dim edb_höhe As Single = 23
    Dim edb_abstandX As Single = 5
    Dim edb_abstandY As Single = 2.4
 
 
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As  _
      System.EventArgs) Handles MyBase.Load
 
        For a As Integer = 0 To 73
            arr.Add("Nummer " & CStr(a) & vbCrLf & _
                    "Kennung" & vbCrLf & Now.ToString)
        Next a
 
    End Sub
 
 
 
    Private Sub Draw(ByVal g As Graphics, ByVal e As PrintPageEventArgs)
 
        Dim br As New SolidBrush(Color.Black)
        Dim f As Font = schriftart
 
        Dim x, y As Single
        x = CSng(e.PageSettings.Margins.Left * 25.4 / 100) '1/100 Zoll in 
        ' Millimeter
        y = CSng(e.PageSettings.Margins.Top * 25.4 / 100)
 
        For i As Integer = zähler To arr.Count - 1
            If (i + 1) Mod 6 = 0 Then
 
                Dim h As Integer = CInt(Math.Ceiling(g.MeasureString(arr(i), _
                  f).Height))
 
                g.DrawString(arr(i), f, br, _
                New RectangleF(New PointF(x, y), New SizeF(edb_breite, _
                edb_höhe)), _
                StringFormat.GenericDefault)
 
                x = CSng(e.PageSettings.Margins.Left * 25.4 / 100)
                y += (edb_abstandY + edb_höhe)
            Else
 
                g.DrawString(arr(i), f, br, _
                New RectangleF(New PointF(x, y), New SizeF(edb_breite, _
                edb_höhe)), _
                StringFormat.GenericDefault)
 
                x += (edb_abstandX + edb_breite)
            End If
 
            zähler += 1
            If (y - edb_abstandY) > e.MarginBounds.Height * 25.4 / 100 Then _
              Exit For
        Next i
    End Sub
 
 
 
    Private Sub Drucker(ByVal sender As Object, ByVal e As PrintPageEventArgs) _
      Handles doc.PrintPage
        Dim g As Graphics = e.Graphics
 
        g.PageUnit = GraphicsUnit.Millimeter
 
        g.TextRenderingHint = _
            Drawing.Text.TextRenderingHint.SingleBitPerPixelGridFit
 
        Me.Draw(g, e)
 
        e.HasMorePages = zähler < arr.Count - 1
 
    End Sub
 
 
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As  _
      System.EventArgs) Handles button1.Click
        zähler = 0
        doc.Print()
    End Sub
 
End Class


Beitrag wurde zuletzt am 15.11.13 um 14:32:05 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem / Druck auf nächster Seite (n) fortsetzen 
Autor: Manfred X
Datum: 15.11.13 14:39

Deine Seiten-Eionstellung paßt nicht zu den eingespannten Etiketten.
Du mußt die Ränder vermutlich auf 0 setzen.

Das kannst Du mit hoher Wahrscheinlichkeit über
den Pagesetup-Dialog des Druckers einrichten.
Dim ps As New PageSetupDialog
ps.Document = doc
ps.ShowDialog()
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem / Druck auf nächster Seite (n) fortsetzen 
Autor: Outi77
Datum: 15.11.13 14:59

Ja Du hattest Recht, die Ränder standen auf 10mm, muss die mal irgendwie in der Settings auf Null setzen. Jetzt kommt das hier dabei raus...

Den restlichen Versatz kann ich am Drucker direkt ändern, also den kompletten Einzug nach rechts verschieben und die Start-Position nach oben setzen.
Im Prinzip sind wir (wenigstens vom Aussehen her) auf dem gleichen Stand wie zu Beginn meiner Posts.
Seltsam ist nur, dass die Leerzeile eine eigentlich vorhandene Zeile überschreibt (Nummer 66-71 fehlen).
Könnte es vielleicht sein, dass der Drucker automatisch am Seitenende eine Leerzeile einfügt?
Oder gibt es einen Befehl, der diese Leerzeile unterdrückt?
Oder muss ich noch irgendwas an meinem Settings ändern? Vielleicht den Seitenrand unten auf einen Minus-Wert setzen? Weiß nicht, ob das überhaupt geht?
Unabhängig davon, hab jetzt schon mal vielen Dank für Deine Hilfe! Dachte schon, das wird nie mehr was.

Beitrag wurde zuletzt am 15.11.13 um 15:13:18 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem / Druck auf nächster Seite (n) fortsetzen 
Autor: Manfred X
Datum: 15.11.13 15:15

Mit der Einrichtung der Seite ist vermutlich etwas nicht in Ordnung,
(eventuell den oberen und unteren Rand auf 0 setzen ???)
Du versuchst, in einen Bereich zu drucken, den der Drucker anscheinend
nicht akzeptiert und deshalb statt des Drucks einen Seiten-Vorschub setzt.
Vielleicht kannst Du "Endlos-Druck" als Papiergröße einstellen.


Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem / Druck auf nächster Seite (n) fortsetzen 
Autor: Manfred X
Datum: 15.11.13 15:43

Ich habe jetzt mal einen "physikalischen" Drucker angeschlossen
(ich drucke nie auf Papier!)

Steuere den Seitenvorschub so ....
zähler += 1
With e.PageSettings
     Dim h As Single = .PrintableArea.Height - .Margins.Top - .Margins.Bottom
     If (y - edb_abstandY) > CSng(h * 25.4 / 100) Then Exit For
End With
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem / Druck auf nächster Seite (n) fortsetzen 
Autor: Outi77
Datum: 15.11.13 16:55

Hi,
die Antwort auf Deinen vorletzten Post klärt die Sache vielleicht schon auf.
Ich hatte im Druckeinstellungs-Fenster ja die Seitenränder manuell auf Null gesetzt.
Dabei ist mir beim Papier-Format aufgefallen, dass da A4 steht. Habe mir nur nicht weiter bei gedacht.
Ich kann erst Montag wieder schauen, ob es auch Endlos-Papier als Auswahl gibt. Sollte es, sonst muss ich
den Treiber mal wechseln.
Alternativ kann ich Deine zuletzt genannte Variante aber auch mal testen...
Danke für Deine Mühen und ein schönes Wochenende!
Bis Montag,

Grüße Markus
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem / Druck auf nächster Seite (n) fortsetzen 
Autor: Outi77
Datum: 18.11.13 12:40

Moin,
also die gute Nachricht: es funktioniert.
Folgender Code:
Imports System.Drawing.Printing
 
Public Class frmPrintDemoV2
 
    Dim WithEvents button1 As New Button With {.Parent = Me, .Text = "Drucken"}
 
    Dim zähler As Integer = 0
 
    Dim arr As New List(Of String)
 
    Dim schriftart As New Font("Arial", 12, FontStyle.Regular)
 
    Private WithEvents doc As New PrintDocument()
 
    'Angabe zu der Größe und Position des Druckbereichs der Etiketten 
    'in Millimeter
    Dim edb_breite As Single = 30
    Dim edb_höhe As Single = 23
    Dim edb_abstandX As Single = 5
    Dim edb_abstandY As Single = 2.4
 
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As  _
      System.EventArgs) Handles MyBase.Load
 
        For a As Integer = 0 To 73
            arr.Add("Nummer " & CStr(a) & vbCrLf & _
                    "Kennung" & vbCrLf & Now.ToString)
        Next a
 
    End Sub
 
    Private Sub Draw(ByVal g As Graphics, ByVal e As PrintPageEventArgs)
        Dim br As New SolidBrush(Color.Black)
        Dim f As Font = New Font("Calibri", 9)
        Dim x, y As Single
 
        x = CSng(e.PageSettings.Margins.Left * 25.4 / 100) '1/100 Zoll in 
        ' Millimeter
        y = CSng(e.PageSettings.Margins.Top * 25.4 / 100)
 
        For i As Integer = zähler To arr.Count - 1
            If (i + 1) Mod 6 = 0 Then
 
                Dim h As Integer = CInt(Math.Ceiling(g.MeasureString(arr(i), _
                  f).Height))
 
                g.DrawString(arr(i), f, br, New RectangleF(New PointF(x, y), _
                  New SizeF(edb_breite, edb_höhe)), StringFormat.GenericDefault)
 
                x = CSng(e.PageSettings.Margins.Left * 25.4 / 100)
                y += (edb_abstandY + edb_höhe)
            Else
 
                g.DrawString(arr(i), f, br, New RectangleF(New PointF(x, y), _
                  New SizeF(edb_breite, edb_höhe)), StringFormat.GenericDefault)
 
                x += (edb_abstandX + edb_breite)
            End If
 
            zähler += 1
            With e.PageSettings
                Dim h As Single = .PrintableArea.Height - .Margins.Top - _
                  .Margins.Bottom
                If (y - edb_abstandY) > CSng(h * 25.4 / 100) Then Exit For
            End With
        Next i
    End Sub
 
    Private Sub Drucker(ByVal sender As Object, ByVal e As PrintPageEventArgs) _
      Handles doc.PrintPage
        Dim g As Graphics = e.Graphics
 
        g.PageUnit = GraphicsUnit.Millimeter
        g.TextRenderingHint = _
          Drawing.Text.TextRenderingHint.SingleBitPerPixelGridFit
 
        Me.Draw(g, e)
        e.HasMorePages = zähler < arr.Count - 1
 
    End Sub
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As  _
      System.EventArgs) Handles button1.Click
        Dim ps As New PageSetupDialog
        Dim margins As New Margins(0, 0, 0, 0)
        Dim papersize As New PaperSize("German Std Endlospapier", 850, 1200)
 
        ps.Document = doc
        ps.PageSettings.Margins = margins
        ps.PageSettings.PaperSize = papersize
 
        ps.ShowDialog()
 
        zähler = 0
        doc.Print()
    End Sub
 
End Class
So, das Einzige, was mich jetzt noch ein Bißchen stört ist, dass (auf eine Reihe Etiketten bezogen) der Abstand des Aufdrucks vom Rand des Etiketts von links nach rechts immer kleiner wird. Also beim ersten Etikett in einer Reihe beträgt der Abstand des Aufdrucks vom Etikettenrand 4mm, beim letzten Etikett in der Reihe aber nur noch 1,5mm.
Ich vermute, dass die Kommastellen bei den Margins abgeschnitten werden (abgerundet auf Ganzzahl).
Deshalb hatte ich ursprünglich mit Pixel gearbeitet. Welche Möglichkeit habe ich jetzt, dass der Abstand überall gleich ist? Wie gesagt, der Fehler ist marginal, wäre nur schöner, wenn's gleich wär.

Gruß
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem / Druck auf nächster Seite (n) fortsetzen 
Autor: Manfred X
Datum: 18.11.13 14:08

Hallo!

Bei diesem Code wird die Einheit Millimeter verwendet
und Variablen als Gleitkomma-Typ Single deklariert,
sowohl bei den Positionsangaben x,y als auch beim
Füllen von "RectangleF"-Variablen (PointF, SizeF).

Der einzige Ganzzahlwert sind die Margins.
Diese Angabe ist aber auf 1/100 Millimeter genau
und es wird beim Umrechnen nur von Double in Single
konvertiert.

Die Ausrichtungswerte "x" sind in jeder Folgezeile
jeweils gleich.
Verfolge mal im Debugger den Verlauf der x-Werte.
Da sollten stets die gleichen 6 Zahlen aufeinander folgen.

Am obigen Code kann die Verschiebung der Druckzeile
deshalb eigentlich nicht liegen. Ich kann nur raten.
Vielleicht verarbeitet der Drucker die 0-Werte bei
der Angabe der Margins nicht richtig.
Schau Dir mal in den "DefaultPrinterSettings" die
HardMargin-Angaben oder die "OriginAtMargins"-
Eigenschaft des Dokuments an.







Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem / Druck auf nächster Seite (n) fortsetzen 
Autor: Outi77
Datum: 19.11.13 09:14

Guten Morgen,
ich habe soeben ein anderes, bedeutenderes Problem festgestellt, welches ich umgehend beheben muss.

Ich hoffe, man kann es erkennen. In der 12.Etiketten-Zeile wird die letzte Reihe nur ansatzweise gedruckt.
Ich vermute, dass die papersize nicht stimmt...
Private Sub out()
        Dim ps As New PageSetupDialog
        Dim margins As New Margins(0, 0, 0, 0)
        Dim papersize As New PaperSize("PaperSize German Std Endlospapier", _
          850, 1200)
 
        ps.Document = doc
        ps.PageSettings.Margins = margins
        ps.PageSettings.PaperSize = papersize
 
        If druck_dialog = True Then
            ps.ShowDialog()
        End If
 
        doc.Print()
    End Sub
Wenn ich allerdings vor dem Druck mir den Printdialog anzeigen lasse, steht da nicht "German Std Endlospapier", sondern Letter...händisch umgestellt auf "German Std Endlospapier" und trotzdem wird Zeile 12 abgeschnitten. Keine Ahnung, was ich da jetzt von halten soll. Vielleicht sollte ich ein neues passendes Papierformat neu anlegen?
Auf dem Bild habe ich mal in der ersten Zeile die Abstände nach links markiert, nur um das von gestern zu verdeutlichen. Wie kann ich mir die DefaultPrinterSettings denn anzeigen lassen?

Beitrag wurde zuletzt am 19.11.13 um 09:40:03 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem / Druck auf nächster Seite (n) fortsetzen 
Autor: Manfred X
Datum: 19.11.13 13:01

Das Problem mit dem unterschiedlich breiten Rand der
Etiketten INNERHALB einer Zeile sollte sich durch eine
leichte Vergrößerung des Wertes in "edb_abstandX" erreichen
lassen.

Die Höhe der Seite muß ein Vielfaches von (edb_höhe+edb_abstandY)
sein (vermutlich 11x), wobei von diesem Produkt einmal "edb_abstandY"
abzuziehen ist (Seitenende)
- unter der Voraussetzung, daß die Margin-Einstellung oben/unten
jeweils 0 ist.

Du mußt mit diesen edb-Werten ein wenig experimentieren, bis es
paßt.

Beitrag wurde zuletzt am 19.11.13 um 13:04:56 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem / Druck auf nächster Seite (n) fortsetzen 
Autor: Outi77
Datum: 19.11.13 13:59

Hi,
also die Margins setze ich ja in der Sub out() alle auf Null, sollte also passen (siehe oben).
Wenn ich das mal durchrechne, komme ich auf eine Höhe pro Seite von 277mm bei 11 Reihen.
Bei 12 Reihen 302,4mm, was eher hinkommt (wenn ich mal das Lineal dran halte.
Equivalent dazu für die Breite komme ich auf 205mm.
Muss ich jetzt mein papersize wie folgt neu definieren?
Dim papersize As New PaperSize("Custom Paper Size", 302, 277)
Oder muss ich diese Werte noch umrechnen? Kommen mir so komisch klein vor...

Beitrag wurde zuletzt am 19.11.13 um 14:04:48 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem / Druck auf nächster Seite (n) fortsetzen 
Autor: Manfred X
Datum: 19.11.13 14:18

Nochmal grundsätzlich....

Beim Graphics-Objekt (zum Zeichnen) wird die vorgegebene
Einstellung Millimeter genutzt, um Position (PointF),
Größe (SizeF) oder Bereiche (RectangleF) einzelner
Zeichnungselemente festzulegen.

Seiteneinstellungen (z.B. PaperSize) verwenden stets
die Maßeinheit 1/100 Zoll.

Die Umrechnung von gemessenen Millimeter-Angaben auf
Seiteneinrichtungs-Parameter (in 1/100 Zoll) ist
deshalb erforderlich (1 Zoll = 25,4 mm).

---> Faktor: 3,937

Beitrag wurde zuletzt am 19.11.13 um 14:21:56 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem / Druck auf nächster Seite (n) fortsetzen 
Autor: Outi77
Datum: 19.11.13 15:08

Ich denke, mein kompletter Denkansatz bezüglich dieses Themas ist total verkehrt.
Das sieht man auch daran, dass ich eben die Papierhöhe vergrößert habe, weil ich dachte,
dass so die eine Zeile nicht mittendrin abgeschnitten wird. Der Beweis folgte umgehen, nämlich, dass der Ausdruck total verrückt rauskam. Also...Papierhöhe verkleinert und siehe da, es klappt.
Ich muss mir das alles mal in Ruhe zu Gemüte führen, Deine ganzen Antworten nochmal durchlesen und versuchen zu verstehen.
Ich danke Dir für Deine Mühen mit mir, bin sicher auch kein leichter Fragensteller...
Aber bitte nicht "weggehen", ich habe wahrscheinlich noch die eine oder andere Frage.

Grüße Markus
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