Newsgroup: it.comp.lang.visual-basic
Titolo: E' possibile interrompere un ciclo???

Ciao a tutti,
ho un ciclo che per adesso e del tipo For Next ma puo' essere ovviamente
adattato con Do Loop.
A me servirebbe poter sfruttare la vecchia e cara funzione INKEY$ del QBasic
che mi permetteva alla pressione del tasto ESC di uscire dal ciclo suddetto
e terminare dunque le operazioni.
Il problema e' che tali operazioni sono calcoli molto complessi eseguiti su
diversi frame immagine uno dopo l'altro e dunque anche utilizzando l'evento
KeyPress del CommandButton che fa partire il ciclo, non ottengo nulla
poiche' fin quando non termina tutto il loop dei cicli, il focus non
riemerge e non e' possibile fare alcuna altra azione.
Nel vecchio e caro QBasic bastava introdurre dentro il ciclo INKEY$ e
valutare l'asci assegnato alla pressione di un tasto. Se era quello da me
aspettato, allora veniva interrotto il ciclo. Purtroppo mi e' sembrato di
capire che in VB non posso fare cio'.
Come posso ovviare a tale inconveniente???
P.S: Allego un pezzettino di codice di esempio per intenderci su come in VB
dovrebbe funzionare.
Uso ad esempio Do Loop
-----------
Start:
Do
    x = x +1
    Label1.Caption = x
    Label1.Refresh = True
Loop
End:
------------
Ovvio che il numero x stampato dalla label crescera' e non c'e' verso di
fermare questo ciclo se non imposto un valore di soglia del tipo
If x = 2000 then Goto End
Allora come potrei con la pressione del tasto ESC ad esempio riuscire ad
arrestare tale ciclo??
Grazie a tutti anticipatamente.
Ciao
Salvo

Inserisci dentro al ciclo un Doevents (che rallenta l'esecuzione ma permette
di intercettare gli altri eventi) e poi controlla l'evento keypress...
ciauz|!

 wrote in message
8eadid$4cf$1...@lacerta.tiscalinet.it...


 arrestare tale ciclo??
a livello di form:
dim goloop as boolean
un cmdStop settato a cancel = true (intercetta esc, direi)
cmdstop_click -> goloop = false
poi:
goloop=true
do
    x = x +1
    label1 = x
    doevents
   if not goloop then exit do
loop
non mi ricordo se come in clipper puoi fare
    do while goloop
senza l'if dentro al ciclo.
ciao, a.

di intercettare gli altri eventi) e poi controlla l'evento keypress...
Una precisazione: Doevents rallenta molto l'esecuzione del ciclo, quindi se
stai facendo calcoli complessi, esegui Doevents solo ogni 50/200 cicli.
Ciao a tutti, vi tengo d'occhio... ;-)
Flavio Ronco

 senza l'if dentro al ciclo.
eccome! si possono fare anche do until, loop while e loop until. Hanno
addirittura lasciato il vecchissimo While ... Wend

 ha scritto


while wend e' stato una scoperta !
e lo uso ogni volta che posso anche perche' mi sembra una soubrette...
questo e' vero (-1) neolinguismo: WEND !!
povero shakespeare...

 riuscire ad arrestare tale ciclo??
