Newsgroup: it.comp.lang.visual-basic
Titolo: [VB6] istruzione IF che restituisce falso anche quando è vero

Salve a tutti :-)
Sto riscontrando un problema abbastanza strano in VB6.
Nel programma su cui sto lavorando (che deriva dal progetto Open 
"Fattura Fast" 
www.fatturafast.org
), devo sistemare lo scadenzario.
Lo scadenzario ï¿œ visualizzato tramite un controllo utente che sfrutta 
una MSFlexGrid per la griglia.
Una della caratteristiche principali ï¿œ lo stato di Pagato/non Pagato 
della fattura, che nel controllo viene indicato con una quadratino con 
un segno di spunta (quando ï¿œ pagata) o con il quadratino vuoto (quando 
non pagata).
Ovviamente se clicco sul quadratino di su una fattura non pagata, 
compare il quadratino con il segno di spunta e la fattura risulterï¿œ pagata.
Se perï¿œ faccio il contrario, cioï¿œ clicco su una fattura pagata, scompare 
si il segno di spunta, ma se faccio aggiorna ricompare.
Il problema si verifica nel programma compilato, ma all'interno dell'IDE 
funziona perfettamente.
Inserendo un pï¿œ di MsgBox nei punti giusti ho trovato il codice incriminato:
--- inizio codice ---
If Griglia.CellPicture = Image2.Picture Then
	TextMatrix = False
		MsgBox "TextMatrix-Falso: " & TextMatrix
Else
	TextMatrix = True
		MsgBox "TextMatrix-Vero: " & TextMatrix
End If
--- fine codice ---
(non ï¿œ un errore... il codice ï¿œ proprio cosï¿œ se il risutlato ï¿œ vero deve 
restituire falso e viceversa... ï¿œ un pï¿œ strano ma ï¿œ stato fatto cosï¿œ)
Inserendo un msgbox prima dell'IF:
MsgBox "CP1: " & Griglia.CellPicture & vbCrLf & _
        "IP2:  " & Image2.Picture
ho scoperto che il risultato nell "IF" usciva sempre falso anche se i 
valori di Griglia.CellPicture e Image2.Picture erano uguali.
Pensando che mi sfuggisse ho aggiunto un ulteriore controllo:
MsgBox "CP1: " & Griglia.CellPicture & vbCrLf & _
        "IP2:  " & Image2.Picture & vbCrLf & _
        (Griglia.CellPicture = Image2.Picture)
Solo che ora funziona regolarmente.
Togliendo (Griglia.CellPicture = Image2.Picture) riprende a dare problemi.
Per ora ho risolto inserendo prima dell IF il seguente codice:
Dim t
t = (Griglia.CellPicture = Image2.Picture)
e funziona... ma non capisco perchï¿œ ï¿œ necessario questo "hack" per far 
funzionare correttamente la funzione IF
-- 
Daniele Pinna
www.dapinna.com
www.ildocfainpillole.it
leva oops. per rispondere

 t = (Griglia.CellPicture = Image2.Picture)
Hum... ho "quasi" il sospetto che dipenda da autoredraw o qualche
ammenicolo da accelerazione grafica...
Spiego la mia intuizione (forse sbagliata, eh !) :
confrontare 2 superfici bitmap presuppone che siano caricate
ed attive, ma cio' puo' non essere vero in run time poiche'
la memoria dedicata alla grafica e' spesso "variabile", un
confronto "diretto" puo' dare problemi: quel blocco di
memoria GRAFICA, non essendo visualizzato potrebbe essere
in uso per "altro", nel momento in cui la si riversa in una variabile
si impone al motore grafico di riversarne il reale contenuto nella
variabile stessa.
Il punto (confuso, ammetto), e' che il confonto tra
bitmap1 e bitmap2 (intese come superfici grafiche "pure") viene
imposto al motore grafico che si fa' i ca%%i suoi fintanto che
le superfici non sono visibili e solo nel caso in cui il dominio
viene richiesto al di fuori del motore grafico viene
intieramente rivelato.
Provo con altre parole: supponendo un picturebox
che "sborda" dai confini del monitor, l'acceleratore grafico
non si cura (per accelerare, appunto) di disegnare la
parte non visibile, pertanto facendo fare al motore grafico
un confronto di cio' che e' ATTUALMENTE DISEGNATO
sul picturebox e di cio' che DOVREBBE ESSERE DISEGNATO
risultano diversi, se invece si chiede al motore grafico di
restituire il contenuto del picturebox, esso viene "ritornato"
bit per bit precisamente; se la mia intuizione non e' completamente
una stronzata, spiegherebbe perche'
picture1= picture2  restituisce  false
mentre  t= picture1.picture : t=picture2 restituisce true