Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 22
  1. #1

    [VB6] - Visualizzazione frame con checkbox (tipo menu a tendina)

    Salve ragazzi, ciao moderatori.

    Non so se il titolo è appropriato.
    Cmq, avrei un problema che mi sta facendo uscire matto.
    Su una form ho 5 frame indicizzati (all'interno dei quali ci sono dei dati raggruppati per tipo).
    I frame si chiamano:

    FrameDati(1)
    FrameDati(2)
    FrameDati(3)
    FrameDati(4)
    FrameDati(5)

    e sono disposti uno sotto l'altro, piu o meno cosi:

    ----------
    | |
    | |
    ----------

    ----------
    | |
    | |
    ----------

    ----------
    | |
    | |
    ----------

    ----------
    | |
    | |
    ----------

    ----------
    | |
    | |
    ----------

    L'apertura della form avviene tramite pulsante sistemato in una form precedente sulla quale ci sono 5 checkbox che indicano se il corrispondente frame nella form che si va ad aprire deve essere visualizzato o meno.
    All'apertura della form con i frame, scansiono i checkbox della form precedente e se è impostato a off allora imposto una variabile di stato (stato(i)) booleana a false, e viceversa. Poi lancio la sub ImpaginaFrame (che riporto di seguito) e, a seconda di quale variabile stato(i) è true o false attivo o disattivo il frame corrispondente.

    Se un frame non viene visualizzato allora quelli che seguono devono prendere il suo posto, scalando, nella rappresentazione, verso l'alto. Questo per impedire che ci siano dei buchi tra un frame e la'ltro.
    E' una cavolata, lo so ...ma ci sto sbattendo il muso da un po' e non vedo dove commetto l'errore.
    Alla prima chiamata della form, se uno o piu check sono impostati a off, il corrispondente frame viene disattivato e non visualizzato e gli altri vengono scalati verso l'alto, correttamente.
    Se ora chiudo la form, reimposto a on i/il check che avevo impostato a off e riapro la form, mi aspetto che la sub ricalcoli il tutto e imposti come voglio io i frame. E invece non succede. I frame rimangono nello stesso posto e non viene reinserito il frame che deve essere rivisualizzato.

    Posto il codice:


    --------------------------------------------------------------------
    Private Sub ImpaginaFrame()

    'Coordinate dei FRAME DATI
    Dim coordx As Integer
    Dim coordy As Integer

    Dim i As Integer 'contatore
    Dim c As Integer 'contatore
    Dim ContMax As Integer



    'La variabile 'Stato' è definita all'inizio del modulo come: dim stato(5) as boolean


    'Coordinate dei FRAME
    coordx = 10440
    coordy = 1200 'coordinata di partenza ( =angolo sup-sin del FrameDati(1) )


    'Coordinate X (tutte uguali per i 5 frame)
    For i = 1 To 5
    FrameDati(i).Left = coordx
    Next i

    ContMax = 5 '5 Frame da impaginare

    For i = 1 To ContMax 'Scorre i 5 frame
    If stato(i) = True Then
    FrameDati(i).Top = coordy 'Assegna al form interessato la coordinata piu alta
    FrameDati(i).Visible = True 'Visualizza il form interessato
    coordy = coordy + FrameDati(i).Height + 20 'imposta il Coordy successivo
    Else
    FrameDati(i).Visible = False 'Visibilità
    End If
    Next i

    End Sub
    --------------------------------------------------------------------


    Magari qualcuno di voi vede dove sto sbagliando..
    grazie anticipatamente

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    759
    Così a occhio non vedo errori, a parte una certa sovrabbondanza di variabili.
    Sei sicuro che la routine ImpaginaFrame venga rieseguita ad ogni apertura del form? Da quale evento la richiami?

    Poi, per favore, quando posti del codice usa gli appositi tag (pulsante #) per renderlo più leggibile.

  3. #3
    ciao grumpy,
    non sapevo che c'era un modo per postare (#). Lo imparerò.
    Non sono tante le variabili, ma a parte questo non riesco a capire neanche io dove sbaglio.
    La form che esegue la routine ImpaginaFrame si chiama frmStampaPreview.
    La routine ImpaginaFrame è eseguita ad ogni load della form come di seguito:


    Private Sub Form_Load()
    Call ...
    Call ...
    Call ...
    Call ImpaginaFrame
    End Sub


    Quando esco dalla form frmStampaPreview eseguo questo:


    Private Sub Annulla_Click()
    Unload frmStampaPreview
    frmStampa.Show 1
    End Sub


    per evitare di mantenere in memoria eventuali variabili. Ma cmq, quando la riapro, ho controllato, che le variabili dei check e stato(i) vengono impostate correttamente (cioe a seconda di come vengono ri-settate)

  4. #4
    prova a mettere

    codice:
    Private Sub Annulla_Click()
        Dim i As Integer
        For i = 1 To 5
            stato(i) = False
            framedati(i).Visible = False
        Next i
        Unload Me
        frmStampa.Show 1
    End Sub
    al posto di

    codice:
    Private Sub Annulla_Click()
    Unload frmStampaPreview
    frmStampa.Show 1
    End Sub
    Potresti inoltre postare la routine in cui apri frmStampaPreview?

    PS=Quando posti i codici usa il tag CODE tra [] (leggi qua se non capisci http://forum.html.it/forum/misc.php?...bbcode#buttons)

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    759
    Se non mostri tutte le parti di codice interessate al problema è impossibile trovare l'errore. Per esempio non è dato di sapere dove imposti i valori booleani nel vettore stato(); probabilmente non nel Form_Load.
    Tra l'altro, come ti avevo anticipato, questo vettore è inutile in quanto nella Sub ImpaginaFrame puoi fare riferimento direttamente al valore delle CheckBox anziché a stato(i).

    non sapevo che c'era un modo per postare (#). Lo imparerò.
    Lo hai detto ma non lo hai fatto.

  6. #6
    ciao andrea,
    grazie anche a te per l'aiuto.
    Ho provato il tuo codice ma nulla di fatto. I frameDati rimangono sempre come sono stati impostati la prima volta.

    Per grumpy:
    le variabili stato(i) vengono impostate nel load della form. Per ogni FrameDati(i) scrivo questo a seconda di come è impostato il check corrispondente nella form precedente:

    codice:
    'FrameDati(1)
      If frmGraficoCircuito.Check2.Value = 1 Then
        Label78.Caption = Nome
        Label79.Caption = Camera
        Label80.Caption = Settaggio
        Label81.Caption = Quantità
        Label82.Caption = Numero
        stato(1) = True  
      Else
        stato(1) = False
      End If

    PS: spero che il [code] funzioni !

  7. #7
    le varibili stato(i) vengono correttamente aggiornate e lette all'interno della sub:

    codice:
    Private Sub ImpaginaFrame()
    
      Dim coordx As Integer
      Dim coordy As Integer
      
      Dim i As Integer          'contatore
      Dim c As Integer          'contatore
      Dim ContMax As Integer
      
      
      'La variabile     'Stato'     è definita all'inizio del modulo
      
    
      
       'Coordinate dei FRAME
        coordx = 10440    coordy = 1200       'coordinata di partenza   
       
       
        FrameDati(1).Visible = True
        FrameDati(2).Visible = True
        FrameDati(3).Visible = True
        FrameDati(4).Visible = True
        FrameDati(5).Visible = True
       
       
       [color=red]
        List1.Clear
        List1.AddItem  Check 2= " & frmGraficoCircuito.Check2.Value & "  |    Stato= " & stato(1)
        List1.AddItem  Check 3= " & frmGraficoCircuito.Check3.Value & "  |    Stato= " & stato(2)
        List1.AddItem  Check 4= " & frmGraficoCircuito.Check4.Value & "  |    Stato= " & stato(3)
        List1.AddItem  Check 5= " & frmGraficoCircuito.Check5.Value & "  |    Stato= " & stato(4)
        List1.AddItem  Check 8= " & frmGraficoCircuito.Check8.Value & "  |    Stato= " & stato(5)
       [/color=red]
        
       'Coordinate X
        For i = 1 To 5
          FrameDati(i).Left = coordx
        Next i
        
        ContMax = 5     '5 Frame da impaginare
        
        For i = 1 To ContMax                  'numero di valori
            If stato(i) = True Then
               FrameDati(i).Top = coordy    'Assegna al form interessato la coordinata piu alta
               FrameDati(i).Visible = True                'Visualizza il form interessato
               coordy = coordy + FrameDati(i).Height + 20    'imposta il Coordy successivo
            Else
               FrameDati(i).Visible = False                  'Visibilità
            End If
        Next i
    
    End Sub


    in rosso è il codice per leggere le variabili stato(i). Queste variabili sono aggiornate ad ogni richiamo della sub ImpaginaFrame

  8. #8

    Qu

    Allora...ho provato a fare due modifiche al tuo codice e funziona (non so dirti se mi sarebbe funzionato anche prima)...

    codice:
    Option Explicit
        Dim stato(1 To 5) As Boolean
        
    Private Sub ImpaginaFrame()
        Dim coordX As Integer, coordY As Integer
        Dim i As Integer          'contatore
        Dim c As Integer          'contatore
        'La variabile     'Stato'     è definita all'inizio del modulo
        'Coordinate dei FRAME
        coordX = 100 ' 10440
        coordY = 100 '1200       'coordinata di partenza
        
        List1.Clear
        List1.AddItem "Check 1= " & ck(1).Value & "  |    Stato= " & stato(1)
        List1.AddItem "Check 2= " & ck(2).Value & "  |    Stato= " & stato(2)
        List1.AddItem "Check 3= " & ck(3).Value & "  |    Stato= " & stato(3)
        List1.AddItem "Check 4= " & ck(4).Value & "  |    Stato= " & stato(4)
        List1.AddItem "Check 5= " & ck(5).Value & "  |    Stato= " & stato(5)
        
        For i = 1 To 5 'qua potresti mettere anche FrameDati.UBound
            If stato(i) = True Then
                DoEvents
                FrameDati(i).Left = coordX
                FrameDati(i).Top = coordY    'Assegna al form interessato la coordinata piu alta
                FrameDati(i).Visible = True                'Visualizza il form interessato
                coordY = coordY + FrameDati(i).Height + 20    'imposta il Coordy successivo                'Visibilità
            Else
                FrameDati(i).Visible = False
            End If
        Next i
    End Sub
    
    
    Private Sub ck_Click(Index As Integer)
        Dim i As Integer
        For i = 1 To 5
            If ck(i).Value = 1 Then
                stato(i) = True
            Else
                stato(i) = False
            End If
        Next i
        ImpaginaFrame
    End Sub
    Questo è quello che ho provato,come vedi ho messo 5 checkbox direttamente nel form e in base a quelli faccio apparire i frame, senza nessun problema...
    hai messo option explcit? magari hai qualche variabile scritta male e non te ne accorgi...

  9. #9
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    759
    Come ti ripeto, è impossibile senza vedere tutto il codice. Io comunque imposterei il programma in modo diverso, non perché veda un errore nel tuo codice, ma per il fatto che meno righe si scrivono e meno variabili si usano più facile è individuare gli eventuali errori.

    Definirei i cinque CheckBox come matrice di controlli, da CheckBox(1) a ChieckBox(5) per analogia con i Frame.
    Anche le Label le definirei come matrici: labNome(i), labCamera(i) ecc. sempre con indice da 1 a 5.
    Poi...
    codice:
    For i = 1 To 5
      If frmGraficoCircuito.Check(i).Value = vbChecked Then
        labNome(i).Caption = Nome
        labCamera(i).Caption = Camera
        ...
        coordy = coordy + FrameDati(i).Height + 20    
        FrameDati(i).Top = coordy
        FrameDati(i).Visible = True                  
      Else
        FrameDati(i).Visible = False
      End If

  10. #10
    allora...

    x grumpy:
    Ho ripulito un po il codice.
    ho modificato i nomi dei check per assimilarli a quelli dei frame.
    usare tante variabili è un mio difetto, ma cmq quelle che vedi sono rimaste li per le prove che facevo.

    x andrea:
    non ho capito bene l'uso che fai del doevents. Ma non mi funziona lo stesso.



    Vi posto il codice:


    codice:
    Private Sub ImpaginaFrame()
    
     'Coordinate dei FRAME DATI
      Dim coordx As Integer
      Dim coordy As Integer
      
      Dim i As Integer       
      Dim c As Integer        
      Dim ContMax As Integer
      
      
      'La variabile     'Stato'     è definita all'inizio del modulo con stato (1 to 5) as boolean
      
       'Coordinate dei FRAME (in twips)
        coordx = 10440     
        coordy = 1200          
       
      'Coordinate X e Y
        For i = 1 To 5
          FrameDati(i).Left = coordx   
        Next i
      
        FrameDati(1).Top = 1200
       
    
      List1.Clear
    
    
       'Imposta la visibilità dei frame a true
        For i = 1 To 5
          FrameDati(i).Visible = True
          List1.AddItem "Frame(" & i & ") = " & FrameDati(i).Visible
        Next i
        
        List1.AddItem ""
        
       'Visualizza in list1
        For i = 1 To 5
          List1.AddItem "Frame(" & i & ") = " & FrameDati(i).Visible
        Next i
    
    
    'Imposta le variabili stato(i) a seconda dei check in GraficoCircuito
        For i = 1 To 5
          If frmGraficoCircuito.Check(i).Value = 1 Then
             FrameDati(i).Visible = True
             stato(i) = True
          Else
             FrameDati(i).Visible = False
             stato(i) = False
          End If
        Next i
       
        
        
       'Sposta i frame in cascata a seconda di quelli visibili / invisibili
        For i = 1 To 5                                 'numero di valori
            If stato(i) = True Then
               FrameDati(i).Top = coordy    'Assegna al form interessato la coordinata piu alta
               FrameDati(i).Visible = True       'Visualizza il form interessato
               coordy = coordy + FrameDati(i).Height + 20    'imposta il Coordy successivo
            Else
               FrameDati(i).Visible = False                  'Visibilità
            End If
        Next i
        
    End Sub



    ma, ora succede una cosa. Non so se sono io. bah!!

    allora:
    leggendo questa parte di codice succede che impostando a TRUE la visibilità dei frame, e visualizzando subito dopo la stessa proprietà, il prog. ritorna FALSE !!!!


    codice:
       'Imposta la visibilità dei frame a true
        For i = 1 To 5
          FrameDati(i).Visible = True
          List1.AddItem "Frame(" & i & ") = " & FrameDati(i).Visible
        Next i
        
        List1.AddItem ""

    Quindi, al problema...se ne è aggiunto un altro !!! eheheh.. bella sta cosa !!!!

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.