Newsgroup: it.comp.lang.visual-basic
Titolo: Settaggio stampante

Salve a tutti,
ho un problema forse relativamente semplice, ma non riesco ad uscirne.....
Mi occorrerebbe sapere come impostare l'oggetto printer da un
dialog.showprinter, ovvero io ho omesso l'opzione printerdefault (settata a
false) che purtroppo reimposta la stampante di sistema e questo e' molto
scomodo.
Tra i vari flags ho trovato i flags cdlPDReturnIC Or cdlPDReturnDC che
entrambi ritornano l'Hdc della stampante selezionata ma quando confronto
tale Hdc con i device context delle stampanti nell'insieme printers succede
che :
Printers(0).hdc, Printers(1).hdc ........ Printers(n).hdc restituiscono
tutti lo stesso valore e questo non mi consente fare set printer =
printers(x).
Cosa posso fare ?? Esiste qualche API che restituisca un parametro da
confrontare valido ?
Grazie a tutti Paolo

...



Grazie per il suggerimento, ma ho paura di non aver capito come confrontare
il devicename.
Riporto fedelemente cio' che avrei in mente di fare dopo che l'utente ha
selezionato la stampante su cui desidera stampare:
Dim prn As Object
With frmStart.Dialog
   .CancelError = True
   .flags = cdlPDPrintSetup Or cdlPDReturnIC Or cdlPDReturnDC    'Or
cdlPDUseDevModeCopies
   .PrinterDefault = False
   .ShowPrinter   '(L'utente ha selezionato la stampante)
   'RICONOSCIMENO DELLA STAMPANTE
   'L'unica informazione utile che la dialog
   'e' in grado di ritornare e' hDc attraverso uno dei flags cdlPDReturnIC
Or cdlPDReturnDC
   For Each prn In Printers
      If prn.hdc = .hdc Then    'Istruzione non buona
            Set printer = prn
      End If
   Next
End With
.
.
Grazie per il suggerimento
Paolo

Mi sono reso conto che dopo vari tentativi è come dici tu. Ho postato la
questione sul ng americano mò vediamo.

 il devicename.
Da quel che ho capito, non esiste nessuna funzione API che permetta di risalire
al nome della stampante dato l'handle al Device Context. Mentre esiste il
contrario, che č la normale prassi per usare la stampante come device context.
Conoscendo il nome della stampante, lo si passa alla funzione CreateDC, la
quale restituisce quello che sarebbe l'hDC. Non ho trovato nessuna funzione che
metta in relazione il Device Context con il nome della stampante.
Se non c'č qualche scappatoia a quanto detto, puoi sempre utilizzare
DialogObjects (a tuo rischio e pericolo, ma a me, per ora, hanno sempre
funzionato). Li tovi nel CD di VB5 (credo anche 6) in una cartella che che
dovrebbe chiamarsi "Unsupported". Si tratta di una dll da registrare e
referenziare. Corrisponde su per giů alle common dialogs, ma ti permette di
ottenere il nome della stampante selezionata. Poi il concetto č lo stesso:
individuare nell'insieme printers quale corrisponde al device name risultante
dalla finestra di dialogo e assegnare all'oggetto Printer quel membro
dell'insieme.
Ciao
Flavio Ronco
f.ronco@*NonMiServeNiente*
flashnet.it
http://www.metabrains.com
  [Under Construction]
-------------------------------------------------------------
"Che pubblico in gamba! Se ci dite dove lavorate,
domani mattina se abbiamo tempo vi veniamo a vedere"
[Paolo Rossi]

Grazie veramente,
ho provato a smanettare con qualche API, ma ancora niente.
La strada dell'unsupported non mi dispiace ...... ma cosa comporta a livello
di installazione del programma?? Si autoregistra ? E poi mi chiedo....ma
come fa il resto del mondo che sviluppa VB, la maggior parte delle
applicazioni non cambia mica le impostazioni di stampante del sistema!!
Ciao a tutti

 applicazioni non cambia mica le impostazioni di stampante del sistema!!
