Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Alterazioni di scala su printer (lungo ed esasperato)

Il subject e' solo un'ipotesi del problema, al momento attuale mi sento del
tutto alieanto.
Avete presente quella spassosa situazione quando controlli riga per riga col
debug tutto il codice e tutto funziona tranne il risultato finale?
Beh io vengo pazzo in quei casi.
Ora dopo ore di tentativi e imprecazioni ho raggiunto la conclusione che
c'e' qualche comportamento dell'oggetto printer a me del tutto ignoto e se
qualcuno non me lo spiega non ne usciro' piu'.
In un programma di gestione immagini ho messo a punto un subroutine che
permette di stampare due immagini sullo stesso foglio.
Chiaramente le immagini vengono ridimensionate e mantenute proporzionali
negli assi all'originale.
A entrambe viene concesso lo stesso spazio sul foglio.
Il codice che riporto in fondo a questo post, funziona 9 volte su 10 ma a
costo di essere accusato di perfezionismo non mi accontento. :-/
Quando una delle due immagini e' molto grande (almeno cosi' mi pare) accade
che una immagine invade piu' della meta' del foglio e l'altra per contro si
restringe alterando anche le sue proporzioni.
La buona notizia e' che debugging alla mano questo non avviene.
La brutta notizia e' che invece avviene.
Tra i tanti esperimenti ne ho fatto uno che mi ha sconcertato e penso sia
proprio in questo anomalo comportamento il nocciolo del problema.
Dopo una prova di stampa con due immagini, fallita come spiegato sopra, ho
avuto la geniale intuizione di provare ad eliminare il codice della copia su
printer della seconda immagine e ... sorpresa, la prima immagine che prima
risultava alterata adesso (che e' l'unica) funziona.
Rimane nella sua meta' di stampa perfettamente proporzionata.
Quello che mi sembra insensato e' che significa che la prima operazione di
paintpicture funziona ma e' quella successiva che riesce ad alterare in modo
retroattivo la precedente operazione.
Secondo me non e' possibile ma cosi' succede.
Ci deve essere qualcosa riguarda alle scalemode o alle unita' di misura che
viene alterato tra un'immagine all'altra ma non capisco cosa e come
evitarlo.
questo e' il codice.
"Principale" e' il form che contiene l'image box (nascosta) usata per
caricare l'immagine.
Le parti dell'orientamento funzionano, oddio teoricamente funziona tutto
pero'....
Se qualcuno che ha gia' avuto problemi simili sapesse darmi almeno un
indizio gliene sarei molto grato. :-/
ciao
Paolo B.
--------
On Error Resume Next
 Err.Clear
 Principale.Image1.Picture = LoadPicture(NomeImage)
 If (Err.Number <> 0) Then
      Call MsgBox("Non riesco a caricare immagine " & _
            NomeImage, vbCritical)
      Exit Sub
 End If
 SizeX = Principale.Image1.Width
 SizeY = Principale.Image1.Height
       'stampare due immagini sullo stesso foglio
        'se le immagini hanno sviluppo verticale
        'mettere orientamento stampa in orizzontale
        'e viceversa
        If (SizeX < SizeY) Then
            'sviluppo verticale di immagine 1
            'impostare sviluppo orizzontale
            Printer.Orientation = 2
        Else
            Printer.Orientation = 1
        End If
        Printer.Print
        'copiare prima immagine in parte alta
        'di foglio di stampa
        Call CopiaImageSuPrinter(True)
        'caricare seconda immagine
        Err.Clear
        Principale.Image1.Picture = _
                LoadPicture(SecondaImage)
        If (Err.Number <> 0) Then
            Call MsgBox("Non riesco a caricare immagine " & SecondaImage,
vbCritical)
            Printer.KillDoc
            Exit Sub
        End If
        Call CopiaImageSuPrinter(False)
        Printer.EndDoc
'---------------
Private Sub CopiaImageSuPrinter(TestParteAlta As Boolean)
Dim ImageX As Single, ImageY As Single
Dim OrgX As Single, OrgY As Single
Dim PrinterX As Single, PrinterY As Single
Dim NewSizeX As Single, NewSizeY As Single
On Error Resume Next
Err.Clear
With Principale.Image1
    ImageX = .Width
    ImageY = .Height
