none
Druckproblem RRS feed

  • Frage

  • Public Class formular
    
        Public Property MdiList() As Boolean
            Get
    
            End Get
            Set(ByVal value As Boolean)
    
            End Set
        End Property
        Private Sub formular_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            SetMDIList()
        End Sub
        Public Sub SetMDIList()
            Dim menuItem1 As New ToolStripMenuItem("Fenster")
    
            Me.MainMenuStrip.Items.Add(menuItem1)
            Me.MainMenuStrip.MdiWindowListItem = menuItem1
        End Sub
        Private Sub FensterToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FensterToolStripMenuItem.Click
            Dim NewMDIChild As New Form2()
            'Set the Parent Form of the Child window.
            NewMDIChild.MdiParent = Me
            'Display the new form.
            NewMDIChild.Show()
            NewMDIChild.Name = "MDIChild"
        End Sub
    
        Private Sub DruckenToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DruckenToolStripMenuItem.Click
            PrintForm1.Print(Me.ActiveMdiChild, PowerPacks.Printing.PrintForm.PrintOption.ClientAreaOnly)
        End Sub
    
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Me.WindowState = FormWindowState.Maximized
        End Sub
    End Class
    3 Probleme:

     1. Das Bild im MDI Child wird richtig ausgedruckt, der Text aber nicht...
     2. Wie kann ich den Seitenrand einstellen?
     3. Wie kann ich Form2(Später MDI CHild) so anpassen, dass es beim Drucken genau eine A4 Seite wird?
    LG Yves Riedener
    Donnerstag, 5. November 2009 14:50

Antworten

  •  
    Hallo Yves,

    zu 1.)

    PrintForm1.Print(Me.ActiveMdiChild, PowerPacks.Printing.PrintForm.PrintOption.CompatibleModeClientAreaOnly)

    Siehe auch den Hinweis unter:

    Gewusst wie: Drucken des Clientbereichs eines Formulars (Visual Basic)
    http://msdn.microsoft.com/de-de/library/bb629256.aspx

    zu 2.)

    Folgendes Beispiel legt die Seitenränder auf 1cm fest:
      Private Sub PrintForm1_QueryPageSettings(ByVal sender As Object, _
             ByVal e As System.Drawing.Printing.QueryPageSettingsEventArgs) Handles PrintForm1.QueryPageSettings
    
        Dim lMargin As Integer = CInt((1 / 2.54) * 100)
        With e.PageSettings.Margins
          .Top = lMargin - CInt(e.PageSettings.HardMarginY)
          .Left = lMargin - CInt(e.PageSettings.HardMarginX)
          .Right = lMargin
          .Bottom = lMargin
        End With
      End Sub

    zu 3.)

    Muss ich leider passen.

    Thorsten Dörfler
    Microsoft MVP Visual Basic
    Donnerstag, 5. November 2009 20:06
    Moderator

Alle Antworten

  •  
    Hallo Yves,

    zu 1.)

    PrintForm1.Print(Me.ActiveMdiChild, PowerPacks.Printing.PrintForm.PrintOption.CompatibleModeClientAreaOnly)

    Siehe auch den Hinweis unter:

    Gewusst wie: Drucken des Clientbereichs eines Formulars (Visual Basic)
    http://msdn.microsoft.com/de-de/library/bb629256.aspx

    zu 2.)

    Folgendes Beispiel legt die Seitenränder auf 1cm fest:
      Private Sub PrintForm1_QueryPageSettings(ByVal sender As Object, _
             ByVal e As System.Drawing.Printing.QueryPageSettingsEventArgs) Handles PrintForm1.QueryPageSettings
    
        Dim lMargin As Integer = CInt((1 / 2.54) * 100)
        With e.PageSettings.Margins
          .Top = lMargin - CInt(e.PageSettings.HardMarginY)
          .Left = lMargin - CInt(e.PageSettings.HardMarginX)
          .Right = lMargin
          .Bottom = lMargin
        End With
      End Sub

    zu 3.)

    Muss ich leider passen.

    Thorsten Dörfler
    Microsoft MVP Visual Basic
    Donnerstag, 5. November 2009 20:06
    Moderator
  • Danke habe den Fehler gefunden:

    PrintForm1.Print(Me.ActiveMdiChild, PowerPacks.Printing.PrintForm.PrintOption.CompatibleModeClientAreaOnly)

    Statt:

    PrintForm1.Print(Me.ActiveMdiChild, PowerPacks.Printing.PrintForm.PrintOption.ClientAreaOnly)
    LG Yves Riedener
    Montag, 9. November 2009 15:46
  • Doch es gibt noch ein Problem! Denn wenn ich CompatibleModeClientAreaOnly nehme kommt nur das was Man sieht, das gescrollte kommt nicht und man sieht den Textstrich! Wenn ich aber dann Scrollable nehme sieht man den Text wieder nich! Und beides kann ich nicht nehmen.
    Was muss ich tun?

    LG Yves Riedener
    Freitag, 13. November 2009 15:27
  • Hallo Yves,

    Was must Du tun? Dich von dem Gedanken verabschieden, Dein Formular, das für die Darstellung am Bildschirm optimiert ist, unverändert auf einem Drucker ausgeben zu können, der eine weit höhere Auflösung unterstützt.

    Das Framework hält hier einige passende Komponenten bereit, die Du nutzen kannst. Ein Beispiel:
    http://www.startvbdotnet.com/controls/printdialog.aspx

    Ich weiß leider nicht, was Du auf Deinem zu druckenden Formular darstellst. Aber ggf. gibt es hier noch andere Alternativen, z.B. in Form von Reports


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    Freitag, 13. November 2009 20:59
    Moderator
  • Auf meinem, zu druckenden Formular hat es 6 Bilder und 6 Textboxen, nicht mehr und nicht weniger. 2x3
    Könnte man das vielleicht manuell mit einem Code machen?

    LG Yves Riedener
    Samstag, 14. November 2009 11:21
  • Hallo Yves,

    das Drucken ist auch für gestandene Entwickler immer wieder ein leidiges Thema. Klar geht das, aber das ist mit sehr viel Aufwand verbunden. Einen ersten Eindruck davon vermittelt dir übrigens der von Thorsten genannte Link - und es ist wirklich nur ein erster Eindruck.

    Um individuell zu Drucken, musst du die Druckausgabe als Graphics selbst zeichnen. Dann musst du dich mit solchen Fragen beschäftigen wie "wann mache ich einen Zeilenumbruch?", was nämlich nicht automatisch passiert. Du musst die Auflösung des Bildschirms auf den Drucker umrechnen, Font-Objekte erstellen, mit MeasureString überprüfen, wieviel Platz der Text auf dem Papier einnehmen wird, und und und...

    Insofern: Ja, das kann man manuell mit Code machen.

    Das einfachste ist sicherlich - wie von Thorsten bereits angedeutet - die Reports dafür zu verwenden. Das wird dir aber leider auch nicht ohne weiteres gelingen. Neben den Grundlagen musst du dich für die Reports zuvor auch mit ADO.NET und insbesondere den DataSets auseinander setzen.

    Viele Grüße
    Jan
    Samstag, 14. November 2009 11:38