si convince che la sua sfiga è by design. it's not a bug, it's a feature. Il
caro vecchio bill lucra sui suoi metodi di trasformare in buone notizie quelle
cattive.
Ciao
Flavio Ronco
--



Mi volevo complimentare perche' sei un vero e proprio fenomeno.Ho provato a
mettere dentro la dll che mi hai suggerito e funzionicchia anche se ho un
problema : memoria esaurita se mostro due volte di seguito la finestra di
dialogo. O devo istanziarla e distruggerla ogni volta ma perde ogni setta
ggio anche perche' alcune proprieta' (impostazioni di stampante comuni) sono
di sola lettura oppure mi da Memoria esaurita al secondo tentativo di
settaggio. Ne sai niente?
So proprio de coccio
Grazie ancora Paolo

 Grazie ancora Paolo
Beh, puoi solo impostare le proprietà del riquadro di dialogo (cosa mostrare e
cosa no), poi le caratteristiche scelte della stampante le troverai dopo la
chiusura del dialog nell'oggetto PrinterObject
Qui c'è uno spezzone di una mia routine di stampa:
    Dim dlg As New DialogObjects.PrintDialog
    Dim prn as Printer
    On Error Resume Next
    With dlg
        .Center = True
        .ShowPrintToFile = True
        .DisablePrintToFile = False
        .DisableSelection = True
        .DisablePageNumbers = True
        .Show
    End With
    With Printer
       For each prn in Printers
            If prn.DeviceName = 
dlg.PrinterDevice.Name
 Then Set Printer = prn
        Next
        .Orientation = dlg.PrinterDevice.Orientation
        .PaperSize = dlg.PrinterDevice.PaperSize
        .Copies = dlg.PrinterDevice.Copies
        .Font = "Courier New"
        .Font.Size = 22
        .FontBold = True
        .Printcheteprint... Et Cetera
End With
Spero funzioni. dlg dovrebbe autodistruggersi all'uscita della routine. Se però
vuoi che vengano mantenuti i valori, credo che tu debba istanziarlo in una
variabile pubblica globale o a livello di modulo.


 Grazie ancora Paolo
Beh, puoi solo impostare le proprietà del riquadro di dialogo (cosa mostrare e
cosa no), poi le caratteristiche scelte della stampante le troverai dopo la
chiusura del dialog nell'oggetto PrinterDevice.


variabile pubblica globale o a livello di modulo.
Il tuo funziona benissimo, infatti se si instanzia e si butta l'oggetto
sembra reagire benissimo a parte il fatto che non mantiene le impostazioni
definite. Il problema nasce proprio quando dichiaro la classe pageSetup o
printerSetup come membro pubblico in un modulo o privato all'interno di una
form, comunque statico. La seconda volta che mostra la finestra di dialogo i
valori mi vengono conservati ma appena tento di utilizzare il membro
printerDevice, scoppia a piangere con un errore 7 di 'Memoria esaurita'.
Sono le 5.00 del mattino ed io le ho veramente provate tutte. Ho scritto una
tonnellata di codice per provare ad aggirare il problema con qualche sporco
truccaccio, macche'... Ho anche indagato sull'SP3 devStudio VB con la
speranza di trovare la libreria rivista : e' soltanto dichiarata nella lista
dei file in realta' neanche la puzza. Forse sono io il banana che non riesce
a trovarla :>( ?
L'unica alternativa e' quella di non cercare la luna nel pozzo.
Grazie Paolo

 Grazie Paolo
VS6sp3_3.cab, perň non mi sembra aggiornato (data di versione 1995). Cosa c'č
sotto? Andrň a controllare meglio i numeri di versione. Al momento non ho sotto
mano il CD.
Mi spiace. Puoi sempre dichiarare un tipo simile all'oggetto PrinterDevice e
bufferizzare lě i dati, per poi leggerli di volta in volta.
Ciao
Flavio


Ho letto accuratamente le istruzioni per passare la struttura DEVMODE a
Crystal Report ma non funziona.
Ho usato crPESelectPrinter(ecc...) di crWrap32.dll senza successo.
Qualcuno sa dirmi come posso fare????
Grazie
fpromo...@libero.it