Newsgroup: it.comp.lang.visual-basic
Titolo: [?]Grafica persistente in una Picturebox

Ciao a tutti,
ho un problemino con le PictureBox.
Ho fatto una applicazione che disegna dei grafici all'interno di una
Picture.
Ci sono vari bottoni e ognuno di essi disegna un grafico differente.
Due bottoni particolari mi permettono di effettuare delle trasformazioni su
questi grafici. Tali trasformazioni devono essere visibili, cioe' deve
essere possibile vederle mentre lavorano in "tempo reale".
Io setto la proprieta' AutoRedraw della Picture a true, quando la Form su
cui e' posta viene caricata. In questo modo tutti i grafici che disegno sono
persistenti.
Quando prermo uno dei bottoni per le trasformazioni, setto AutoRedraw a
false, in modo da poter vedere come cambiano i grafici (altrimenti mi viene
mostrato solo l'aspetto finale, senza far vedere quello che accade man
mano).
Prima di uscire dalla procedura Click() di questi bottoni, setto a true
AutoRedraw, in modo che il risultato della trasformazione sia persistente
sulla Picture.
Questo pero' non accade. Se sposto una finestra sopra la mia Form, quando
quest' ultima ritorna attiva, mi mostra il grafico che c'era prima della
trasformazione effettuata.
Ho provato in vari modi a settare AutoRedraw in varie posizioni del codice,
ma ottengo sempre lo stesso risultato. Quello che io vorrei, invece, e' di
rendere persistente anche il nuovo grafico ottenuto dalle trasformazioni, e
cosi' via per ogni nuovo grafico ottenuto da nuove trasformazioni.
E' possibile? Sapreste darmi qualche indicazione (anche materiale da
consultare)?
(ho guardato tra i vecchi messaggi, ma l'unico con un problema simile al
mio...non ha risposta :-(  )
Grazie in anticipo,
Davide.

 essere possibile vederle mentre lavorano in "tempo reale".
Non puoi giocare con Autoredraw come fai tu, perchč quello disegnato quando
AR = False si cancella.
La soluzione č piuttosto semplice:
<istruzioni di disegno>
If (Picture1.AutoRedraw) then Picture1.Refresh
Cosě se anche dovessi cambiare idea sull'autoredraw funziona lo stesso :)
Ciao
------------------------- SiDB Simple DataBase engine ----
------------------------- adParser Expression evaluator --
 
http://space.virgilio.it/zntf...@tin.it/
----------------------------------------------------------

 mano).
L'ultima affermazione è falsa. Te lo provo subito:
Crea un nuovo progetto. Sulla Form1 inserisci una PictureBox di nome
Picture1 e un Command Button di nome Command1.
Poi copia questo codice:
Private Sub Command1_Click()
   Dim r As Long
   Dim k As Integer
   Picture1.AutoRedraw = True
   For r = 1 To Picture1.Height
      Picture1.PSet (r, r)
      For k = 1 To 20
         DoEvents
      Next
   Next
End Sub
Manda in esecuzione e premi il pulsante e vedrai che anche se sei in
Autoredraw=true, si vede benissimo cosa succede mentre disegni a video.
In questo caso, se anche sposti un'altra finestra sulla tua form, vedrai che
non perdi nulla di quello che hai disegnato.
Ciao
*Roby*

       Next
Cos'è questa porcheria?


 Cos'è questa porcheria?
Rilassati, serve solo a far perdere tempo al ciclo per far vedere che mentre
disegna la picturebox si aggiorna. ;-)
Comunque almeno 1 doevents serve se vuoi vedere cosa succede; in
alternativa, puoi usare Picture1.refresh, ma nel frattempo tutto il resto
del programma è piantato e non puoi neppure spostare la finestra che lo
contiene.
Ciao
*Roby*

Cosě se anche dovessi cambiare idea sull'autoredraw funziona lo stesso :)
Anche cosi' il problema non mi si risolve. Ma in relata' l'inghippo sta' a
monte, appunto nell'uso scorretto di AutoRedraw che faccio.
Sono riuscito a risolverlo mantenendo la PictureBox con AutoRedraw a true e
usando DoEvents mentre applico le trasformazioni, come nell'esempio del
messaggio di Roberto Piazzolla.
(In compenso, ora ho un nuovo problema, che espongo in un altro messaggio.)
Grazie mille per l'aiuto,
Davide.

...