End With
With Printer
    PrinterX = .ScaleWidth
    PrinterY = .ScaleHeight
End With
If (TestParteAlta = True) Then
    OrgX = 0
    OrgY = 0
    If (Printer.Orientation = 1) Then
        PrinterY = PrinterY \ 2
    Else
        PrinterX = PrinterX \ 2
    End If
Else
    If (Printer.Orientation = 1) Then
        PrinterY = PrinterY \ 2
        OrgX = 0
        OrgY = PrinterY
    Else
        PrinterX = PrinterX \ 2
        OrgX = PrinterX
        OrgY = 0
    End If
End If
'dimensionare immagine ImageX,ImageY in modo
'da riempire spazio PrinterX, PrinterY
If ((ImageX / ImageY) > _
     (PrinterX / PrinterY)) Then
    NewSizeX = PrinterX
    NewSizeY = (NewSizeX * ImageY) / ImageX
Else
    NewSizeY = PrinterY
    NewSizeX = (NewSizeY * ImageX) / ImageY
End If
Call Printer.PaintPicture(Principale.Image1.Picture, _
          OrgX, OrgY, NewSizeX, NewSizeY)
End Sub

 costo di essere accusato di perfezionismo non mi accontento. :-/
Io dico una c@@zata ma potrebbe funzionare...
Hai provato ad inserire qua e là un bello Do Events ?
A me capitava una cosa simile con alcune operazioni "complesse" in un
programma da me scritto.
10 volte funzionava, 5 no......
Poi grazie all'aiuto di qualche anima pia in questo NG si è pensato che
qualche operazione vada "troppo veloce" (scusate il linguaggio artigianale
ma non è che sia molto esperto) per il programma stesso... ossia qualcosa si
perde per strada.... non so come possa accadere, non me lo chiedere.....
so solo che mettendo un Do Events in una routine si è risolto il tutto.
Prova a mettere Do events all'interno delle routine che gestisce il
ridimensionamento dell'immagine e/o in qualche ciclo Do-Loop che hai fatto e
vedi cosa succede.
Sono sicuro che se, debug alla mano, il probelma non si verifica allora è
questo il problema.
Infatti a me, se eseguivo le istruzioni passo-passo il problema non si
verificava ma se il prog era in esecuzione normale allora si verificava.
Prova come ti ho detto io e vedrai... funzionerà.....

La brutta notizia e' che invece avviene.
[cut]
Ho incollato il tuo codice in un progetto, ed ho sostituito Image con IPictureDisp
(non avevo voglia di gestirmi un form, ma non so se questo possa aver influenzato).
Dato che non posso usare la stampante a quest' ora, l' ho simulata stampando
su file postscript, da guardare poi con GView.
Dalle (poche) prove fatte, sia dal' ide che con l' exe, le immagini occupano sempre
la meta' del foglio, grandi o piccole che siano.
Mi viene un sospetto. Se hai usato un controllo Image, non e' che hai
lasciato la proprieta' Stretch a True?
-- 
ciao, hal


A sto punto provo anche questo, ho fatto 99... :-)
grazie
Paolo


Ti ringrazio per il disturbo che ti sei preso.
Purtroppo temo che basti poco per alterare il valore dell'esperimento.
Piu' ci medito meno capisco.
Uff, penso che basterebbe cambiare l'approccio che tutto tornerebbe a
funzionare senza apparente ragione ma non cosa modificare.
Uusare due image box distinte? Oppure delle picture box?
Non so, torno a fare esperimenti
grazie per l'aiuto
Paolo

 la meta' del foglio, grandi o piccole che siano.
Visto che sei stato cosi' gentile da fare questa prova non potresti provare
anche usando due immagini create appositamente?
In pratica le due immagini che si ostinano a darmi problemi hanno le
seguenti caratteristiche.
Sono entrambe true color, formato jpg.
La prima (quella che viene caricata per prima) ha dimensioni (in pixel) di
1192x1365 , la seconda di 760x1082
Se anche con immagini di questo tipo funziona sarei curioso di vedere
esattamente le modifiche che hai fatto al codice.
grazie
Paolo