Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it L'avatar di Petra
    Registrato dal
    Apr 2005
    Messaggi
    224

    Leggere controlli in un contenitore

    Ciao a tutti...

    Ho dei controlli all'interno di un frame, altri in un altro frame ed altri controlli sparsi all'interno della form.

    Vorrei fare un controllo for each all'interno di un frame specifico per disabilitare ogni suo controllo.

    Qualcuno di voi saprebbe dirmi come posso fare ?!

    Grazie!!

  2. #2
    Utente di HTML.it L'avatar di Boolean
    Registrato dal
    Oct 2005
    Messaggi
    758

    Re: Leggere controlli in un contenitore

    Originariamente inviato da Petra
    Ciao a tutti...

    Ho dei controlli all'interno di un frame, altri in un altro frame ed altri controlli sparsi all'interno della form.

    Vorrei fare un controllo for each all'interno di un frame specifico per disabilitare ogni suo controllo.

    Qualcuno di voi saprebbe dirmi come posso fare ?!

    Grazie!!
    ciao Petra,

    probabilmente una routine del genere può fare al caso tuo:

    codice:
    Public Sub EnableFrame(frm As Form, F As Frame, Status As Boolean)
    
    Dim ctrl As Control
    
    On Error Resume Next
    
    For Each ctrl In frm
        If ctrl.Container.Name = F.Name Then
            ctrl.Enabled = Status
        End If
    Next ctrl
    
    F.Enabled = Status
    
    End Sub
    volendo potresti metterla in un Modulo, dichiarata come Public, in modo da poterla utilizzare in tutto il progetto... allo scopo ho aggiunto anche il parametro frm che ti permette di indicare anche il form di appartenenza del frame.

    la sub puoi usarla così:

    codice:
    EnableFrame Me, Frame1, False ' disabilita tutti i controlli nel Frame1 del form da cui lanci la funzione
    mettendo True, ovviamente riabiliti i controlli

    Boolean

  3. #3
    Utente di HTML.it L'avatar di Petra
    Registrato dal
    Apr 2005
    Messaggi
    224
    Il tuo codice è simile al mio, ma mi hai suggerito l'opzione status che è molto comoda...grazie!!!

    Per quanto riguarda la funzionalità, e purtroppo mi sono dimenticato di riportarlo nel primo post, che tutti i controlli si trovano all'interno di una UserControl!!!

    Quando richiamo la funzione il Me non richiama la UserControl, richiama solamente le Form.

  4. #4
    Utente di HTML.it L'avatar di Boolean
    Registrato dal
    Oct 2005
    Messaggi
    758
    Originariamente inviato da Petra
    Il tuo codice è simile al mio, ma mi hai suggerito l'opzione status che è molto comoda...grazie!!!

    Per quanto riguarda la funzionalità, e purtroppo mi sono dimenticato di riportarlo nel primo post, che tutti i controlli si trovano all'interno di una UserControl!!!

    Quando richiamo la funzione il Me non richiama la UserControl, richiama solamente le Form.
    è un particolare importante ed averlo omesso non è cosa da poco.

    gli UserControls, in virtù del fatto che possono fare da contenitore dispongono della collection ContainedControls.

    quindi devi spiegare meglio la struttura del tuo usercontrol, vediamo come si può adattare il codice.

    Boolean

  5. #5
    Utente di HTML.it L'avatar di Petra
    Registrato dal
    Apr 2005
    Messaggi
    224
    La mia subroutine pubblica si trova nel Modulo

    codice:
    Public Sub DisAbilitaContenitore(FrameAttivo As Frame, UserControlAttiva As UserControl, Stato As Boolean)
        Dim Controllo As Control
        Dim NomeContenitore As String
        On Error Resume Next
        For Each Controllo In UserControlAttiva.Controls
            NomeContenitore = ""
            NomeContenitore = Controllo.Container.Name
            If NomeContenitore = FrameAttivo.Name Then
                Controllo.Enabled = Stato
            End If
        Next Controllo
    End Sub
    L'evento Click del Command all'interno della UserControl richima la subroutine

    codice:
    DisAbilitaContenitore fraPannelloCategorie, UserControl, False
    Se avevo una Form non dovevo far altro che inerire un Me al posto della parolina rossa, ma in un UserControl cosa devo mettere ?! La UserControl si chiama 'Prodotti'.

    Se nell'evento Click del Command inserisco il seguente codice...

    codice:
    Dim Controllo As Control
        Dim NomeContenitore As String
        On Error Resume Next
        For Each Controllo In Controls
            NomeContenitore = ""
            NomeContenitore = Controllo.Container.Name
            If NomeContenitore = Frame1.Name Then
                Controllo.Enabled = False
            End If
        Next Controllo
    ...funziona alla grande, ma purtroppo ho più UserControl che devono utilizzare questa subroutine. Potrei mettere quest'ultima in ogni UserControl, ma non voglio arrivare a tal punto.

  6. #6
    Utente di HTML.it L'avatar di Boolean
    Registrato dal
    Oct 2005
    Messaggi
    758
    continuo a non capire la struttura del tuo progetto...

    in pratica tu hai un esercontrol, all'interno del quale sono disposti dei controlli all'interno di un frame, giusto?

    questi controlli sono inseriti direttamente in fase di progettazione del controllo? o sono inseriti dopo in fase di progettazione dell'applicazione che li utilizza?

    la routine che dovrebbe disabilitare i controlli, sta dentro un modulo relativo all'usercontrol o in uno relativo all'applicazione?

    se la routine deve stare per forza fuori dall'usercontrol, devi esporre tramite una proprietà la collection dei controlli contenuti, e per questo ti servirà incapsularla in una classe.

    a mio modo di vedere sarebbe opportuno, per semplicità di realizzazione, inserire la routine che disabilita i controlli direttamente dentro l'usercontrol, magari che agisca di pari passo alla proprietà Enabled, della quale potresti sfruttarne anche il valore per abilitare/disabilitare.

    in mancanza di dettagli in merito al tuo progetto non posso essere più preciso...

    Boolean

  7. #7
    Utente di HTML.it L'avatar di Petra
    Registrato dal
    Apr 2005
    Messaggi
    224
    Originariamente inviato da Boolean
    continuo a non capire la struttura del tuo progetto...

    in pratica tu hai un esercontrol, all'interno del quale sono disposti dei controlli all'interno di un frame, giusto?
    Ho una UserControl che si chiama Prodotti con al suo interno due frame che a loro volta hanno al loro interno alcuni controlli.

    Originariamente inviato da Boolean questi controlli sono inseriti direttamente in fase di progettazione del controllo? o sono inseriti dopo in fase di progettazione dell'applicazione che li utilizza?
    I controlli sono stati inseriti tutti in fase di progettazione.

    Originariamente inviato da Boolean la routine che dovrebbe disabilitare i controlli, sta dentro un modulo relativo all'usercontrol o in uno relativo all'applicazione?
    La subroutine è in un modulo relativo all'applicazione.

    Originariamente inviato da Boolean se la routine deve stare per forza fuori dall'usercontrol, devi esporre tramite una proprietà la collection dei controlli contenuti, e per questo ti servirà incapsularla in una classe.
    Questo non ha senso. A questo punto perderei meno tempo ad inserire la subroutine in ogni modulo relativo ad ogni UserControl.

  8. #8
    Utente di HTML.it L'avatar di Boolean
    Registrato dal
    Oct 2005
    Messaggi
    758
    ho fatto qualche prova, ed in effetti la soluzione che si presta meno a problemi, è quella di utilizzare una routine in ogni usercontrol.

    in pratica nel tuo usercontrol puoi esporre una collection dei controlli in esso contenuti, si può fare anche senza far ricorso ad una classe, in questo modo:

    codice:
    Public Controls As Collection
    e poi nell'evento Initialize del'UserControl:

    codice:
    Private Sub UserControl_Initialize()
    Set Controls = New Collection
    Dim c As Control
    For Each c In UserControl
        Controls.Add c
    Next c
    End Sub
    in questo modo anche il tuo UserControl dispone di una Collection Controls che puoi ciclare.

    per far vedere il controllo alla routine presente nel modulo esterno potresti passare l'oggetto Extender che in pratica è l'oggetto Usercontrol così come viene istanziato sul form, quindi alla pressione del CommandButton interno all'UserControl potresti scrivere:

    codice:
    DisAbilitaContenitore fraPannelloCategorie, Extender, False
    il problema sta nell'individuare il Container di ogni singolo controllo presente nella collection, che per motivi che dovrei approfondire, non riesce.

    giunto a ciò, come ti dicevo, penso che la strada più semplice e priva di intoppi sia proprio quella di predisporre una routine per ogni UserControl.

    Boolean

  9. #9
    Utente di HTML.it L'avatar di Petra
    Registrato dal
    Apr 2005
    Messaggi
    224
    Ma l'istruzione 'extender' è l'equivalente del 'me' ?!

  10. #10
    Utente di HTML.it L'avatar di Boolean
    Registrato dal
    Oct 2005
    Messaggi
    758
    no, non può definirsi l'equivalente di Me per il form.

    Extender, come ti dicevo prima, identifica l'istanza del controllo, come se essa fosse vista dal Form, per dirla semplicemente.

    Boolean

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.