Newsgroup: it.comp.lang.visual-basic
Titolo: TIMER AAAARRRGGGHHHHH AIUTO !!!!!

simpatico progettino bestemmievole
progetto exe con 2 form;
Form1 ha una label, un bottone e un timer con interval 2000
codice per Form1:
Private Sub Timer1_Timer()
    Dim i%
    For i = 1 To 1000
        Label1 = CStr(i): Label1.Refresh
        DoEvents
    Next
End Sub
Private Sub Command1_Click()
    Form2.Show vbModal
End Sub
se premete command1 mentre la routine del timer e' 
attiva, il timer smette di esistere
la colpa e' tutta di quella maledetta doevents 
nel codice del timer, che fa si che il controllo
passi a chissa' chi senza tornare (non prima che
form2 non sia scaricata)
COME FACCIO A RISOLVERE QUESTO PROBLEMA ????
(la doevents e' una necessita', non la posso proprio
togliere)
(maledizione, odio visual basic, w il c++ !)
e' un problema piu' che urgente, prego cc in email !!!!
-- 
		Mauro Da Ros
 
da...@elettra80.com
	Elettra 80 s.r.l. @ 
www.elettra80.com

...


 ok?
non e' vero.
% come $, ! ecc. e' un abbreviazione per la dichiarazione e sta
per Integer
[---]
se Form2 non e' modal funziona, ma a me serve modal
che diavolo succede ????


temo che il problema sia il modo in cui rendi visibile il form2...
essendo un form "modal" per definizione nulla va + avanti finqundo il fomr
modale è attivo...
poi se il vb fa "schifo" perchè lo usi?? =)
usa il c++ no?? =D





Solo per questo non meriteresti di essere aiutato .....ma  tralasciamo :-)
Il problema che tu riscontri e' dovuto al fatto che vuoi aprire la form2 in
maniera modale. Quando fai cio', il codice nella form1 viene interrotto per
riprendere soltanto dopo, quando la form2 viene scaricata o nascosta (quindi
non dipende dal doevents come tu avevi diagnosticato).
Quindi una soluzione e' quella di aprire la form2 in maniera non modale.
Se invece sei obbligato ad aprire la form2 in maniera modale potresti
adottare il seguente trucchetto: prima di aprire la form2, disabiliti la
form1 successivamente apri in modo non modale la form2, che apparentemente
sembrera' aperta in maniera modale. Quando chiudi la form2 ti devi ricordare
di riabilitare la form1.
Spero di averti dato la soluzione (o per lo meno un aiuto che ti possa
condurre alla soluzione).
Ciao
Paolo

 usa il c++ no?? =D
lo uso :) e piano piano sto portando tutto il vb-ame a 
borland c++ (non ne voglio piu' sapere neanche di microzozz, 
e auguro a tutti di non aver mai bisogno del loro supporto tecnico)


Ciao,
prova con l'uso delle API di windows.
Queste non si fermano :-), cioe', succede quello che succederebbe
anche se il programma fosse scritto in assembler.
In pratica: quando premi il CommandButton interrompi il conteggio
ad un valore x, quando chiudi il Form2 il conteggio riprende
da x+1 e termina. Nel frattempo pero' i conteggi proseguono
regolarmente.
Sei sicuro di non poter usare il timer in modo diverso?
Questa soluzione non e' priva di pericoli, vedi,
ad esempio, le precauzioni che bisogna prendere per
poter chiudere il Form.
In pratica: l'ideale sarebbe che la procedura che gestisce
l'evento generato dal timer non fosse interrotta e finisse
certamente prima dell'arrivo di un secondo evento!
Saluti
Roberto G.
Modifiche al tuo progetto:
--- Form1.FRM
Dim iTim&
Private Sub Command1_Click()
     Form2.Show vbModal
End Sub
Private Sub Form_Load()
    iTim = SetTimer(Me.hWnd, 0&, 2000&, AddressOf TimerTic)
End Sub
Private Sub Form_Unload(Cancel As Integer)
    If TimerAttivo Then
        Cancel = True
    Else
        Call KillTimer(Me.hWnd, iTim)
        End
    End If
End Sub
---
--- Module1.BAS
Declare Function SetTimer Lib "user32" _
        (ByVal hWnd As Long, ByVal nIDEvent As Long, _
         ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Declare Function KillTimer Lib "user32" _
        (ByVal hWnd As Long, ByVal nIDEvent As Long) As Long
Public TimerAttivo As Boolean
Function TimerTic(ByVal hWnd As Long, _
                  ByVal msg As Long, _
                  ByVal idTimer As Long, _
                  ByVal dwTime As Long) As Long
    TimerAttivo = True
    Dim i%
    For i = 1 To 1000
        Form1.Label1 = CStr(i): Form1.Label1.Refresh
        DoEvents
    Next
    TimerAttivo = False
End Function
---

>simpatico progettino bestemmievole
    Primo: vorrei sapere perché uno fa un programmino bestemmievole.
    Secondo: come paolo ti fa notare il problema non è nel codice, ma nella
tua scarsa conoscenza del modo di windows di gestire le finestre all'interno
di una applicazione. Se tu chiedi a vb di crearti una finestra vbmodal
questa sarà vbmodal, ciò significa che il codice starà fermo sulla finestra
attiva. Per ottenere quello che vuoi guarda il msg di Paolo, oppure creati
una gestione dei form vbmodeless cose se fossero vbmodal, utilizzando la
proprietà hide dei form. Il problema spesso non è nel linguaggio ma di una
scarsa conoscenza del
sistema di funzionamento di win32.
    Terzo: l'uso di doevents lo sconsigliano anche alla ms, sono come i
puntatori in C li puoi usare solo se ne sei capace.
--
*-*-*-*-*-*-*-*-*-*-
*-*-* GGHI *-*-*
_*_*_*_*_*_*_*
* * * * Anti Spam: Rimuovere i numeri per l'indirizzo corretto * * * *
535gg...@dataproject.com
222gg...@hotmail.com
Sito comune programmatori Visual Basic
http://members.xoom.com/it_lang_vb

 puntatori in C li puoi usare solo se ne sei capace.
L'help di vb lo so leggere da solo; anche qui se c'e' quella DoEvents
ti riesce proprio difficile pensare che MI SERVE ?
-- 
		R.D.S. Mauro Da Ros
