Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2006
    Messaggi
    64

    [VB6] O è impazzito lui, o io!

    Scusate il titolo troppo generico, ma non sono riuscito a riassumere la questione in poche parole.

    Sto aggiungendo ad un programma una parte di codice che, attraverso un dialog, mostra vari conti alla rovescia consecutivi (in minuti/secondi/decimi), al termine di ognuno dei quali esegue un'operazione.

    Il Dialog ha come elementi:
    - Un timer (TimerScan)
    - Una label che mostra il conto alla rovescia (LabelTime)
    - Un tasto per mettere la pausa (non c'è nel codice di esempio)
    - Un tasto di uscita (non c'è nel codice di esempio)

    Il Problema:
    Una volta avviato il timer, il programma dovrebbe dovrebbe eseguire i conti alla rovescia (due nel codice di esempio) e mostrare i tre msgbox, uno ogni volta che entra in una nuova fase.
    La fase iniziale è 0, ma essendo le variabili del tempo inizializzate a 0, TimeValue sarà subito = 0 e si entrerà immediatamente nella fase 1, che darà inizio al primo conto alla rovescia per la fase due, e così via.

    Quel che accade invece è un continuo apparire dei MsgBox della fase 1.
    In pratica il programma entra continualmente nell'if della Sub TimerScan_Timer, esegue il MsgBox, ma NON incrementa la fase.
    E questo anche se elimino il Select-Case e metto un solo MsgBox dentro l'if.
    Una cosa che ho notato è che, nei primi ingressi dentro l'if, il timer mostra 0:00:-1, che non dovrebbe essere possibile.
    In pratica, se tolgo il MsgBox (o qualsiasi operazione complessa al suo posto), il timer pare funzionare correttamente.

    Altro strano problema è che, dopo l'unload del Dialog, continua a far apparire i MsgBox (che nell'esempio simulano le operazioni relative alle varie fasi).

    PS: cerchiamo di non discutere sul fatto che un altro metodo di implementazione del counter sarebbe stato migliore o peggiore, ma sul perchè questo non funziona!!

    Scrivo qui un codice riassuntivo.

    codice:
    Option Explicit
    Const NUM_PHASES As Integer = 3     '// numero di fasi implementate: 
                                        '// 1 -> attesa1; 2-> attesa2; 3 -> uscita
    Dim timeValue As Integer            '// Per determinare quando il conteggio arriva a zero
    Dim phase As Integer                '// Tiene memoria della fase in atto
    Dim decs As Integer
    Dim secs As Integer
    Dim mins As Integer
    Dim waits(NUM_PHASES) As Integer    '// Ritardo tra una fase e l'altra, ossia valore di inizio 
                                        '// per il conto alla rovescia. Qui per semplicità si possono
                                        '// impostare solo i secondi, da 0 a 59
    
    '// Inizilalizzazioni
    Private Sub Form_Activate
        waits(0) = 0
        waits(1) = 3
        waits(2) = 4
        waits(3) = 0
        
        phase = 0
        decs = secs = mins = 0            
    End Sub
    
    '// Valuta e decrementa il tempo, gestisce le fasi, avvia le operazioni relative alle fasi. 
    Private Sub TimerScan_Timer()
        
        '// Aggiorno la label di visualizzazione del tempo
        LabelTime.Caption = FormatTime()
        '// Calcolo per la valutazione del tempo (se = 0 il conto alla rovescia è terminato)
        timeValue = decs + secs + mins
        
        If timeValue = 0 Then    '// Se il conto alla rovescia è terminato
            '// Modifico la fase
            phase = phase + 1
            '// Assegno il nuovo conto alla rovescia 
            '// (Semplificato: imposto solo i sencondi)
            secs = waits(phase)
            
            '// Eseguo le operazioni (Qui semplificate con un MsgBox)
            Select Case phase
                Case 1
                    Msgbox "Fase 1"
                Case 2
                    Msgbox "Fase 2"
                Case Else '// Chiude il Dialog
                    Msgbox "Fase 3"
                    Unload Me
            End Select
        End If
        
        '// Decremento il tempo
        NextTime
    End Sub
    
    '// Decrementa decs e modifica di conseguenza i valori di secs e mins
    Private Sub NextTime()
        decs = decs - 1
        If decs < 0 Then
            decs = 9
            secs = secs - 1
            If secs < 0 Then
                secs = 59
                mins = mins - 1
            End If
        End If
    End Sub
    
    '// Formatta la stringa tempo
    Private Function FormatTime() As String
        FormatTime = mins & ":" & Format(secs, "00") & ":" & decs
    End Function
    La risposta è dentro di te...
    ... e però, è sbagliata!

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Non esprimo alcun giudizio sul codice ma, a me non da' il problema di cui parli ...

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2006
    Messaggi
    64
    Ecco, ti pareva...

    Ho aggiunto un DoEvents come prima riga dellla funzione NextTime, e ora non da più il problema dei msgbox.
    In compenso la variabile phase non viene aumentata se non la prima volta... rimane sempre ad 1.

    PS: Un parere è più che lecito... volevo solo evitare risposte tipo: "fai il counter in altro modo!"



    EDIT:
    Forse il problema risiede in parte in form_activate
    Ho messo li un msgbox e lo visualizza di continuo di fatto bloccandomi il programma... (ho dovuto terminarlo dal task manager).
    Comunque, per la cronaca, ho già provato a riavviare l'ambiente di sviluppo, e anche il PC, ma senza risultato.
    La risposta è dentro di te...
    ... e però, è sbagliata!

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Finche' non riproduco il problema, non so cosa dirti.

    Ho provato il codice così come l'hai mostrato. Se hai altro codice nel tuo programma, forse dipende da quello.

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2006
    Messaggi
    64
    Il resto del programma è slegato da questo dialog.
    Tutto quello che trovi, è un tasto che lo avvia (dialog.show)

    Per le prove, ora, sto usando un codice molto simile a quello che ti ho passato, scarnificato (ci sono in più solamente i due tasti di pausa e chiusura e l'aggiornamento di una label), quindi non credo dipenda neppure da quello.

    Grazie lo stesso

    Ultimo appunto: che versione dell'ambiente di sviluppo stai usando per compilare?
    Comincio a temere che sia la mia ad essere una schifezza!
    La risposta è dentro di te...
    ... e però, è sbagliata!

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    VB6 SP6 su XP SP2 naturalmente ...

    Prova a mettere a disposizione uno zip del progetto che ti da' l'errore ...

  7. #7
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472

    Moderazione

    Originariamente inviato da calabar
    Scusate il titolo troppo generico, ma non sono riuscito a riassumere la questione in poche parole.
    Ci potevi almeno provare...
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  8. #8
    Utente di HTML.it
    Registrato dal
    Oct 2006
    Messaggi
    64
    Io ci ho provato, ma il problema non è il conteggio in se, che mi pare semplice, quanto il fatto che VB mi paia impazzito e mi dia questi strani sintomi...
    Insomma, mi è parso il titolo meglio descrittivo del problema

    @Oregon
    La mia versione di VB è:
    Microsoft Visual Basic 6.0

    Version 8176
    VBA: Retail 6.0.8169
    Forms3: 11.0.5601
    Ma devo ammettere di non saperla interpretare... dove colgo se è installato SP e quale?

    Volevo allegare il progettino, ma il forum permette di allegare solo immagini...
    La risposta è dentro di te...
    ... e però, è sbagliata!

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Mettilo in un sito che permette di condividere file gratuitamente ... rapidshare ad esempio ...

    P.S. Il VB dovrebbe essere

    Visual Basic 6.0 (SP6)

    Version: 9782
    VBA: Retail 6.0.9782
    Forms3: 11.0.6550

  10. #10
    Prova quindi ad installare il Service Pack 6 di VB6; anche a me alcuni programmi davano errori inspiegabili prima di installarlo.
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.