+ Rispondi al messaggio
Visualizzazione dei risultati da 1 a 8 su 8

Problema - stampa 2 copie

  1. #1
    SirNino non è in linea Scolaretto
    Buonasera a tutti, ho un problema (che son sicuro sarà una stupidata ma ci sto perdendo la vista da stamattina....

    Il seguente codice dovrebbe stampare una fattura in doppia copia, la stampa è corretta ma non mi stampa la seconda copia qualcuno mi potrebbe aiutare?

    Public Sub stampa_fattura()
    libero = FreeFile
    With Main
    On Error GoTo annulato21
    .CommonDialog1.CancelError = True
    .CommonDialog1.ShowPrinter
    Printer.ScaleMode = vbCentimeters  ' imposta la scala delle misure in centimetri
    Printer.DrawWidth = 2
    
    Open App.Path & "\fatt.txt" For Input As #libero
    Input #libero, stringa
    fatt = stringa + 1
    Close #libero
    Open App.Path & "\fatt.txt" For Output As #libero
    Print #libero, fatt
    Close #libero
    
    'If .ristampa = True Then
    '    Printer.Copies = 1
    '    .ristampa = False
    'Else
        Printer.Copies = 2
    'End If
    
    
    
    '  ###########################  INIZIO STAMPA FATTURA  ################################
    Set mypict = LoadPicture(App.Path & "\logo.jpg") '  abbina l'indirizzo di una immagine ad una variabile
    Printer.PaintPicture mypict, 0.7, 0.1, Printer.ScaleX(7.5, vbCentimeters, Printer.ScaleMode), Printer.ScaleY(3, vbCentimeters, Printer.ScaleMode)
    Printer.Font = "Abtechia": Printer.FontBold = True: Printer.FontSize = 14
    Printer.CurrentX = 1: Printer.CurrentY = 3.4: Printer.Print .Text21.Text
    Printer.Font = "arial black": Printer.FontBold = False: Printer.FontSize = 9
    Printer.CurrentX = 1: Printer.CurrentY = 3.9: Printer.Print .Text22.Text
    Printer.CurrentX = 1: Printer.CurrentY = 4.4: Printer.Print .Text23.Text
    Printer.CurrentX = 1: Printer.CurrentY = 4.9: Printer.Print .Text24.Text & " - " & .Text25.Text
    Printer.CurrentX = 1: Printer.CurrentY = 5.4: Printer.Print "Tel: " & .Text26.Text & " - Fax: " & .Text27.Text
    Printer.CurrentX = 1: Printer.CurrentY = 5.9: Printer.Print "Email: " & .Text28.Text
    Printer.Line (11.7, 0.3)-(19, 0.3): Printer.Line (11.7, 1.3)-(19, 1.3)
    Printer.Line (11.7, 0.3)-(11.7, 1.3): Printer.Line (19, 0.3)-(19, 1.3): Printer.Line (15.5, 0.3)-(15.5, 1.3)
    Printer.Line (11.7, 1.5)-(19, 1.5): Printer.Line (11.7, 5.5)-(19, 5.5)
    Printer.Line (11.7, 1.5)-(11.7, 5.5): Printer.Line (19, 1.5)-(19, 5.5)
    
    Printer.Line (0.5, 6.5)-(20, 6.5)
    Printer.Font = "arial": Printer.FontSize = 5
    Printer.CurrentX = 11.8: Printer.CurrentY = 1.6: Printer.Print "DESTINATARIO"
    Printer.CurrentX = 11.8: Printer.CurrentY = 0.4: Printer.Print "FATTURA N°"
    Printer.CurrentX = 15.6: Printer.CurrentY = 0.4: Printer.Print "DATA"
    Printer.CurrentX = 1.2: Printer.CurrentY = 25.5: Printer.Print "IL RAPPRESENTANTE"
    Printer.CurrentX = 6.2: Printer.CurrentY = 25.5: Printer.Print "IL DESTINATARIO"
    Printer.CurrentX = 11.6: Printer.CurrentY = 25.5: Printer.Print "N° COLLI"
    Printer.CurrentX = 15.6: Printer.CurrentY = 25.5: Printer.Print "DATA INIZIO TRASPORTO"
    Printer.CurrentX = 11.6: Printer.CurrentY = 27.1: Printer.Print "VETTORE"
    
    
    
    '    ###################   INSERIMENTO DATI
    Printer.Line (1, 8)-(19.5, 8): Printer.Line (4, 8)-(4, 9)
    
    Printer.Line (1, 9)-(19.5, 9): Printer.Line (1, 9.5)-(19.5, 9.5)
    Printer.Line (1, 8)-(1, 23.5): Printer.Line (19.5, 8)-(19.5, 23.5)
    Printer.Line (18.5, 9)-(18.5, 23.5): Printer.Line (16, 8)-(16, 23.5)
    Printer.Line (13.5, 8)-(13.5, 23.5): Printer.Line (11.5, 8)-(11.5, 23.5)
    Printer.Line (1, 23.5)-(19.5, 23.5)
    Printer.FontSize = 6: Printer.FontBold = True
    Printer.CurrentX = 5: Printer.CurrentY = 9.1: Printer.Print "DESCRIZIONE"
    Printer.CurrentX = 11.8: Printer.CurrentY = 9.1: Printer.Print "QUANTITA'"
    Printer.CurrentX = 13.7: Printer.CurrentY = 9.1: Printer.Print "PREZZO UNITARIO"
    Printer.CurrentX = 16.2: Printer.CurrentY = 9.1: Printer.Print "IMPORTO TOTALE"
    Printer.CurrentX = 18.6: Printer.CurrentY = 9.1: Printer.Print "C.IVA"
    Printer.FontBold = False: Printer.FontSize = 8
    
    cuy = 10
    
    If .converti_ddt = True Then GoTo dopo
    For X = 0 To .List2.ListCount - 1
    Printer.CurrentX = 1.2: Printer.CurrentY = cuy: Printer.Print .List2.List(X)
    Printer.CurrentX = 12: Printer.CurrentY = cuy: Printer.Print .List3.List(X)
    Printer.CurrentX = 13.9: Printer.CurrentY = cuy: Printer.Print .List4.List(X)
    Printer.CurrentX = 16.4: Printer.CurrentY = cuy: Printer.Print .List5.List(X)
    Printer.CurrentX = 18.8: Printer.CurrentY = cuy: Printer.Print "20"
    cuy = cuy + 0.4
    Next X
    GoTo continua
    dopo:
    For X = 0 To .List17.ListCount - 1
    Printer.CurrentX = 1.2: Printer.CurrentY = cuy: Printer.Print .List17.List(X)
    Printer.CurrentX = 12: Printer.CurrentY = cuy: Printer.Print .List18.List(X)
    Printer.CurrentX = 13.9: Printer.CurrentY = cuy: Printer.Print .List19.List(X)
    Printer.CurrentX = 16.4: Printer.CurrentY = cuy: Printer.Print .List20.List(X)
    Printer.CurrentX = 18.8: Printer.CurrentY = cuy: Printer.Print "20"
    cuy = cuy + 0.4
    Next X
    continua:
    
    
    Printer.Line (11.5, 24)-(19.5, 24): Printer.Line (11.5, 25)-(19.5, 25)
    Printer.Line (19.5, 24)-(19.5, 25): Printer.Line (11.5, 24)-(11.5, 25)
    Printer.Line (14.5, 24)-(14.5, 25): Printer.Line (17, 24)-(17, 25)
    
    Printer.FontSize = 5
    Printer.CurrentX = 11.6: Printer.CurrentY = 24.1: Printer.Print "IMPONIBILE"
    Printer.CurrentX = 14.6: Printer.CurrentY = 24.1: Printer.Print "IVA"
    Printer.CurrentX = 17.1: Printer.CurrentY = 24.1: Printer.Print "TOTALE"
    Printer.CurrentX = 11.8: Printer.CurrentY = 8.1: Printer.Print "ABI"
    Printer.CurrentX = 13.7: Printer.CurrentY = 8.1: Printer.Print "CAB"
    Printer.CurrentX = 16.2: Printer.CurrentY = 8.1: Printer.Print "C/C"
    Printer.CurrentX = 1.2: Printer.CurrentY = 8.1: Printer.Print "TIPO DI PAGAMENTO"
    Printer.CurrentX = 4.1: Printer.CurrentY = 8.1: Printer.Print "BANCA D'APPOGGIO"
    
    
    Printer.FontSize = 10
    If .converti_ddt = True Then GoTo poi
    Printer.CurrentX = 12: Printer.CurrentY = 24.5: Printer.Print Format(.Label_ivaesclusa, "0.00")
    Printer.CurrentX = 15: Printer.CurrentY = 24.5: Printer.Print Format((.Label_ivainclusa - .Label_ivaesclusa), "0.00")
    Printer.FontBold = True
    Printer.CurrentX = 17.5: Printer.CurrentY = 24.5: Printer.Print Format(.Label_ivainclusa, "0.00")
    
    GoTo poii
    poi:
    Printer.CurrentX = 12: Printer.CurrentY = 24.5: Printer.Print Format(.Label_ivaesclusaddt, "0.00")
    Printer.CurrentX = 15: Printer.CurrentY = 24.5: Printer.Print Format((.Label_ivainclusaddt - .Label_ivaesclusaddt), "0.00")
    Printer.FontBold = True
    Printer.CurrentX = 17.5: Printer.CurrentY = 24.5: Printer.Print Format(.Label_ivainclusaddt, "0.00")
    
    poii:
    
    Printer.CurrentX = 12: Printer.CurrentY = 0.8: Printer.Print Format(fatt, "0000")
    Printer.CurrentX = 15.8: Printer.CurrentY = 0.8: Printer.Print Date
    Printer.FontBold = False
    Printer.Line (1, 28.5)-(11, 28.5): Printer.Line (1, 25.3)-(11, 25.3)
    Printer.Line (1, 28.5)-(1, 25.3): Printer.Line (11, 25.3)-(11, 28.5): Printer.Line (6, 25.3)-(6, 28.5)
    Printer.Line (11.5, 25.3)-(19.5, 25.3): Printer.Line (11.5, 28.5)-(19.5, 28.5)
    Printer.Line (11.5, 25.3)-(11.5, 28.5): Printer.Line (19.5, 25.3)-(19.5, 28.5)
    Printer.Line (11.5, 26.9)-(19.5, 26.9): Printer.Line (15.5, 25.3)-(15.5, 26.9)
    
    
    stampa_intestazione
    Printer.EndDoc
    salvataggio_fatture
    annulato21:
    End With
    
    End Sub
    
    ho inserito tutto il codice per essere sicuro che non ci sian o altri frammenti in giro che vadano ad interferire (anche se dubito!!).

    grazie in anticipo.
    ℹ️ Leggi di più su SirNino ...

  2. #2
    Wally non è in linea Scolaretto
    Qui c'è un errore di fondo... non sono andato a leggere approfonditamente il tuo codice ma posso dirti che stai utilizzando un approccio assolutamente errato!
    Hai strutturato il codice in maniera obsoleta (utilizzare i Goto è quanto di più sconsigliabile esista).
    Creati una funzione con all'interno il codice per la stampa di una singola copia e poi, a seconda del numero di copie da stampare, richiama n volte tale funzione.
    Prova ad impostare il tutto e, nel caso di problemi, rivediamo insieme.
    ℹ️ Leggi di più su Wally ...

  3. #3
    L'avatar di gibra
    gibra ora è in linea Very Important Person
    Utilizzando esclusivamente l'oggetto Printer, a me stampa 2 copie.
    Esempio

        Printer.Copies = 2
     
        Printer.Print
        Printer.Font.Bold = True
        Printer.Font.Size = 40
        Printer.Print "Prova"
        Printer.EndDoc
    
    Però vedo che usi anche il CommonDialog, e se stai cercando di condividere le informazioni tra i due oggetti non funziona.
    Funzionava fino a Windows Me, poi nisba.

    Leggi questo articolo.
    PRB: Behavior Differences of Print Dialog Box on Different Platforms

    Altri articoli utili in tal senso
    How To Retrieve Settings From a Printer Driver
    HOW TO: Raise and Control Print Dialog Boxes from Visual Basic


    Ciao
    ℹ️ Leggi di più su gibra ...

  4. #4
    SirNino non è in linea Scolaretto
    @ Gibra:
    Grazie, in effetti nel frattempo mi sono messo un pò nell'ottica di modificarlo ed ho tolto il commondialog in maniera da stampare direttamente sulla stampante predefinita e forse mi torna anche meno problematico e veloce (dato che con la stessa routin dovrei poter stampare anche 20-100 documenti diversi contemporaneamente gestiti da un ciclo for ).
    La cosa strana però è che lo stesso listato (apparte alcune aggiunte di alcune righe e campi di testo) lo uso su un altro programma - col commondialog - e funziona perfettamente (per questo poi ho postato tutto il codice perchè non vorrei aver aggiunto qualcosa - che non capisco/vedo/trovo - che va ad inteferire col printer.copies

    VORREI COMUNQUE AGGIUNGERE CHE ANCHE TOGLIENDO IL COMMONDIALOG E IMPOSTANDO PRINTER.COPIES = 2 ME NE STAMPA UNA SOLA.

    @ Wally:
    Ti ringrazio per il consiglio (a cui avevo pensato anch'io ) ma credo che se c'è una proprietà impostabile sia più corretto in termini di programmazione sfruttarla invece che cercare dei ripieghi. Ho sempre avuto il problema di creare listati molto disordinati poi quando mi è capitato di correggere un listato di altre persone e mi sono accorto della difficoltà nel leggerlo ho iniziato a provare a mettere un pò le cose in ordine. quindi se fosse possibile preferirei sfruttare la proprietà.

    Hai strutturato il codice in maniera obsoleta (utilizzare i Goto è quanto di più sconsigliabile esista).
    Posso chiederti perchè? Mi sembrava invece molto velocizzante il goto (invece di riscrivere - copia/incolla - il codice 4 volte dato che questa routine è sfruttata da 4 pulsanti diversi a cui sono abbinate 4 variabili booleane - ho inserito la condizione con il goto... non capisco in cosa consista la struttura obsoleta...

    Dato che il mio problema sussiste tutt'ora se qualcuno mi potesse dare una mano è ben accetto

    Grazie per i consigli e l'attenzione.
    ℹ️ Leggi di più su SirNino ...

  5. #5
    Wally non è in linea Scolaretto
    Quote Originariamente inviato da SirNino Visualizza il messaggio
    @ Gibra:
    @ Wally:
    Posso chiederti perchè? Mi sembrava invece molto velocizzante il goto (invece di riscrivere - copia/incolla - il codice 4 volte dato che questa routine è sfruttata da 4 pulsanti diversi a cui sono abbinate 4 variabili booleane - ho inserito la condizione con il goto... non capisco in cosa consista la struttura obsoleta...
    Crea una funzione che accetta come parametri quattro Boolean. Ogni command button richiamerà tale funzione passando i quattro valori specifici. In questa maniera puoi centralizzare il tuo codice.
    Il Goto è un'istruzione obsoleta, derivata dalla programmazione in Basic (ti ricordi quei listatoni interminabili?). L'istruzione di salto, al giorno d'oggi, non ha motivo di esistere e può solo creare confusione al programmatore peggiorando, di molto, la visibilità del codice.
    Se poi tu ti trovi bene, buon per te, continua così. Il mio è solo un consiglio, sia chiaro.
    ℹ️ Leggi di più su Wally ...

  6. #6
    SirNino non è in linea Scolaretto
    scusami ma continuo a non capire

    I consigli sono più che ben accetti (anzi oserei dire che sono qua anche per questo, per cercare di migliorare e correggere i miei errori, quindi ti chiedo di farmi (se puoi, hai tempo e voglia) un piccolo esempio per cercare di capire.

    derivata dalla programmazione in Basic (ti ricordi quei listatoni interminabili?).
    In effetti io provengo dal q - gwbasic (spero si scriva così...non mi ricordo nemmeno più )
    ℹ️ Leggi di più su SirNino ...

  7. #7
    Wally non è in linea Scolaretto
    Il consiglio che posso darti è quello di documentarti sull'utilizzo, nel campo dell'informatica e non specificatamente in VB, di Funzioni e Procedure.
    Un qualunque testo di informatica può andar bene, anche su google puoi trovare decine e decine di spiegazioni.
    Lo studio di tali argomenti ti servirà molto più di un mio esempio... anche perchè rischiamo di andare OT rispetto la tua richiesta iniziale.

    Cercando su Google, questo è il primo risultato che ho trovato... ho dato un'occhiata, è una lezione semplice e utile. Parti da qui e approfondisci...
    le procedure e le funzioni | Guida Visual Basic | Programmazione.HTML.it
    ℹ️ Leggi di più su Wally ...

  8. #8
    L'avatar di gibra
    gibra ora è in linea Very Important Person
    Quote Originariamente inviato da SirNino Visualizza il messaggio
    @ Gibra:

    VORREI COMUNQUE AGGIUNGERE CHE ANCHE TOGLIENDO IL COMMONDIALOG E IMPOSTANDO PRINTER.COPIES = 2 ME NE STAMPA UNA SOLA.
    Anche se funziona su altri programmi, non significa niente.
    Se non funziona ci sono altri problemi che è impossibile capire dal tuo codice, a volte il problema va esaminato a livello di progetto perchè le cause possono essere diverse.

    In ogni caso vorrei consigliarti di cambiare strada.
    Di norma si usano strumenti di tipo Report per queste cose. Io uso l'ActiveReport ed è eccezionale (costa un po'...).
    Visual Basic ha il DataReport gratuito ma sapendo i bug e le limitazioni di cui soffre ne sto distante!

    In mancanza puoi utilizzare PrintPreview, l'usercontrol che ti allego, che ha una qualità di stampa eccellente!
    Permette preview, zoom, multi-pagina, multi-copia, e altro...
    Quindi anni luce distante dall'oggetto Printer.

    I metodi sono veramente semplici (simili al Print dell'oggetto Printer), ma la stampa non avviene nella modalità raster, ma in modalità vettoriale che è il massimo della qualità. Provalo e te ne renderai conto immediatamente.

    Ciao

    P.S.
    Riguardo al consiglio di WALLY: ha ragione al 200%.
    Mi rendo anche conto che per chi non sa come fare diventa necessario mettersi un po' d'impegno per imparare qualcosa di nuovo, ma confermo che ne vale sempre la pena. Il guaio è che te ne rendi conto solo DOPO che l'hai fatto e dici a te stesso: "Ma perchè non l'ho fatto prima..."
    File allegati File allegati
    ℹ️ Leggi di più su gibra ...

+ Rispondi al messaggio

Potrebbero interessarti anche ...

  1. stampare più copie di un report
    Da nkt nel forum Microsoft Access
    Risposte: 2
    Ultimo Post: 06-02-2018, 21:10
  2. Stampa report - stampa maschera problema
    Da nanni_prippa nel forum Microsoft Access
    Risposte: 6
    Ultimo Post: 09-02-2017, 21:51
  3. [VS 2008]PRO Non stampa più copie
    Da sistemista nel forum Visual Basic .Net
    Risposte: 1
    Ultimo Post: 27-07-2014, 11:01
  4. Protezione contro copie database
    Da alfanet75 nel forum Microsoft Access
    Risposte: 6
    Ultimo Post: 23-05-2014, 19:26
  5. Stampa più copie dello stesso report
    Da seamission nel forum Microsoft Word
    Risposte: 18
    Ultimo Post: 22-05-2010, 19:58