+ Rispondi al messaggio
Pagina 1 di 2 12 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11

Creazione di molti controlli a run-time ed errore durante la creazione dell'handle

  1. #1
    rc72 non Ŕ in linea Novello
    Post
    16
    Like Inviati  
    0
    Like Ricevuti  
    0
    Salve a tutti,

    ho un problema (forse dovuto a un approccio non corretto...) in un'applicazione che sto realizzando. Ho necessita' di creare molti controlli a run-time, praticamente dovrebbe essere visualizzata una specie di mini foglio Excel con caselle non editabili ma che rispondano a eventi legati al mouse; ho pensato di usare dei controlli panel. Il codice che uso e' il seguente (ogni panel creato e' gestito dalla variabile panelDettaglio e alla fine e' aggiunto a un panel chiamato panelContenitore):

            For k = 0 To numeroRighe - 1
                x = 0
                For j = 0 To numeroColonne - 1
                    panelDettaglio = New Panel
                    With panelDettaglio
                        .Name = "PanelDettaglio" & j & "_" & k
                        .Size = New Size(larghezza, altezza)
                        .Left = x
                        .Top = y
                        .BorderStyle = BorderStyle.FixedSingle
                    End With
                    AddHandler panelDettaglio.MouseEnter, AddressOf SuPanelDettaglioCalendarioMouseEnter
                    AddHandler panelDettaglio.MouseLeave, AddressOf SuPanelDettaglioCalendarioMouseLeave
                    AddHandler panelDettaglio.MouseDown, AddressOf SuPanelDettaglioCalendario_MouseDown
                    AddHandler panelDettaglio.MouseUp, AddressOf SuPanelDettaglioCalendario_MouseUp
                    AddHandler panelDettaglio.MouseMove, AddressOf SuPanelDettaglioCalendario_MouseMove
                    x += larghezza
                    PanelContenitore.Controls.Add(panelDettaglio)
                Next
                y += altezza
            Next
    
    In base a comandi dell'utente, questa griglia viene ricreata; prima di farlo uso il comando
    PanelContenitore.Controls.Clear
    
    Funziona tutto abbastanza bene, anche con griglie di migliaia di panel; tuttavia a volte il programma va in crash e viene fuori l'errore "Errore durante la creazione dell'handle della finestra". E' come se la memoria andasse in saturazione perche' i panel cancellati dal comando Clear occupano ancora risorse.

    Ribadisco, probabilmente l'approccio e' sbagliato e forse occorrebbe gestire meglio la memoria (ringrazio chi vorra' darmi indicazioni in merito), ma e' pur vero che il problema non viene fuori subito, per cui se riuscissi a liberare risorse probabilmente il mio codice basterebbe (sopportando la lentezza in fase di creazione dei panel, che comunque non e' eccessiva).

    Grazie.
    ℹ️ Leggi di pi¨ su rc72 ...

  2. #2
    L'avatar di Luca Cannav˛
    Luca Cannav˛ non Ŕ in linea Scolaretto
    Post
    276
    Like Inviati  
    0
    Like Ricevuti  
    0
    Ciao per liberare le risorse usa il metodo Close e poi all'occorrenza ricrei i vari panel che ti servono con i rispettivi controlli all'interno.
    Spero sia questa la soluzione giusta per il tuo problema ciao

    P.S. - rileggendo mi sono accorto che all'interno dei panel non inserisci alcun controllo, quindi mi chiedo perchÚ usare dei contenitori quando puoi usare altri controlli pi¨ indicati allo scopo?
    Ultima modifica di Luca Cannav˛; 10-01-2015 21:08 

  3. #3
    rc72 non Ŕ in linea Novello
    Post
    16
    Like Inviati  
    0
    Like Ricevuti  
    0
    Quote Originariamente inviato da Luca Cannav˛ Visualizza il messaggio
    Ciao per liberare le risorse usa il metodo Close e poi all'occorrenza ricrei i vari panel che ti servono con i rispettivi controlli all'interno.
    Spero sia questa la soluzione giusta per il tuo problema ciao
    Scusa, il metodo Close a quale controllo dovrei applicarlo? Considera che non chiudo la form, semplicemente svuoto il PanelContenitore e poi lo riempio di nuovo. Ti ringrazio.

    Quote Originariamente inviato da Luca Cannav˛ Visualizza il messaggio
    P.S. - rileggendo mi sono accorto che all'interno dei panel non inserisci alcun controllo, quindi mi chiedo perchÚ usare dei contenitori quando puoi usare altri controlli pi¨ indicati allo scopo?
    In realta' i vari panel che creo possono a loro volta contenere delle label di vari colori (e che possono non occupare tutto il panel), per questo uso dei contenitori.

    Ciao.
    ℹ️ Leggi di pi¨ su rc72 ...

  4. #4
    L'avatar di Luca Cannav˛
    Luca Cannav˛ non Ŕ in linea Scolaretto
    Post
    276
    Like Inviati  
    0
    Like Ricevuti  
    0
    Quote Originariamente inviato da rc72 Visualizza il messaggio
    Scusa, il metodo Close a quale controllo dovrei applicarlo? Considera che non chiudo la form, semplicemente svuoto il PanelContenitore e poi lo riempio di nuovo. Ti ringrazio.
    io direi i vari panelDettaglio contenuti all'interno del panelContenitore. Scusa ricordavo male, devi usare Dispose per liberare le risorse dei panel non pi¨ necessari.

    Quote Originariamente inviato da rc72 Visualizza il messaggio
    In realta' i vari panel che creo possono a loro volta contenere delle label di vari colori (e che possono non occupare tutto il panel), per questo uso dei contenitori.
    Ciao.
    Potresti mostrare un'immagine? Tanto per capire un po meglio. Tempo a dietro progettai qualcosa del genere, magari si potrebbero creare delle classi allo scopo.
    Ultima modifica di Luca Cannav˛; 11-01-2015 17:40 

  5. #5
    rc72 non Ŕ in linea Novello
    Post
    16
    Like Inviati  
    0
    Like Ricevuti  
    0
    Ho realizzato questo:


    Tutto si trova nel PanelContenitore, le caselle bianche sono quelle che creo con i panelDettaglio e all'interno ci possono essere label colorate. Ovviamente il calendario puo' estendersi per diversi mesi e per piu' ore del giorno.

    Il mio dubbio e': chiamare il metodo PanelContenitore.Controls.Clear esegue automaticamente il dispose dei vari controlli contenuti?

    Grazie e scusa se non ho pensato prima ad inviare un'immagine.
    ℹ️ Leggi di pi¨ su rc72 ...

  6. #6
    L'avatar di Luca Cannav˛
    Luca Cannav˛ non Ŕ in linea Scolaretto
    Post
    276
    Like Inviati  
    0
    Like Ricevuti  
    0
    Se non ricordo male, con Clear cancelli gli oggetti contenuti nel contenitore ma non le risorse immediatamente. Invece col Dispose forzi la chiusura dell'oggetto e ne liberi immediatamente le risorse. Comunque su questo discorso Ŕ meglio aspettare l'intervento degli esperti.
    Effettivamente Ŕ come pensavo, io creai qualcosa di simile ma con una classe ad hoc che gestiva sia il contenitore e sia i controlli al suo interno con eventi, proprietÓ e metodi.

  7. #7
    L'avatar di Cteniza
    Cteniza non Ŕ in linea Amanuense
    Post
    4,378
    Blogs
    36
    Like Inviati  
    0
    Like Ricevuti  
    0
    Per avere una buona possibilitÓ di usare proficuamente il "dispose" dovresti isolare il codice in cui utilizzi la risorsa in un blocco.
    Automaticamente dispose viene richiamato durante l'esecuzione alla fine di un blocco.
    Potrebbe essere utile utilizzare dispose implementando idisposable
    Implementing IDisposable and the Dispose Pattern Properly - CodeProject
    ℹ️ Leggi di pi¨ su Cteniza ...

  8. #8
    L'avatar di Luca Cannav˛
    Luca Cannav˛ non Ŕ in linea Scolaretto
    Post
    276
    Like Inviati  
    0
    Like Ricevuti  
    0
    Per Cteniza:
    Se facesse derivare la sua classe dai panel non implementerebbe anche il Dispose?
    Poi all'interno della classe stessa gestirebbe le varie label. Nel momento in cui chiamerebbe il metodo Dispose non liberebbe tutte le risorse legate al panel ed a tutto ci˛ che contiene?
    CuriositÓ e chiarimenti per me ciao grazie

  9. #9
    rc72 non Ŕ in linea Novello
    Post
    16
    Like Inviati  
    0
    Like Ricevuti  
    0
    Grazie per le risposte.
    Per Luca Cannav˛: ho provato a richiamare direttamente il metodo dispose su ciascun controllo invece del metodo clear, vedo che succede.
    Per Cteniza:
    Ti ringrazio, ti confesso che non ho ben chiaro come isolare il codice in un blocco (piu' che ho altro non ho capito il concetto di "blocco"), ma vedro' di studiare la cosa.
    A presto.
    ℹ️ Leggi di pi¨ su rc72 ...

  10. #10
    L'avatar di Cteniza
    Cteniza non Ŕ in linea Amanuense
    Post
    4,378
    Blogs
    36
    Like Inviati  
    0
    Like Ricevuti  
    0
    Ad esempio per rilasciare risorse si pu˛ utilizzare un blocco using
    		If File.Exists(fileTextBox.Text) Then
    			Using sr As New StreamReader(fileTextbox.Text,Encoding.GetEncoding(1252))
    				richTextBox1.Text = sr.ReadToEnd
    			End Using
    		End If
    
    ℹ️ Leggi di pi¨ su Cteniza ...

+ Rispondi al messaggio
Pagina 1 di 2 12 ultimoultimo

Potrebbero interessarti anche ...

  1. Risposte: 9
    Ultimo Post: 08-02-2018, 18:04
  2. Errore durante creazione dinamica di Textbox
    Da A.Maurizio nel forum Microsoft Excel
    Risposte: 8
    Ultimo Post: 21-11-2016, 23:39
  3. Errore AppLoadString durante creazione report
    Da dasio86 nel forum Microsoft Access
    Risposte: 8
    Ultimo Post: 26-07-2014, 14:00
  4. Errore durante creazione di un file accde
    Da amolaplay nel forum Microsoft Access
    Risposte: 2
    Ultimo Post: 14-12-2013, 10:20
  5. Errore durante la creazione di file MDE
    Da pinius nel forum Microsoft Word
    Risposte: 8
    Ultimo Post: 27-01-2006, 14:35