Per mille Finestrelle95! :-)
E' vero.
All'inizio non capivo come mai la mia aplicazione non funzionasse, sebbene
il tuo piccolo esempio lavorasse perfettamente.
Ti diro' che ero talmente convinto che nel mio caso cio' non funzionasse,
che mi sono impegnato come un matto a trovare un controesempio al tuo
codice, ma -paradosso dell'assurdo ^__^ - ho scoperto che questo
controesempio era in realta' proprio cio' che cercavo.
Per farla breve (dubito che tu abbia capito qualcosa di quanto appena
scritto, non mi sono capito nanch' io ^__^;), mettendo DoEvents all'interno
delle trasformazioni che faccio, riesco a visualizzare tutto "mentre accade"
e potendo fare qualsiasi cosa con/alla Form nel frattempo (cosa che tu
sapevi gia'...).
Ora funziona tutto. In qualche vecchio messagio ,pero', mi sembra di aver
letto che l'uso di DoEvents non e' molto consigliato (o perlomeno c'e' una
certa "scuola di pensiero" che lo sconsiglia laddove possibile). Che
contrindicazioni potrei avere?
Ti ringrazio ancora moltissimo (e' gia' la seconda volta che mi "svolti" la
situazione, e siccome non c'e' due senza tre...ho gia' inviato una nuova
richiesta ^_^;).
Saluti,
Davide.

 messaggio di Roberto Piazzolla.
Ecco Roberto... Hai visto cosa hai combinato con il tuo messaggio? :P
L'uso di DoEvents è altamente sconsigliato, a parte casi particolari.
E il tuo non è tra questi.
Trova un'altra soluzione!
Ciao

 E il tuo non è tra questi.
Ouff. Io non sono così contrario ai doevents. Bisogna solo usare parecchi
accorgimenti quando li si utilizza. ;-)
Comunque se il tempo di ridisegno dell'immagine è lungo, è meglio il
doevents del picture1.refresh. Se c'è una cosa che ritengo molto poco
professionale, è vedere programmi che non rinfrescano il video e che
sembrano bloccati in un loop infinito.
Questione di gusti, ovviamente.
Ciao
*Roby*

 richiesta ^_^;).
Ora la leggo, ma non prometto niente. ;-)
Ciao
*Roby*

Questione di gusti, ovviamente.
E' proprio questo il punto...che devo far vedere la trasormazione in tempo
reale. E in effetti, cosi', ci riesco.
Comunque provo a vedere se anche senza il DoEvents riesco in qualche modo.
Grazie,
Davide.

anche dal ciclo, che se non devi permettere l'unload della form.
Questo e' proprio cio' che chiedo nel nuovo messaggio, a cui comunque ho
gia' avuto risposta.
Di nuovo grazie,
Davide.

 gia' avuto risposta.
Tutto Ok, allora.
Ciao
*Roby*

 Comunque provo a vedere se anche senza il DoEvents riesco in qualche modo.
Ci riesci richiamando il refresh della picturebox invece del DoEvents. Però
io preferisco l'altro modo [per Zanna: "Cicca, cicca, cicca!" ;-)].
Ciao
*Roby*

 ha scritto nel messaggio
news:Fdyv7.7592$pm2.1...@news1.tin.it...

Fai un po' come ti pare :)
Spero che tutti i timers nella tua app si incrocino indistricabilmente
mentre sei in debug :)
Io non uso timers, doevents e end :P
Ciao

siano appunto riabilitati.
Sono un vero seccatore, lo so...ma come me lo definisco questo array?
Non ho resistito alla tentazione di scrivere un codice piů "elegante" e ho
provato definendo una variabile globale
Dim ArrayComandi (0 to 15) As Control
(tanto sono solo 15 i bottoni sulla mia form)
Poi, ho definito una routine
Private Sub MemorizzaBottoni()
   Dim Controllo As Control
   Dim i As Long
   i = 0
   For Each Controllo In Form_pict.Controls
      If TypeOf Controllo Is CommandButton Then
          ArrayBottoni(i) = Controllo
          i = i + 1
      End If
   Next
End Sub
Ora, secondo logica (la mia, almeno...forse bacata), il ciclo dovrebbe
memorizzare nel mio array esattamente 15 elementi che sono i CommanButton.
Solo che VB mi da un errore dicendo che la variabile oggetto non e'
definita.
Dunque, i la definisco, l'array e' di tipo Control...allora non e' corretto
l'assegnamento. Evidentemente non e' cosi' che funziona. Dove sbaglio?
Grazie,
Davide.

 definita.
Per le assegnazioni di oggetti, è necessario usare il l'istruzione Set. La
tua riga diventerà quindi:
Set ArrayBottoni(i) = Controllo
Vedrai che ora funziona.
Ciao
*Roby*

Diciamo che può andare, comunque.
Sarebbe meglio definirsela locale alla procedura che memorizza i controlli,
o in un modulo a parte? (solo per curiosita', mi fa piacere sapere le
convenzioni usate di solito dagli esperti)
Grazie ancora,
Davide.

 convenzioni usate
Sul sito comune c'è un bel documento scritto da Zanna che parla delle
convenzioni di scrittura del codice. Ad esempio un altro punto interessante
è quello del prefisso da usare per le variabili, in modo che sia
immediatamente comprensibile qualìè il loro tipo e livello di visibilità.
http://www.it-lang-vb.net/download.asp?file=Documentazione/Varie/convenzioni
.htm&ID=369
Ciao
*Roby*


Grazie ancora, l'ho scaricato stamattina.
Davide.