Newsgroup: it.comp.lang.visual-basic
Titolo: Evviva il mio NG!

Ciao a tutti del NG!
Ultimamente mi sono imbattuto nel problema (per me!) della stampa in VB6 ,
ed ho ripetutamente e forse anche poco garbatamente, chiesto aiuto a questo
NG, che frequento da diversi mesi. Sono arrivato addirittura ad inviare una
email, a quel Drake di Roal Zanazzi, col quale mi scusavo per l'invasione,
nella medesima email, e colgo ancora l'occasione di scusarmi di nuovo per
l'accaduto! Non so cosa mi sia successo, ma mi sono sentito in difficoltà,
con questa benedetta stampa in VB6, e così ho inviato una richiesta d'aiuto
personale a Roal. Poichè ognuno di noi gestisce il suo tempo come meglio
intende gestirlo, io non ho trovato alcuno in grado di darmi una mano. Non
sto indicando alcuno, sto solo esponendo quanto mi è accaduto ed in sintesi:
Waller invia una richiesta d'aiuto stampa e non viene colta
Waller invia una nuova richiesta d'aiuto stampa e non viene colta
Waller non sa che pesci pigliare e emailizza Roal ( che giustamente avrà
cestinato la mia richiesta) poichè nulla è dovuto a Waller! Giustamente.
Mi sento frastornato! Davvero.
Posseggo la guida MSDN della MS, il libro I segreti di Visual Basic, il
libro Passo per Passo Microsoft Visual Basic 5.0, il libro Visual Basic La
programmazione dei database, il libro Hardcore Visual Basic 5.0 ed altri; ma
nonostante questa immensa mole di informazioni, tutti sfuggono dal trattare
come si deve il problema (perchè mi accorgo che è un problema) della
collezione PRINTERS. Sicuramente, vado ad intuito, qualcuno si sarà accorto
di quanto e ne avrà fatto una guida. E' incredibile, alla versione attuale
di VB, ci troviamo di fronte a questo tipo di sottoprogrammazione. Non
denigro il VB, anzi! Io programmavo con
LDA, STA, JMP CMP etc, nei vecchi, ed ottimi, 6502; quindi comprendo
perfettamente a che punto stiamo nella programmazione, che nel frattempo è
divenuta Object Oriented Programming. Però, l'utente VB non è supportato per
l'uso della stampa, o per lo meno non a sufficienza.
Tutto questo ebbe inizio, quando il mio capoufficio, mi chiese se era
possibile avere un programma mirato per la gestione dei fonogrammi. Stetti
sul chi vive una ventina di minuti, poi realizzando (erroneamente) a mente
che VB aveva tutti gli ingredienti, risposi; SI!
L'avessi mai fatto!
Per questione di tempi ( sempre maledettamente corti), sono costretto a
realizzare sempre per prima l'interfaccia utente, perchè se il capo mi
palettizza una data, posso star certo che dopo tre giorni i paletti sono
stati spostati ed il capo comincia a chiedere (" ...a che punto siamo?
Ancora non hai partorito niente?"). Non sa minimamente cosa vuol dire
realizzare un'applicativo, così se gli rispondo ("...ma mancano ancora sette
giorni..."), non finisco neanche la frase, che comincia il diluvio orale.
Quindi per prevenire il bagno orale, gli mostro subito ( doppio errore) la
GUI, così lui è contento e io guadagno dell'altro tempo, utile per portare a
termine l'applicativo.
Così quando ho chiesto aiuto al gajardissimo NG, l'ho fatto perchè avevo
appena mostrato l'interfaccia utente al capo, guadagnando del preziosissimo
tempo. Quando il mattino dopo ho cercato di effettuare una stampa di un form
12000 X 16000 su uno schermo 800 X 600, lì ho avuto come un colpo
apoplettico!Una sincope! Tutte le mie attività motorie del sistema
simpatico, sono andate in tilt! Balbettavo, ed avevo una sudorazione
acceleratissima e ...
il mio form veniva stampato per metà! Aaaarrrghhh!
Quando la Roma perse contro il Liverpool ai rigori, ebbi un immenso
dispiacere, ma vedendo il mio form stampato a metà, quella giornata sembra
essere stata una giornata incantevole!
Così non avendo un input dall'esterno ed il capo che con quel suo sorrisino,
sembrava sapesse del problema stampa di VB, ho dovuto fare gli straordinari.
La notte il nostro caro Fracchia non dormiva più, e voi sapete che un
cervello sotto stress è produttivo quanto un Hooligans allo stadio. Tant'è
che ieri mattina mi sono alzato verso le sette e trenta con la ferma volontà
di sperimentare qualche tipo di stampa. Avevo deciso di piegarmi a quanto VB
mi offfriva.
Poichè ho la imprescindibile necessità di aprire un form alla risoluzione di
12000 X 16000 twip su di uno schermo a 800 X 600 pixel, il problema nasce
subito dal fatto che usando sia Printform che l'oggetto Printer, sul mio bel
foglio A4, trovo stampato solo poco più della metà del form in pratica
quanto si vede a schermo!
Forse sbaglio in qualcosa però usando:
Private Sub cmdStampa_Click()
 Printform
End Sub
oppure
Private Sub cmdStampa_Click()
 On Error Goto Toppato
   Printer.Height = frmMain.Height
   Printer.Width = frmMain.Width
 For Each Ctrl in Controls
    if Ctrl.Tag = "Stampa" Then     'Stampa solo le Label
       Printer.CurrentX = Ctrl.Left
       Printer.CurrentY = Ctrl.Top
       Printer.Print Ctrl.Caption
    end if
       Next Ctrl
  Printer.EndDoc
 Toppato:
 MsgBox("Errore nella stampa")  'Pochino eh! :-)
 Resume Next
End Sub
Specifico che non mi interessa conoscere la stampante di default, quindi
questo mi sarebbe bastato!
Invece no. L'output di stampa è sempre e solo un maledetto mezzo foglio A4,
stampato per la metà superiore.
Il dato uso dell'oggetto Printer, l'ho evinto da quella enorme mole di
informazioni che ho in casa. Questo è quanto ho capito da tutti quei libri.
Sicuramente sono un capoccione, uno zuccone; ma di certo non v'è una sola
pagina tra tutti quei libri, che chiaramente ti dica: NON CREATE FORM PIU'
ALTI DELLO SCHERMO, POICHE' LA PARTE NON VISIBILE NON VERRA' STAMPATA.
Non solo non c'è, ma non c'è nessuno aiuto per quelli che devono andare in
quella direzione.
Potreste dirmi che io posseggo i libri sbagliati. Potrei dire, che non si
può comprare un libro per ogni oggetto o collezione di VB.
Nonostante tutte queste parole il mio problema permane... purtoppo.
Intimorito dalle circostanze chiedo aiuto ad Internet. In un sito che
neanche ricordo, trovo la versione Shareware di Roboprint. Ha molte
funzionalità tra le quali anche il preview di stampa.
Lo provo e sembra che vada bene, ma sulla prima linea stampata si legge
(roboprint versione non registrata). Giustamente, l'autore ha tutelato il
suo lavoro, ma io non posso archiviare dei fogli con quell'intestazione e
cosa peggiore non posso aspettare tutto il tempo che intercorre tra
l'ordinazione del prodotto e la sua disponibilità. I tempi sono
strettissimi.
Premetto che non ho frequentato alcun liceo, e quel che so in informatica
(poco) l'ho imparato dai libri. Autodidatta. Quindi il codice che andrò a
scrivere l'ho trovato, provando e riprovando inseguendo le mie assurde idee,
che sicuramente esulano dallo standard della programmazione ma che in questo
caso hanno risolto il mio problema.
Il codice che segue effettua una stampa di oggetti: Label, BoxText, Line e
tutto quanto non rientra nella grafica. Nel mio progetto non ne faccio uso,
quindi... pazienza!
Le impostazioni salienti del mio progetto:
Risoluzione di schermo = 800 x 600 pixel
Form1 = frmMain
frmMain.Height = 16000
frmMain.Width = 12000
frmMain.ScaleMode = 3-pixel
frmMain.StartUpPosition = 2-CenterScreen
frmMain.WindowState = 0-Normal
Line1.Tag = "linea"
Line2.Tag = "linea"
Line3.......
.....
.....
Line30.tag = "linea"
****************************************************************************
***
****************************************************************************
***
Private Sub cmdStampa_Click()
On Error Goto Toppato
Printer.Height = frmMain.Height * 2
Printer.Width = frmMain.Width * 2
Printer.Zoom = 100
 For Each Ctrl in Controls
   if Ctrl.Tag = "linea" Then
      Printer.Line (Ctrl.X1*15, Ctrl.Y1*15) - (Ctrl.X2*15, Ctrl.Y2*15)
      Else
             Printer.CurrentX = Ctrl.Left * 15
             Printer.CurrentY = Ctrl.Top * 15
             Printer.Font = Ctrl.Font
             Printer.FontSize = Ctrl.FontSize
             Printer.Print Ctrl.Caption
          End if
 Next Ctrl
Printer.EndDoc
Toppato:
 MsgBox("Errore nella stampa")  'Pochino eh! :-)
 Resume Next
End Sub
****************************************************************************
*****
****************************************************************************
*****
1) Io non so se già esiste un metodo simile a questo, ma di certo io non lo
conosco.
2) Non chidetemi da dove ho preso quei moltiplicatori, anzi:
vedendo che aumentando Printer.Height, la stampa si spostava verso il basso,
ho intuito che l'altezza passata a Printer.Height da frmMain.Height, è per
qualche ragione insufficiente, quindi ho cercato una costante da applicare a
Printer.Height. Ovviamente la costante doveva essere legata all'altezza
stessa del form, così ho provato a raddopiarla, e sembrava funzionasse.
A questo punto le proprietà TOP e LEFT degli oggetti da stampare,
diventavano incoerenti quindi andavano rivedute anche loro.Poi tra una
imprecazione ed una preghiera ho trovato questo 15.
Benedetto sia! Applicando 15 come moltiplicatore alle proprietà Left e Tag
degli oggetti da stampare, questi si stampano miracolosamente al loro posto
sul foglio A4.
Great!
A questo punto non ditemi che bastava usare magari un metodo tipo ScaleMode
o ScaleLeft
perchè tanto ancora non ne conosco il loro utilizzo ma più che altro il loro
significato: sono molto tosto di comprendonio!
Posso solo dirvi che non appena ho raggiunto lo scopo con i miei mezzi, la
felicità m'ha riempito tutta l'anima (davvero) e che non potevo non darvi
questa notizia.
Spero che il mio codicino torni utile a qualcuno di voi, e possiate così
guadagnare del tempo prezioso, nel caso aveste anche voi un capoufficio tipo
il mio.
Se non fossi stato chiaro scrivete a 
Cr...@tin.it
 e sarò lieto di
rispondervi.
P.S.
Perdonate la mia estrema lungaggine, e fatelo di nuovo se sono OT  ^__^
Waller the Net Roller 8-]

 questa notizia.
Ne sono felice, non esiste gratificazione piu' grande del riuscire a
risolvere un problema con i propri mezzi!
--
Roal Zanazzi
z...@iol.it