Un modo (macchinoso ma con qualche pregio, secondo me)
potrebbe essere quello illustrato dal codice qui sotto. Credo
che, a differenza di DoEvent, permetta un maggior controllo.
Option Explicit
' Controlli su Form1:
' -------------------
' Label1  : Stessa funzione del tuo esempio;
' Label2  : Debug. Mostra l'attivita` di Timer1;
' Command1: Avvia il ciclo For ... Next;
' Command2: Interrompe il ciclo;
' Timer1  :
'
' FSA  = Finite State Automaton;
' FSAE = Event
' Pgm1 = Il "programma" che esegue il ciclo;
' Pgm2 = Un eventuale secondo "programma".
Const conm_intFSAIdle As Integer = 0
Const conm_intFSAPgm1 As Integer = 1
Const conm_intFSAPgm2 As Integer = 2
Const conm_intFSAEOnLoad      As Integer = 0
Const conm_intFSAETimer       As Integer = 1
Const conm_intFSAEPgm1Start   As Integer = 11
Const conm_intFSAEPgm1End     As Integer = 12
Const conm_intFSAEPgm1Cancel  As Integer = 13
Const conm_intFSAEPgm2Start   As Integer = 21
Const conm_intFSAEPgm2End     As Integer = 22
Const conm_intFSAEPgm2Cancel  As Integer = 23
Private Sub Init( _
)
  Let Timer1.Enabled = False
  With Label1
    Let .AutoSize = True
    Let .Caption = ""
  End With
  With Label2
    Let .AutoSize = True
    Let .Caption = ""
  End With
  With Command1
    Let .Caption = "Avvia"
    Let .Default = True
    Let .Enabled = True
  End With
  With Command2
    Let .Caption = "Annulla"
    Let .Cancel = True
    Let .Enabled = False
  End With
End Sub
' Ciclo For .. Next interrompibile
' -------------------------------------------
' For sta_lngIndex = con_lngFrom To con_lngTo
'   ...
' Next
' -------------------------------------------
Private Function intPgm1( _
  ByVal intEvent As Integer _
)
Const con_lngFrom   As Long = 0
Const con_lngTo     As Long = 100
Static sta_lngIndex As Long
  Select Case intEvent
  Case conm_intFSAETimer
    If sta_lngIndex > con_lngTo Then
      Call FSA(conm_intFSAEPgm1End)
      Let intPgm1 = conm_intFSAIdle
    Else
      With Label1
        Let .Caption = sta_lngIndex
        Call .Refresh
      End With
      Let sta_lngIndex = sta_lngIndex + 1
      Let intPgm1 = conm_intFSAPgm1
    End If
  Case conm_intFSAEPgm1Start
    Let sta_lngIndex = con_lngFrom
    Let Command1.Enabled = False
    Let Command2.Enabled = True
    With Timer1
      Let .Interval = 1
      Let .Enabled = True
    End With
    Let intPgm1 = conm_intFSAPgm1
  Case conm_intFSAEPgm1Cancel, conm_intFSAEPgm1End
    Let Timer1.Enabled = False
    Let Command2.Enabled = False
    Let Command1.Enabled = True
    Let intPgm1 = conm_intFSAIdle
  Case Else
    Call MsgBox("Errore.", vbCritical + vbOKOnly, "PGM1")
  End Select
End Function
Private Sub FSA( _
  ByVal intEvent As Integer _
)
Static sta_intFSA As Integer
  Select Case sta_intFSA
  Case conm_intFSAIdle
    Select Case intEvent
    Case conm_intFSAEOnLoad
      Call Init
    Case conm_intFSAEPgm1Start
      Let sta_intFSA = intPgm1(intEvent)
    Case conm_intFSAEPgm2Start
    ' Let sta_intFSA = intPgm2(intEvent)
    Case Else
      Call MsgBox("Errore.", vbCritical + vbOKOnly, "FSA(1)")
    End Select
  Case conm_intFSAPgm1
    Let sta_intFSA = intPgm1(intEvent)
  Case conm_intFSAPgm2
  ' Let sta_intFSA = intPgm2(intEvent)
  Case Else
    Call MsgBox("Errore.", vbCritical + vbOKOnly, "FSA")
  End Select
End Sub
Private Sub Command1_Click( _
)
  Call FSA(conm_intFSAEPgm1Start)
End Sub
Private Sub Command2_Click( _
)
  Call FSA(conm_intFSAEPgm1Cancel)
End Sub
Private Sub Form_Load( _
)
  Call FSA(conm_intFSAEOnLoad)
End Sub
Private Sub Timer1_Timer( _
)
  ' Dimostra l'attivita` di Timer1.
  '
  With Label2
    Let .Caption = Format$(Now)
    Call .Refresh
  End With
  Call FSA(conm_intFSAETimer)
End Sub
Come vedi non ho scritto troppi commenti perche' mi illudo di
aver usato una scrittura autoesplicativa...
Ti prego, non fare paragoni con "INKEY$" o "DoEvents" perche`
gli scopi sono diversi.
--
Ciao.
Maurizio

 wrote in message
8fejq8$ooa$4...@nslave2.tin.it...
