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

    [VB.NET] Evitare lo sfarfallio aggiornando elementi del controllo ListView

    Salve,
    nel mio programma ho una ListView, dopo la connessione ad un server, la L.V. viene popolata con delle righe. Il server può inviare una riga ogni 5/6 secondi, ma in alcuni casi inviarne anche 10 insieme.

    Mi accade una cosa fastidiosa e brutta da vedersi: ogni volta che una nuova riga viene inserita, la LV mi diventa bianca per un istante per poi tornare con le righe visibili, facendo notare lo scorrimento verso l'alto.
    Più item ci sono nella LV, più l'effetto è marcato.

    Ho visto che su vari forum stranieri chiamano l'effetto FLICKERING, ma non sono riuscita a trovare nulla per risolverlo.

    Qualcuno è riuscito a risolvere?
    Grazie

    Il codice che uso per l'aggiunta del nuovo item è molto semplice:
    codice:
    Dim lvi As New ListViewItem
    lvi.Text = line
    lvi.SubItems.Add(status)
    lvi.SubItems.Add(data)
    Form1.ListView1.Items.Add(lvi)

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,296
    Prova a invocare il metodo BeginUpdate della ListView quando inizi a fare una o più modifiche al controllo o a uno o più dei suoi elementi, assicurandoti di invocare il metodo EndUpdate quando hai finito.

    Questo dovrebbe ridurre il numero di volte che il controllo viene ridisegnato mentre stai modificando diverse parti dello stesso, oltre a velocizzare l'operazione evitando di generare eventi inutilmente.

    In alternativa, o in aggiunta, prova ad abilitare il double buffering usando la proprietà quasi omonima, DoubleBuffered: questa modalità fa sì che il disegno avvenga "off screen", andando poi a disegnare il controllo completo trasferendo l'intero bitmap che lo raffigura. Per contro, c'è lo svantaggio di occupare un po' di memoria in più, ma dovrebbe rendere l'interfaccia più veloce e soprattutto eliminare completamente il "flickering".

    Nella documentazione che trovi ai link ci sono tutti i dettagli da sapere per approfondire ulteriormente.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

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

  3. #3
    Grazie.
    Ho provato anche questo: https://docs.microsoft.com/it-it/dot...s-and-controls

    La situazione è migliorata un pochino, ma non risolta.

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,296
    Quote Originariamente inviata da Pamela72 Visualizza il messaggio
    Grazie.
    Ho provato anche questo: https://docs.microsoft.com/it-it/dot...s-and-controls

    La situazione è migliorata un pochino, ma non risolta.
    Io contemplerei anche il fatto di rendere invisibile il controllo e aggiornarlo prima di inserire gli elementi, poi renderlo di nuovo visibile al termine della procedura.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

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

  5. #5
    Ciao, per un progetto in cui usavo l'oggetto pictureBox per disegnare, avevo lo stesso problema, e ho risolto la problematica creando un controllo ereditando l'oggetto pictureBox, poi nell'inizializzazione ho settato il doublebaffer...
    codice:
    Public Sub New()
            Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True)
            Me.SetStyle(ControlStyles.OptimizedDoubleBuffer, True)
    End Sub
    Jupynet

  6. #6
    Grazie per la risposta. Io ho sempre questo orribile sfarfallio.

    Le istruzioni che mi hai suggerito posso metterle all'evento LOAD del FORM principale? O devo metterle nella sub? Non ho capito questo. Vedo che tu hai creato una nuova sub che fa solo quello.
    Come dovrei fare? Non ho capito...



    Quote Originariamente inviata da jupynet Visualizza il messaggio
    Ciao, per un progetto in cui usavo l'oggetto pictureBox per disegnare, avevo lo stesso problema, e ho risolto la problematica creando un controllo ereditando l'oggetto pictureBox, poi nell'inizializzazione ho settato il doublebaffer...
    codice:
    Public Sub New()
            Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True)
            Me.SetStyle(ControlStyles.OptimizedDoubleBuffer, True)
    End Sub

  7. #7
    Quella sub non è nient'altro che l'inizializzazione dell'oggetto (form o altro...) che viene chiamato/dichiarato la prima volta...quella sube è la prima procedura che fa prima di altre, e puoi inserirla nel tuo form...
    Comunque, io alla fine, per far si che venisse eliminato l'effetto flickering, ho dovuto creare un oggetto nuovo ereditandolo dalla picturebox, eventualmente protresti fare la stessa cosa con la listView.
    Ti crei un nuovo oggetto, erediti l'oggetto listView, e all'interno dell'oggetto, nella sub New, inserisci quelle istruzioni. Fatto questo, ti ritroverai il tuo oggetto listView, fra gli oggetti che puoi trasportare sul form e usi quello….
    Mi rendo conto che la spiegazione non è dettagliata, eventualmente se hai problemi cercherò di essere un po' più chiaro facendo qualche esempio…
    Jupynet

  8. #8
    Grazie.
    Ho messo questa sub nella classe FORM1, quella che contiene le ListView e che è la principale. Ma mi ha dato subito problemi:

    codice:
    For Each sp As String In My.Computer.Ports.SerialPortNames
                ComboBoxPORTE.Items.Add(sp)
    Next
    Questa istruzione è all'interno della sub FORM1_load, e mi restituisce subito errore:
    System.NullReferenceException
    HResult=0x80004003
    Messaggio=Riferimento a un oggetto non impostato su un'istanza di oggetto.

    Se tolgo la sub NEW che mi hai consigliato tutto funziona correttamente...


    Quote Originariamente inviata da jupynet Visualizza il messaggio
    Quella sub non è nient'altro che l'inizializzazione dell'oggetto (form o altro...) che viene chiamato/dichiarato la prima volta...quella sube è la prima procedura che fa prima di altre, e puoi inserirla nel tuo form...
    Comunque, io alla fine, per far si che venisse eliminato l'effetto flickering, ho dovuto creare un oggetto nuovo ereditandolo dalla picturebox, eventualmente protresti fare la stessa cosa con la listView.
    Ti crei un nuovo oggetto, erediti l'oggetto listView, e all'interno dell'oggetto, nella sub New, inserisci quelle istruzioni. Fatto questo, ti ritroverai il tuo oggetto listView, fra gli oggetti che puoi trasportare sul form e usi quello….
    Mi rendo conto che la spiegazione non è dettagliata, eventualmente se hai problemi cercherò di essere un po' più chiaro facendo qualche esempio…

  9. #9
    Ciao, probabilmente mi sono spiegato male io.
    Apri il form nella parte del codice, nell'ambiente di sviluppo, in alto, seleziona l'oggetto form (troverai il nome che hai dato al form) e nella combo a fianco, seleziona "nuovo" (o new), automaticamente verrà creata la Sub New, del tipo:
    codice:
        Public Sub New()
    
            ' La chiamata è richiesta dalla finestra di progettazione.
            InitializeComponent()
    
            ' Aggiungere le eventuali istruzioni di inizializzazione dopo la chiamata a InitializeComponent().
    
        End Sub
    quelle istruzioni, Me.SetStyle(...), le devi mettere dopo InitializeComponent().

    Comunque, se cosi non risolvi, nel tuo progetto, prova a crearti un nuovo componente, ereditandolo da ListView.
    In pratica, crei una nuova classe, gli dai un nome, ad esempio myListView, gli fai "ereditare" ListView, crei la sub New, e all'interno ci metti le istruzioni che ti avevo detto.
    Una cosa del genere:
    codice:
    Imports System.ComponentModel
    Public Class myListView
        Inherits ListView
    
        Public Sub New()
            Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True)
            Me.SetStyle(ControlStyles.OptimizedDoubleBuffer, True)
        End Sub
    End Class
    Salvi tutto, lo compili, e nella casella degli strumenti, in alto, dovresti trovarti il componente appena creato, lo trascini nel form, e lo usi come una normalissima ListView...
    Fammi sapere...
    Ciao
    Jupynet

  10. #10
    Grazie 1000 Jupynet!!!
    Veramente grazie!!!

    Adesso lo sfarfallio è completamente scomparso! Non so come ringraziarti...
    Ho dovuto seguire passo passo la tua spiegazione, queste cose non le avevo mai fatte da autodidatta.

    Grazie ancora!

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 © 2024 vBulletin Solutions, Inc. All rights reserved.