Newsgroup: it.comp.lang.visual-basic
Titolo: Printerfobia

Dopo vari insuccessi con l'oggetto printer mi sono rassegnato ad usare
PrintForm per le stampe di una mia applicazione. Pazzesco! Devo scrivere del
codice per calcolare quando la stampa eccede le dimensioni del Form! :-)
O forse mi sfugge qualcosa? Penso di no, visto che una mia precedente che
chiedeva delucidazioni su PrintForm è caduta nel vuoto.
Qualcuno potrebbe gentilmente fornirimi del codice di esempio sull'uso
dell'oggetto printer (impostare il carattere, i margini, stampare dei testi
con caratteri diversi e centrare una immagine nel foglio). Io sto diventando
matto, potrebbe essere il driver della stampante Inkjet?! (Uso una HP
670C)...
Dalla guida di VB: "Se EndDoc viene eseguito subito dopo il metodo NewPage,
non verranno stampate pagine bianche."
Ebbene, ho provato ad eseguire queste istruzioni:
Printer.NewPage
Printer.EndDoc
Ottenendo 2 (due) pagine bianche :-)
Se tendo di impostare ScaleLeft, ecc.. la prima riga non è allineata alle
altre... :-)
Anche Copies produce risultati inaspettati: delle volte 1 sola copia, delle
volte il doppio delle richieste?! :-)
Ringrazio chiunque vorrà essere così paziente da ascoltarmi.
Ciao
Francesco

volte il doppio delle richieste?! :-)
Anch'io rimango spesso sorpreso dai risultati dei miei tentativi con
Printer... ma quasi mai ho delle belle sorprese, fino a questo momento.
Sxo di averti potuto aiutare (anche solo minimamente) e, x maggiori
informazioni, ti rimando a tutte le mail che sono giunte al NG
sull'argomento dal 01/08/99 ad oggi.
A presto.
    Alex

Forse ho scoperto qualcosa.
Se imposto la proprietą Copies su N mi stampa N copie del documento senza
bisogno di usare cicli del tipo
For I = 1 To CommonDialog.Copies
Printer.Print Qualcosa
Next I
Questo č in contraddizione con l'esempio relativo della guida di VB5.
Ma se tento di impostare Copies fuori dalla CommonDialog, ad esempio ponendo
Printer.Copies = VScroll.Value
MyForm.PrintForm
Non funziona, stampa il numero corrispondente al valore precedentemente
impostato nella CommonDialog. Perche!!!???
Prima usavo un codice di questo genere, indipendente da Copies
For I = 1 to CopieStampa
MyForm.PrintForm
Next I
Poi mi sono reso conto che il numero delle copie poteva essere selezionato
anche nella finestra Imposta Stampante (che permetto di chiamare dal mio
programma). Si rende allora necessario aggiornare la mia maschera
personalizzata quando l'utente cambia il numero delle copie... e funziona!
Cose del tipo
VScroll.Value=CommonDialog.Copies
Label.Caption=CommonDialog.Copies
Perņ se tendo di cambiare Copies modificando Vscroll.Value e senza passare
per la CommonDialog non funziona!?? Perche???
Ciao
Francesco

Dai tuoi msg (se non ne ho perso qualcuno) non ho capito quale
versione di VB stai utilizzando.
Io ho esperienza con VB5 (fino a SP3), e dai vari esperimenti che
ho fatto ho visto che:
1. L'oggetto Printer č alquanto bacato (almeno senza SP3).
Ciň non dipende tanto da VB5 ma da Win98 (se usi questo).
Infatti passando da Win95 a Win98, M$ ha modificato il
comportamento di alcune API relative alle stampanti.
In particolare ora, quando si cambia pagina (con un
EndPage) Win98 resetta il DC (Device Context) di
Printer (esattamente come fa anche WinNT4), mentre
in Win95 ciň non avveniva. Risultato VB5 (non SP3)
perde tutte le informazioni relative al tipo di carattere,
dimensione, probabilmente anche il tipo di scala
ecc. (Ho trovato questo spulciando MSDN, č un
articoletto relativo, mi sembra, ai bugs).
Soluzione (che ho seguito, anche per altri motivi):
Usa direttamente le API del sistema operativo,
almeno sai cosa stai facendo (infatti, altra piccola
chicca di VB5-SP3, se ora usi delle API tramite
Printer.hDC, come si poteva fare con VB5, il
buon VB5-SP3 le intercetta - non so come,
probabilmente il DC che ti restituisce č fittizio -
e le ignora).
Usare le API relative alle stampanti non č complicato,
infatti la maggior parte sono gli equivalenti diretti
delle funzioni presenti in VB, solo un po' noioso.
Il GROSSO vantaggio č guadagnarci in salute,
almeno cosě sai cosa stai facendo e se c'č una magagna
la puoi sistemare.
2. Anche le CommonDialogs hanno i loro bei problemi!
Soprattutto quella relativa alle stampanti (toh, che caso!).
Inoltre si comportano in maniera diversa in funzione che
il tuo prg funzioni in Win95, Win98 o WinNT (ma che bello!).
In particolare ho visto che il comportamento č ben diverso
da quando indicato dal manuale in linea, specie se
si utilizzano alcuni parametri di stampa, tipo "Da pag - A Pag"
Ancora la soluzione definitiva č usare le API relative alla
Common Dialogs. Purtroppo queste, al contrario di quelle
inerenti alla stampante sono un po' (a dir poco) piů rognose.
Perň con un po' di pazienza la cosa di puň fare.
In particolare la funzione (non documentata) VarPtr č fondamentale,
infatti alcune common dialog (mi viene in mente quella relativa
alle fonts) richiedono come parametro delle strutture all'interno
delle quali si trovano dei puntatori ad altre strutture tipo
typedef {
    int d;
    int e;
} pippo;
typedef {
    int a;
    int b;
    pippo *c;
} pluto;
che in VB diventano:
TYPE pippo
    d AS LONG
    e AS LONG
END TYPE
TYPE pluto
    a AS LONG
    b AS LONG
    c AS LONG    ' NOTA BENE!
END TYPE
e quando le usi devi fare:
DIM p AS pluto
DIM q AS pippo
p.c = Varptr(q)    ' qui sta il trucco fondamentale per usare le API Common
Dialog da VB!
Buon laboro, Massimo.