| |
VB.NET - Ein- und UmsteigerProblem / 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 | |
Re: Problem / Druck auf nächster Seite (n) fortsetzen | | | Autor: FZelle (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. | |
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 | |
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. | |
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 | |
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 | |
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).
| |
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. | |
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 | |
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.
| |
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 | |
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.
| |
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 | |
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).
| |
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. | |
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? | |
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. | |
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. | |
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. | |
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. | |
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. | |
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. | |
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() | |
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. | |
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.
| |
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 | |
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 | |
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ß | |
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.
| |
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. | |
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. | |
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. | |
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. | |
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 | |
| 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 |
|
|
sevISDN 1.0
Überwachung aller eingehender Anrufe!
Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Weitere InfosTipp des Monats TOP! Unser Nr. 1
Neu! sevDataGrid 3.0
Mehrspaltige Listen, mit oder ohne DB-Anbindung. Autom. Sortierung, Editieren von Spalteninhalten oder das interaktive Hinzufügen von Datenzeilen sind ebenso möglich wie das Erstellen eines Web-Reports. Weitere Infos
|