Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2008
    Messaggi
    13

    VB 6 Problema di stampa

    Buongiorno a tutti,
    Premesso che sto usando un controllo data e una DBGrid, ho un probema nella stampa
    Per quanto riguarda le righe orrizzontali tutto funziona...nelle righe verticali no.
    Non le impacca come dovrebbe, mi fa solo alcune righe nel mezzo del testo...Perchè?
    So che sto sbagliano qualche cosa ma non capisco dove.
    Vi posto il codice, sperando aver capito come si fa
    Se c'è qualcuno che riesce a capire dove sbaglio!
    Grazie


    codice:
    Function pad1(stringa As String, lung As Integer) As String
      pad1 = Left$(stringa & Space(lung), lung)
    End Function
    
    Function valida(dato As Variant) As String
    Select Case VarType(dato)
      Case vbNull: valida = vbNullString
      Case vbInteger: valida = CStr(dato)
      Case Else: valida = dato
      End Select
    End Function
    
    Private Sub Stampa()
    Screen.MousePointer = vbHourglass
    Dim aColWidth(10) As Integer, aPosVLine(10) As Integer
    Dim sHeader As String, bar As String, riga As String
    Dim ws As Workspace, db As Database, tb As Recordset
    Dim i, msup, msin, mdes, colx As Integer
    Dim maxr, rec, righe, pag As Integer
    
    bar = Chr(32)
    
    For i = 0 To 10
      aColWidth(i) = CInt(Array(15, 15, 18, 16, 8, 8, 15, 8, 11, 11, 18)(i))
         sHeader = sHeader + bar + pad1(DBGrid1.Columns(i).Caption, aColWidth(i))
           aPosVLine(i) = msin + aColWidth(i) + 1
           msin = aPosVLine(i)
      Next
    
     Set ws = DBEngine(0)
      Set db = ws.OpenDatabase(Data1.DatabaseName)
      Set tb = db.OpenRecordset(Data1.RecordSource)
      tb.MoveLast
      tb.MoveFirst
    
      Printer.Orientation = vbPRORPortrait
      Printer.FontName = "Courier"
      Printer.FontSize = 10
      Printer.ScaleMode = vbCharacters
      mdes = Int(Printer.ScaleWidth)
      maxr = Int(Printer.ScaleHeight) - 10
      
    If maxr > tb.RecordCount Then maxr = tb.RecordCount
    
      msin = (mdes - Len(sHeader)) / 2
      colx = msin + 1
      
      For pag = 1 To tb.RecordCount Step maxr
      
      Printer.CurrentY = 1
      Printer.Print Tab(colx); DBGrid1.Caption; " (pagina"; Str(pag \ maxr + 1); ")"
      Printer.Print
      
      msup = Printer.CurrentY + 1
      
    If tb.RecordCount - righe < maxr Then maxr = tb.RecordCount - righe
      Printer.CurrentY = msup + 0.04
      Printer.Print Tab(colx); sHeader
      Printer.CurrentY = Printer.CurrentY + 0.04
      Printer.Print
      
    For rec = 1 To maxr
       riga = ""
    
    For i = 0 To tb.Fields.Count - 1
      riga = riga + bar + pad1(valida(tb.Fields(i)), aColWidth(i))
    Next i
    
    Printer.CurrentY = Printer.CurrentY + 0.04
      Printer.Print Tab(colx); riga
      righe = righe + 1
      tb.MoveNext
    Next rec
    
    Printer.Line (msin, msup)-Step(Len(sHeader), 1), , B
    
    For i = 1 To maxr
      Printer.Line (msin, msup + i + 1)-Step(Len(sHeader), 1), , B
    Next i
    
    For i = 0 To tb.Fields.Count - 2
      Printer.Line (msin + aPosVLine(i), msup)-Step(0, maxr + 2)
    Next i
    
    Printer.NewPage
      Next pag
      
    Printer.EndDoc
    
    tb.Close
    db.Close
    Set tb = Nothing
    Set db = Nothing
    Set ws = Nothing
      Screen.MousePointer = vbDefault
    
    End Sub

  2. #2
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    1 - Errori nelle dichiarazioni
    codice:
    Dim i, msup, msin, mdes, colx As Integer
    Dim maxr, rec, righe, pag As Integer
    escluso colx e pag sono dichiarate tutte Variant, che non è proprio il massimo

    2 - Manca un qualsiasi commento (!!!)
    Così per sapere cosa fa il codice occorre studiarselo riga per riga.
    Nemmeno nelle dichiarazioni, così non si sa a cosa servano le variabili

    3 - Identazione praticamente inesistente!
    il codice è poco leggibile, quindi poco comprensibile.

    Ti suggerisco di tenere più in ordine nel codice.

    A parte questo, se questa riga:
    Printer.CurrentY = Printer.CurrentY + 0.04
    è quella che determina la riga in cui stampare, allora è sbagliata.

    Dovresti aumentare l'altezza in base al carattere che hai impostato nell'oggetto Printer, ovvero:

    codice:
    Printer.CurrentY = Printer.CurrentY + Printer.TextHeight("Aq")
    Se non risolvi, sarebbe utile avere uno screenshot del risultato di stampa, così da capire bene cosa succede.


  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2008
    Messaggi
    13

    riprovo con qualche commento

    Grazie Gibra, ti riposto il codice con qualche commento. Fatto veloce perchè devo uscire.
    Merto una tirata di orecchi si per come indento il codice...fa un po' pena, vedrò di migliorare.
    Per quanto riguarda la stampa, purtroppo ci sono su dei nomi e non credo sia il caso di farla vedere qui, se la vuoi vedere ne scanerizzo una in pdf e te la mando in pvt.
    Dimmi tu, ho provato come mi hai detto ma mi salta un sacco di righe orrizontali, dove non ho problemi e le verticali rimangono sempre sopra i testi e completamente sfasate come se la funzione pad1 non impaccasse.

    Grazie

    codice:
    Function pad1(stringa As String, lung As Integer) As String
      pad1 = Left$(stringa & Space(lung), lung)
    End Function
    
    Function valida(dato As Variant) As String
    Select Case VarType(dato)
      Case vbNull: valida = vbNullString
      Case vbInteger: valida = CStr(dato)
      Case Else: valida = dato
      End Select
    End Function
    
    Private Sub Stampa()
    Screen.MousePointer = vbHourglass
    Dim aColWidth(10) As Integer, aPosVLine(10) As Integer
    Dim sHeader As String, bar As String, riga As String
    Dim ws As Workspace, db As Database, tb As Recordset
    Dim i As Integer, msup As Integer, msin As Integer, mdes As Integer, colx As Integer
    Dim maxr As Integer, rec As Integer, righe As Integer, pag As Integer
    
    bar = Chr(32)                ‘carattere spazio, per lasciare spazio alle barre verticali della griglia
    
    For i = 0 To 10
      aColWidth(i) = CInt(Array(15, 15, 18, 16, 8, 8, 15, 8, 11, 11, 18)(i))  ‘Definisco largheza delle colonne 
         sHeader = sHeader + bar + pad1(DBGrid1.Columns(i).Caption, aColWidth(i))       ‘uso la larghezza appena impostata aColWidth(i) per costruire il  pezzo dell'intestazione delle colonne e la passo a pad1 che dovrebbe impaccare….ma !!
           aPosVLine(i) = msin + aColWidth(i) + 1 ‘corrispondente posizione di colonna per le linee verticali
           msin = aPosVLine(i)
      Next
    
     Set ws = DBEngine(0)                                                                     ‘proprietà del controllo Data
      Set db = ws.OpenDatabase(Data1.DatabaseName)
      Set tb = db.OpenRecordset(Data1.RecordSource)
      tb.MoveLast
      tb.MoveFirst
    
      Printer.Orientation = vbPRORPortrait                                              ‘proprietà della stampante
      Printer.FontName = "Courier"
      Printer.FontSize = 10
      Printer.ScaleMode = vbCharacters
      mdes = Int(Printer.ScaleWidth)
      maxr = Int(Printer.ScaleHeight) - 10
      
    If maxr > tb.RecordCount Then maxr = tb.RecordCount     ‘controllo che il numero massimo di righe non sia superiore al numero di records 
    
    
      msin = (mdes - Len(sHeader)) / 2         ‘trovo il margine sinistro e (Destro) anche se non importerebbe
      colx = msin + 1
      
      For pag = 1 To tb.RecordCount Step maxr       ‘ciclo di stampa, pagina per pagina, impostando il passo sul massimo numero di righe-record stampabili
      
      Printer.CurrentY = 1
      Printer.Print Tab(colx); DBGrid1.Caption; " (pagina"; Str(pag \ maxr + 1); ")"
      Printer.Print
    ‘  salto le due righe di margine superiore e mi posiziono sulla terza riga, dove scrivo la Caption del controllo Data e il numero di pagina, ricavandolo con un calcolo basato sull'indice del ciclo, poi salto una riga.
      
      msup = Printer.CurrentY + 1
      
    If tb.RecordCount - righe < maxr Then maxr = tb.RecordCount - righe
      Printer.CurrentY = msup + 0.04
      Printer.Print Tab(colx); sHeader
      Printer.CurrentY = Printer.CurrentY + 0.04
      Printer.Print
    ‘prima di stampare ogni riga posiziono la testina un po' sotto la posizione attuale per non sovrapporre righe di record a linee di griglia
      
    For rec = 1 To maxr     ‘‘ciclo di stampa dei records contenibili nella pagina 
       riga = ""
    
    For i = 0 To tb.Fields.Count - 1
      riga = riga + bar + pad1(valida(tb.Fields(i)), aColWidth(i))
    Next i
    ‘costruisco la riga aggiungendole lo spazio bar per la fincatura verticale e il dato contenuto nel campo corrente del record corrente, dopo averlo validato con la funzione valida ed impaccato secondo la larghezza della colonna corrispondente con la funzione padl
    
    Printer.CurrentY = Printer.CurrentY + 0.04          ‘routine di stampa
      Printer.Print Tab(colx); riga
      righe = righe + 1
      tb.MoveNext
    Next rec
    
    Printer.Line (msin, msup)-Step(Len(sHeader), 1), , B   ‘rettangolo attorno all'intestazione
    
    For i = 1 To maxr 
    Printer.Line (msin, msup + i + 1)-Step(Len(sHeader), 1), , B  ‘disegno i rettangoli attorno ad ogni riga 
    Next i
    
    For i = 0 To tb.Fields.Count – 2     ‘ qui dovrei disegnare le lineee verticali ma!
      Printer.Line (msin + aPosVLine(i), msup)-Step(0, maxr + 2)
    Next i
    
    Printer.NewPage
      Next pag
      
    Printer.EndDoc
    
    tb.Close
    db.Close
    Set tb = Nothing
    Set db = Nothing
    Set ws = Nothing
      Screen.MousePointer = vbDefault
    
    End Sub

  4. #4
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Fai un'immagine , copri i nomi e postala così vediamo cosa succede.

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2008
    Messaggi
    13

    Stampa

    Buongiorno,
    Ho inserito nella tabella nomi fittizzi che mi sono inventato li per li, chiedo scusa se ho messo il nome di qualcuno. Non era voluto.
    Gibra allego l,immagine e spero tu riesca a capire dove sto sbagliano, perchè io proprio non lo vedo...Forse divento vecchio e poi non sono proprio una cima anche perchè non è da molto che mi diverto con il vb6...Pensa che poi vorrei passare a vb net...Che disastri!!
    Grazie
    Immagini allegate Immagini allegate

  6. #6
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244

    Re: Stampa

    Originariamente inviato da Pepe27
    Buongiorno,
    Ho inserito nella tabella nomi fittizzi che mi sono inventato li per li, chiedo scusa se ho messo il nome di qualcuno. Non era voluto.
    Gibra allego l,immagine e spero tu riesca a capire dove sto sbagliano, perchè io proprio non lo vedo...
    Per forza non capivo!
    Tu avevi scritto, nel tuo primo post
    Originariamente inviato da Pepe27
    Non le impacca come dovrebbe, mi fa solo alcune righe nel mezzo del testo...Perchè?
    Quindi io pensavo che il problema fosse nelle righe, invece ce l'hai nelle colonne!

    Premetto che il codice bisognerebbe provarlo,
    probabilmente il problema sta nel codice che crea la riga:

    codice:
    For i = 0 To tb.Fields.Count - 1
      riga = riga + bar + pad1(valida(tb.Fields(i)), aColWidth(i))
    Next i
    infatti c'è una enorme discrepanza tra le righe verticali, ed i dati nelle colonne,

    Ma è difficile capire bene il motivo senza testarlo direttamente.

    L'unica cosa che ti conviene fare è il debug del codice istruzione per istruzione (F8) e valutare il risultato delle variabili in gioco; non vedo altra soluzione.

    Quando usavo routine di stampa 'custom' come la tua io usavo un'altro modo di creare la riga, più o meno la logica era questa:
    1. Definivo tutte le X di ogni colonna: X1=n, X2=n, X3=n, ....
    2. stampavo la riga verticale sull'X1, X2, X3, ...
    3. stampavo il dato allineandolo:
    ..... per le stringhe, a sinistra: X1+1, X2+1, X3+1, ...
    ..... per i numeri, a destra calcolando la colonna successiva: X2-1, X3-1, X4-1, ...

    Ma parliamo di secoli fa!

    Ora uso i Report, cosa che ti consiglio di adottare il più presto possibile.
    Perchè non usi CrystalReport? Ce l'hai già a gratis.


  7. #7
    Utente di HTML.it
    Registrato dal
    Mar 2008
    Messaggi
    13

    Controllerò

    Grazie Gibra, vedrò di sistemarlo e.....Se riesco posto qui.
    Crystal non l'ho usato perchè mi sono voluto imbarcaare così.
    Provo ancora e se proprio non riesco mi arrendo.
    Ciao

  8. #8
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244

    Re: Controllerò

    Originariamente inviato da Pepe27
    Grazie Gibra, vedrò di sistemarlo e.....Se riesco posto qui.
    Se fai il debug del codice vedrai che sistemi di certo.
    Ti darei volentieri una mano, ma non ho il database e non uso DAO da secoli!
    Se riesci a 'zippare' un progettino-ino con un db di dati fasulli potrei darci un'occhiata.

    Originariamente inviato da Pepe27
    Crystal non l'ho usato perchè mi sono voluto imbarcaare così.
    Provo ancora e se proprio non riesco mi arrendo.
    In ogni caso, con CrystalReport sei anni luce più avanti rispetto ad un metodo 'custom'.
    Ciò vale anche se usi la versione 4.6 (quella in dotazione a VB).


  9. #9
    Utente di HTML.it
    Registrato dal
    Mar 2008
    Messaggi
    13

    Grazie

    Grazie gibra, sei gentilissimo, ho tolto tutto e ti ho fatto uno zip del necessario.
    Intanto io provo anche se lo ho passato un milione di volte e non vedo nulla.
    Come te lo mando?
    Ciao

  10. #10

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.