[ oggie @ 27.11.2007. 14:20 ] @
Imam mdi formu frmMain. U okviru nje otvaram formu frmTest. Na formi Test imam dva dugmeta OK i CANCEL sa sledecim kodom:

Code:

Private Sub cmdOK_Click()

   stop=false
   do while Neki Uslov
        DoEvents
        if Stop=true then exit do
       'ovde nesto radi, ceka na neke podatke u petlji
   loop

End Sub

Private Sub cmdCANCEL_Click()

     stop=true
  
End Sub

U cemu je problem? Na frmTest ja pritisnem dugme OK i zavrti se petlja, ja kliknem dugme CANCEL i promenljiva stop se setuje na false. Zatim zatvorim formu Test i ostane mi frmMain na ekranu. Medjutim posle nekog vremena meni opet iskoci forma Test i nastavlja Do while petlju...i prepoznaje da je stop =false i tada staje.
Kako da sprecim da mi se forma Test ponovo podize? Kako da bezuslovno zaustavim DoEvents, tj petlju?

[Ovu poruku je menjao Aleksandar Ružičić dana 28.11.2007. u 04:51 GMT+1]
[ Aleksandar Vasic @ 27.11.2007. 16:06 ] @
Stop postoji u VB-u kao definisana komanda hehehe

Ne znam kako je uspeo da ti prodje kôd jer mu ne mozes dodeliti True ili False

a i ja mislim da bi ta promenljiva trebala da bude globalna,recite mi ako greshim :D
[ Aleksandar Ružičić @ 28.11.2007. 03:50 ] @
da, promenljiva mora da bude globalna da bi se videla u oba modula (tj forme)

da bi definisao promenljivu kao global mozes da:

1. definises public promenljivu u modulu (znaci ne u formi, u "obicnom" modulu):
Code:

Public bStop As Boolean ' The End je u pravu, ne mozes promenljivoj da das naziv stop, mozes nesto kao bStop npr


i onda bi u svako formi promenljivoj pristupao samo preko njenog imena, tj u obe forme (tacnije u svim modulima) mozes da koristis promenljivu bStop

2. definises public promenljivu u nekoj od formi:
Code:

Public bStop As Boolean


i onda promenljivoj pristupas preko te forme, tj koristis frmMain.bStop ako si deklarisao promenljivu u frmMain



p.s. koristi code tagove ubuduce kad postujes kod.
[ Aleksandar Ružičić @ 28.11.2007. 03:56 ] @
aaa tek sam sad lepo procitao post, elem pokusaj da pri izlasku iz petlje ubijes formu:
Code:

 Do While NekiUslov

    DoEvents

    If bCancel Then    
        NekiUslov = false ' ovo postavi ako mozes (tj promeni bar jednu promenljivu koja ti se nalazi u NekiUslov tako da ceo uslov bude False) za svaki slucaj
        Unload Me
    End If

 Loop


a mogao si i bCancel da ubacis u uslov:
Code:

   Do WHile NekiUslov And Not bCancel

     DoEvents

     ' do something smart here

   Loop

   If bCancel Then
      Unload Me
   Else
      ' ako ti je potreban ovaj slucaj (kad je petlja zavrsena ali nije pritisnut Cancel)
   End If
[ oggie @ 28.11.2007. 07:34 ] @
Na brzinu sam pisao pa je mozda nesto ostalo nejasno.

1. Promenljiva jeste globalna i ne zove se Stop, to sam napisao radi lakseg razumevanja....zapravo je Stani as Boolean
2. Ja ne mogu pri izlasku iz petlje da ubijam formu. Na formi Test se nalazi 5 dugmica koji predstavlaju neke komande koje rade posao u petlji. Znaci korisnik pritisne jedno dugme, odradi posao, forma je i dalje tu da bi mogao ako zeli da pritisne drugo dugme.
3. Ne znam da li ste dobro shvatili, problem je kada kliknem Cancel i ZATVORIM formu, globalna promenljiva Stani se setuje na false, ali on sam ponovo ucita formu i nastavi petlju tamo gde je stao i kad vidi da je Stani false tada zavrsi.

Znaci kako da ubijem procese kada sa unload zatvorim formu, kako da zaustavim tu petlju?
[ Aleksandar Ružičić @ 28.11.2007. 08:40 ] @
1. jesi li 100% siguran da ti se Stani resetuje na Unload forme? (debaguj aplikaciju i dodaj Watch na tu promenljivu)
2. od kojih ti promenljivih zavisi uslov? (jesi li stavio tu Stani promenljivu u uslov?)
3. ako ti ova prva dva ne pomognu daj tu petlju da vidimo sta se desava (ovako bez koda mogu da nagadjam kolko hoces)
[ oggie @ 28.11.2007. 08:50 ] @
1. Na Unload forme radim Stani=false 100% siguran

