Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Strano comportamento di DoEvents in un ciclo. (perchè sono insesperto)

Ho il seg. codice:
Private Sub mnupunti_Click()
Dim i As Integer, h As Integer
Form9.BackColor = vbBlack
PSet (0, 0), vbWhite
For i = 1 To 10000 Step 1
    For h = 0 To 5000
       PSet (i, h), vbWhite
       DoEvents
    Next
    DoEvents
Next
End Sub
Come potete vedere ho messo due volte DoEvents, in modo da poter chiudere il
programma senza attendere la fine del ciclo. Il bello è che io riesco a
chiudere il form ed anche il programma, ma: RIMANE IN ESECUZIONE....Ovvero
il pulsante di avvio non risulta disponibile, e risultano disponibili solo
quelli di Stop e Pausa, segno che il programma è ancora in esecuzione.....
Posso terminare solo chiudendo l'IDE..
Dove ho sbagliato?
Grazie mille.

Occhio ad usare così tanti DoEvents....rallentano molto i cicli!
Prova a vedere se hai scaricato correttamente tutti i Form!
(Set Form=nothing)
Ciao SIMO
--
__________________
www.sasim.cjb.net


 Dove ho sbagliato?
Nel Chiamare la PSet(), che essendo un metodo del form quando viene chiamata
ti fa un bel Form_Load().
E comunque credo che il loop debba essere eseguito comunque fino alla fine,
anche a form "scaricateo".
(1) Eviterei almeno il Doevents più interno (rallenta il ciclo e è inutile
chiamarlo troppo spesso)
(2) Controllerei prima del PSet se è stata richiesta la chiusura del form, o
meglio ancora farei un Exit for.
    Valuterei anche la possibilità di usare la SetPixel() al posto di
PSet(), senz'altro migliore e non ti tiene in vita il form.
Ciao

 --
Si, infatti l'ho notato? Per quale motivo accade?Volevo provare il Nothing
ma non sapevo se potevo usarlo per l'oggetto Form e cmq io uso il metodo
Unload, come mi è stato suggerito, piuttosto che l'anonimo End.
Ora cmq provo a vedere se funziona.....vediamo........
No, niente da fare.....ho provato sia
Private Sub mnuesci_Click()
Set Form9 = Nothing
Unload Form9
End Sub
sia
Private Sub mnuesci_Click()
Unload Form9
Set Form9 = Nothing
End Sub
Il primo codice ovviamente non produce niente.........il secondo
apparentemente scarica il form, ma non è così, nemmeno se chiudo il
programma........Devo per forza chiudere l'IDE. A questo punto mi chiedo
perchè la routine rimanga in esecuzione..........quante cose da imparare ho
ancora :-))
Spero in altri tuoi suggerimenti.
Ciao e grazie.

 ancora :-))
Mi pare che te lo abbia già detto Zanna: devi uscire dal loop,
se hai codice attivo magari End funziona[1], ma Unload no.
Fai così: setta un flag esterno alla routine, nelle dichiarazioni
del form, e controllalo all'interno del loop.
Metti in "Generali" del form:
    Dim blnInUscita as Boolean
In Form_Unload metti:
    blnInUscita = True
E modifica la routine così:
Private Sub mnupunti_Click()
Dim i As Integer, h As Integer
Form9.BackColor = vbBlack
PSet (0, 0), vbWhite
For i = 1 To 1000 Step 1 '<- step 1 a cosa serve ? tanto vale toglierlo
If blnInUscita Then Exit For ' ogni riga verticale controlli
DoEvents
    For h = 0 To 5000
       PSet (i, h), vbWhite
'       DoEvents ' questo rallenta troppo :-) aggiorna ogni riga
    Next
    DoEvents
Next
End Sub
[1] Ed è per questo che è sconsigliato... ;-)
Bye, G.

 chiudere il form ed anche il programma, ma: RIMANE IN ESECUZIONE....
Quando scarichi la form, non termini il codice eventualmente in esecuzione.
Se questo codice fa riferimento ad un elemento della form stessa, questa si
ricarica automaticamente, ma anche in caso contrario il codice continua a
girare fino ad arrivare a compimento (e impedendo il termine del programma).
Per evitare questo inconveniente devi inserire un controllo con una
variabile booleana:
 For i = 1 To 10000 Step 1
     For h = 0 To 5000
        PSet (i, h), vbWhite
        DoEvents
        if GbRichiestaInterruzioneUtente then
           exit for
        endif
     Next
     if GbRichiestaInterruzioneUtente then
        exit for
     endif
     doevents
Next
Dichiari GbRichiestaInterruzioneUtente come variabile booleana a livello di
form. Nell'evento click del pulsante di Stop, prima dell'unload della form
fai  GbRichiestaInterruzioneUtente=True. In questo modo il ciclo termina
naturalmente e l'unload ha luogo senza inconvenienti.
Ciao
*Roby*

 [1] Ed è per questo che è sconsigliato... ;-)
E già :-))
Grazie cmq


Grazie  mille, credo di aver imparato uan cosa molto importante :-)

 Perchč hai inserito 3 DoEvents? Non rallenta troppo il codice?
Beh, il primo viene eseguito solo 1000 volte, e volendo si puň
togliere, l'ho messo per sbaglio :-))), il secondo č remmato, occhio !
L'unico che serve č il terzo.
Bye, G.

[...CUT...]
Ciao Papero, ho fatto come hai detto. Allora se clicco sul pulsante cmdesci
Private Sub cmdesci_Click()
Unload Form9
End Sub
il form non si scarica anche se la variabile gUscita è impostata a True
Però posso cliccare sul pulsante Stop nell'IDE e termino il
programma....l'unica cosa cambiata....Perchè il ciclo continua ancora :-(
Beh.....penso che si sia detto tutto cmq :-)

 PSet(), senz'altro migliore e non ti tiene in vita il form.
Ho cercato SetPixel() in MSDN ma non l'ho trovata. Dove sta?

 Ho cercato SetPixel() in MSDN ma non l'ho trovata. Dove sta?
non so che razza di MSDN hai ma nel mio c'è :)
COLORREF SetPixel(
  HDC hdc,           // handle to device context
  int X,             // x-coordinate of pixel
  int Y,             // y-coordinate of pixel
  COLORREF crColor   // pixel color
);
mk:@MSITStore:D:\Programmi\MSDN98\98VSa\1040\GDI.chm::/devdoc/live/pdgrmm/bi
tmaps_3030.htm
idem su Api-Guide
Declare Function SetPixel Lib "gdi32" Alias "SetPixel" (ByVal hdc As Long,
ByVal x As Long, ByVal y As Long, ByVal crColor As Long) As Long
--
Fibia "Service Bot" FBI
E-mail: 
fibi...@hotmail.com
ICQ UIN 63586057
Sito Personale: 
http://www.geocities.com/fibiafbi
VB Simple: 
http://vbsimple.virtualave.net
Membro #26 delle Mitiche Brigate Takahashi sezione Sud