none
Problema con la stampa in VB RRS feed

  • Domanda

  • Ciao a tutti,
    purtroppo in giro non ho trovato nulla e mi chiedevo se eravate in grado di darmi una soluzione. (sicuramente!! :-))

    Il mio problema è nella stampa in più pagine di un elenco in VB

    Quando apro il mio programma e inizio la stampa tutto funziona correttamente. vengono create le pagine necessarie ed è tutto ok.

    Se però, senza far nulla, ristampo lo stesso elenco, questa volte le pagine non vengono create e tutto viene sovrascritto nella prima pagina!! se chiudo il programma e lo riapro tutto rifunziona correttamente la prima volta la dalla seconda volta in poi ho lo stesso problema.

    Cosa può essere secondo te? qualche buffer da resettare? ma quale?

    Poi come ultima cosa ho notato che se invece di stampare diretto, eseguo l'anteprima di stampa, la visualizzazione è ok, però se avvio la stampa da lì mi stampa la pagina bianca..
    l'istruzione nell'evento printpage le esegue ma non capisco perchè non le scrive sul foglio.

    Vi sarei grato se mi detei una soluzione a questi due problemi perchè non so più dove sbattere la testa!!

    Vi ringrazio

    Stefano
    sabato 4 dicembre 2010 13:39

Risposte

  • Questo codice potrebbe aiutarti ?

    Public Class Form1
      Dim RighePerPagina As Integer = 60
      Dim RigheStampate As Integer = 0
      Dim TotaleRigheDaStampare As Integer = 0
    
      Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        PrintPreviewDialog1.Show()
      End Sub
    
      Private Sub PrintDocument1_BeginPrint(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintEventArgs) Handles PrintDocument1.BeginPrint
        RigheStampate = 0
    
      End Sub
    
    
      Private Sub PrintDocument1_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
        Dim riga As String = ""
    
        For t = 0 To RighePerPagina - 1
    
          riga = PrelevaRigaDaStampare()
    
          If riga = "fine elenco" Then Exit For
    
          e.Graphics.DrawString(riga, New Font("arial", 10), Brushes.Black, 0, t * 15)
    
          RigheStampate = RigheStampate + 1
    
        Next
    
        If riga = "fine elenco" Then
          e.HasMorePages = False
        Else
          e.HasMorePages = True
          'qui si potrebbe inserire un contatore di pagine...
        End If
    
    
      End Sub
    
      Function PrelevaRigaDaStampare() As String
    
        If RigheStampate < 123 Then
          Return (RigheStampate).ToString.PadLeft(3, "0") & "  XXXXXXXXXXXXXXXXXXXXX  xxxx   xxxxxxxxxxxx"
        Else
          Return "fine elenco"
        End If
    
      End Function
    End Class
    
    

    in pratica l'ogetto PrintDocument genera l'evento printpage, il gestore di questo evento mette a disposizione un ogetto graphics che sarebbe in questo caso il foglio della stampante predefinita.

    in questo esempio il fatto che la stampa inizi sempre dalla prima riga che si faccia il preview o che si lanci la stampa sulla stampante o si invochi il metoto .print dal codice, è assicurato dal reset che avviene nel gestore beginprint

    Spero di esserti stato di aiuto. Ciao.


    mario formosa
    lunedì 6 dicembre 2010 17:17

Tutte le risposte

  • Ciao Steve4891,

    per prima cosa ci dovresti spiegare come esegui (codice) la stampa dal tuo applicativo.

    Senza questa informazione difficilmente qualcuno potrà aiutarti visto che ci sono 1000 modi per stampare da un applicativo VB compreso utilizzo di componenti di 2' parti.

    Ciao


    Renato Marzaro  MVP Visual Basic

    http://community.visual-basic.it/renato

    domenica 5 dicembre 2010 18:44
    Moderatore
  • Questo codice potrebbe aiutarti ?

    Public Class Form1
      Dim RighePerPagina As Integer = 60
      Dim RigheStampate As Integer = 0
      Dim TotaleRigheDaStampare As Integer = 0
    
      Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        PrintPreviewDialog1.Show()
      End Sub
    
      Private Sub PrintDocument1_BeginPrint(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintEventArgs) Handles PrintDocument1.BeginPrint
        RigheStampate = 0
    
      End Sub
    
    
      Private Sub PrintDocument1_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
        Dim riga As String = ""
    
        For t = 0 To RighePerPagina - 1
    
          riga = PrelevaRigaDaStampare()
    
          If riga = "fine elenco" Then Exit For
    
          e.Graphics.DrawString(riga, New Font("arial", 10), Brushes.Black, 0, t * 15)
    
          RigheStampate = RigheStampate + 1
    
        Next
    
        If riga = "fine elenco" Then
          e.HasMorePages = False
        Else
          e.HasMorePages = True
          'qui si potrebbe inserire un contatore di pagine...
        End If
    
    
      End Sub
    
      Function PrelevaRigaDaStampare() As String
    
        If RigheStampate < 123 Then
          Return (RigheStampate).ToString.PadLeft(3, "0") & "  XXXXXXXXXXXXXXXXXXXXX  xxxx   xxxxxxxxxxxx"
        Else
          Return "fine elenco"
        End If
    
      End Function
    End Class
    
    

    in pratica l'ogetto PrintDocument genera l'evento printpage, il gestore di questo evento mette a disposizione un ogetto graphics che sarebbe in questo caso il foglio della stampante predefinita.

    in questo esempio il fatto che la stampa inizi sempre dalla prima riga che si faccia il preview o che si lanci la stampa sulla stampante o si invochi il metoto .print dal codice, è assicurato dal reset che avviene nel gestore beginprint

    Spero di esserti stato di aiuto. Ciao.


    mario formosa
    lunedì 6 dicembre 2010 17:17