2. Kod izgleda ovako:
Code:

                    Do While broj = 0
                        If Stani = True Then
                            lstPoruka.AddItem "Nema odgovora... " & Now
                            Exit Do
                        End If
                        DoEvents
                        If obj.DajSqlUpit(rsP, Upit) Then 'uzimam iz baze neki recordset
                        End If
                        If rsP.RecordCount <> 0 Then
                            broj = rsP.RecordCount
                            Screen.MousePointer = vbNormal
                            lstPoruka.AddItem "Odgovoreno na zahtev... " & Now
                         Else
                            Call Pauza(30) 'cekam 30 sekundi
                        End If
                        
                    Loop


Znaci kada posaljem neki zahtev, treba u bazu nesto da se upise ali ne odmah, tako da u petlji cekam na taj odgovor. Dokle god je broj=0 znaci da nema odgovora i ja ga vrtim u petlji.
Kada uradim unload forme tamo se setuje Stani=false, ali posle 30 sekundi forma se sama podigne i u debageru krene od linije Do While.....i tada vidi da je Stani = false i zavrsi sa petljom.

Znaci ako je korisnik uradio unload forme njega taj proces, tj. odgovor vise ne zanima, kako da ubijem to sto se u petlji vrti i dalje? Kako da sprecim formu da se sama podigne i nastavi sa Do while...?

[Ovu poruku je menjao Aleksandar Ružičić dana 28.11.2007. u 16:54 GMT+1]
[ Aleksandar Ružičić @ 28.11.2007. 16:00 ] @
daj kod za Pauza proceduru, verovatno tu imash neku petlju koja se ne prekida
[ oggie @ 29.11.2007. 07:14 ] @
Code:

Public Sub Pauza(ByVal BrojSekundi As Single)
    
    Dim d As Integer
    Dim t As Single
    t = Timer
    
    Do While Timer - t < BrojSekundi
        d = DoEvents()
        If Timer < t Then
            t = t - CLng(24) * CLng(60) * CLng(60) * CLng(1000)
        End If
    Loop

End Sub


[Ovu poruku je menjao Aleksandar Ružičić dana 29.11.2007. u 13:53 GMT+1]
[ Aleksandar Ružičić @ 29.11.2007. 12:52 ] @
i Pauza procedura i ona petlja su ti nepotrebni, koristi Timer, i kad zatvaras formu samo stavi Timer1.Enabled = False
to ti je najelegantnije resenje


p.s. koristi code tagove kad postujes kod
[ oggie @ 29.11.2007. 14:26 ] @
Eh, Timer me nervira samo tako jer ne mogu da stavim veci interval od 65,535 milisekundi, tj 1 minuta. Zato sam napravio funkciju Pauza. Probacu nesto da izmenim.
Hvala na trudu
[ Aleksandar Ružičić @ 29.11.2007. 16:46 ] @
Pazi, to sto je Timer (tj njegov interval) ogranicen na 65 535 milisekundi ne znaci da ne mozes pomocu njega da izvrsavas nesto na recimo 5 minuta.

evo npr kako pomocu Timera da prikazes MsgBox svakih 5 minuta:
Code:

Private lElapsed As Long
Private lInterval As Long ' u sekundama

Private Sub Form_Load()

   lInterval = 5 * 60       ' 5 minuta

   StartTimer

End SUb

Private Sub StartTimer
   lElapsed = 0
   Timer1.Interval = 1000
   Timer1.Enabled = True
End Sub

Private Sub Timer1_Timer()
   lElapsed = lElapsed + 1 
   If lElapsed >= lInterval * 1000 Then
      lELapsed = 0
      
      ' ovde izvrsavas kod:

      MsgBox "Bla"

   End If
End Sub


i tamo gde zatvaras formu (a ne unistavas je) postavi Timer1.Enabled = False
[ oggie @ 30.11.2007. 07:42 ] @
Ma znam ja da mogu da koristim timer i za vise minuta, ali mi je krajnje glupo da je njegov interval tako ogranicen i onda moras izokola da brojis minute. Kad je vec napravljena kontrola ne razumem zasto je interval ogranicen...ali dobro...
Hvala za kod, moracu ceo kod da pretresem i da vidim da uradim na drugi nacin. Trenutno sam u guzvi oko nekog drugog posla pa ne stizem.