View Full Version : [vbnet 2008] preload con barra di avanzamento
superbau
30-10-2009, 10:08
salve,
visto la risposta relativa tempo fa sulla mole di dati da gestire sul mio database xml e vari problemi relativi alla lentezza che potrebbe sorgere, mi è "barluccicato in mente" di mettere una barra di caricamento del file e anche nella lettura/scrittura di eventuali ricerche nei nodi.
Però non so come fare. Prima usavo questo metodo a icone
icona clessidra
codice
icona freccia.
Ora mi piacerebbe implementare questa progressBar che incrementale fino al 100% quando il file/s sono caricati o quando ho finito di leggere/scrivere sul mio database in xml.
Come potrei fare?
GRAZIE INFINITE
euphyllia87
30-10-2009, 10:40
salve,
visto la risposta relativa tempo fa sulla mole di dati da gestire sul mio database xml e vari problemi relativi alla lentezza che potrebbe sorgere, mi è "barluccicato in mente" di mettere una barra di caricamento del file e anche nella lettura/scrittura di eventuali ricerche nei nodi.
Però non so come fare. Prima usavo questo metodo a icone
icona clessidra
codice
icona freccia.
Ora mi piacerebbe implementare questa progressBar che incrementale fino al 100% quando il file/s sono caricati o quando ho finito di leggere/scrivere sul mio database in xml.
Come potrei fare?
GRAZIE INFINITE
Ci sono centinaia di articoli su google e su MSDN in merito.
qui (http://www.vbdotnetheaven.com/UploadFile/mahesh/ProgressBar04262005051817AM/ProgressBar.aspx)
qui (http://www.devasp.net/net/articles/display/336.html)
qui (http://solopc.forumcommunity.net/?t=23406998)
superbau
30-10-2009, 10:57
grazie ho capito, praticamente la si abbina al timer tick, provo subitissimo!
superbau
30-10-2009, 11:24
ecco, allora ho fatto come riportato in un esempio che hai citato, però la barra non è in funzione del caricamento del file ma è slegata, tanto che pure lei si blocca quando il file si sta caricando, per poi proseguire solo quando il file viene caricato completamente.
il caricamento del database avviene nel load dell'anagrafica
posto il codice:
Public Class MenuPrincipale
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Timer1.Enabled = True
Anagrafica.Show()
Me.Hide()
End Sub
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
If ProgressBar1.Value < 100 Then
ProgressBar1.Value += 1
ElseIf ProgressBar1.Value = ProgressBar1.Maximum Then
Timer1.Stop()
finitoCaricamnetoAna = 1
End If
End Sub 'timer1_Tick
End Class
superbau
30-10-2009, 11:50
ho provato anche a fare in questo modo ma il ciclo si interrompe quando carica il database per poi riprendere quando ha finito..
Dim i As Integer
i = 0
For i = ProgressBar1.Minimum To ProgressBar1.Maximum
ProgressBar1.Value = i
If i > 1 Then
Anagrafica.Show()
End If
Next
superbau
30-10-2009, 13:29
ufff ho provato a mettere tutto il codice del load all'interno di un timer e pilotandolo attavarso un al'tro form con un altro timer, ma niente, quando va a leggere il file , tutto SI FREEEZA per poi ripartire a caricamento eseguito :(
load anagrafica
Private Sub Anagrafica_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
caricamento.Show()
caricamento.BringToFront()
End Sub
codice sul form caricamento
Public Class caricamento
Dim i As Integer
Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
i += 1
Label1.Text = i
If i < 101 Then
ProgressBar1.Value = i
End If
If i = 12 Then
Anagrafica.Timer1.Enabled = True
End If
End Sub
Private Sub caricamento_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
ProgressBar1.Minimum = 0
ProgressBar1.Maximum = 100
Me.BringToFront()
Timer2.Enabled = True
End Sub
End Class
e qui il codice sul timer dell'anagrafica che viene pilotato dal caricamento:
Dim bau As Integer
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
bau += 1
If bau = 5 Then
Else
'--------------------------------------------------------
'lettura database se è selezionato dal fom Gestione Files
'--------------------------------------------------------
Cursor = Cursors.WaitCursor
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'controlla se esiste una precedente selezione del database
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'istanzio il documento
Dim DocS As New XmlDocument()
'lo carico in memoria '
DocS.Load(SelezioneDatabaseANA & "selezioneAna.xml")
'recupero il nodo root
Dim elementS As XmlElement = DocS.DocumentElement
'recupero il valore all'interno del primo figlio dell'elemento root
Dim nodeS As XmlNode = elementS.FirstChild
'node("RegioneSociale").InnerText
If nodeS("sclelta").InnerText = "" Then
Else
' MsgBox(nodeS("sclelta").InnerText)
PathAnagraficaDatabase = nodeS("sclelta").InnerText
Label26.Text = "Anagrafica corrente: " & nodeS("nome").InnerText
End If
If (SetDatabaseCorrente = 1) Or Not (nodeS("sclelta").InnerText = "") Then
'istanzio il documento
Dim Doc As New XmlDocument()
'lo carico in memoria
Doc.Load(PathAnagraficaDatabase)
'recupero il nodo root
Dim element As XmlElement = Doc.DocumentElement
'recupero il valore all'interno del primo figlio dell'elemento root
Dim node As XmlNode = element.FirstChild
'node("RegioneSociale").InnerText
'Variabile Percorso dell'anagrafica: PathAnagraficaDatabase
TextBox1.Text = node("RegioneSociale").InnerText
Else
'in caso non sia selezionato alcun database
End If
Cursor = Cursors.Arrow
End If
Timer1.Stop()
Timer1.Enabled = False
End Sub
come detto, quando carica il file esterno in lettura, tutto si freeeza fin che non è stato caricato :(
Non so + che pesci pigliare :muro: :muro: :muro: :muro: :muro:
ecco, allora ho fatto come riportato in un esempio che hai citato, però la barra non è in funzione del caricamento del file ma è slegata, tanto che pure lei si blocca quando il file si sta caricando, per poi proseguire solo quando il file viene caricato completamente.
Infatti quella è puramente una ProgressBar grafica, giusto per dare un po' di "importanza" all'avvio ( leggi "fumo negli occhi" ).
Oltretutto mi ha fatto sorridere in quel thread la risposta che il tizio da alla domanda "ma il VB.NET sarebbe il visual basic normale?". E il tizio risponde : "No, il vb.net è un'edizione "aggiornata" del vb6, anche se è definito come un linguaggio diverso perchè dal vb6 al vb.net cambia molto"
:D
Ecco, ti consiglierei di stare alla larga dai "tutorial" di questo tipo.
Per ciò che devi fare tu è essenziale conoscere in anticipo il numero di operazioni o cicli da svolgere, sennò come fai ad impostare il .Maximum di una ProgressBar ? Se ad esempio vuoi caricare tutte le righe di un .txt o .xml ecc., prima fai in modo di conoscerne il numero, ad esempio :
'1. Numero linee in TEST.txt
Dim numLinee As Integer = 0
Dim SR As System.IO.StreamReader = System.IO.File.OpenText(percorso & "TEST.txt")
Dim strLinea As String = SR.ReadLine()
Do Until strLinea Is Nothing
strLinea = SR.ReadLine()
numLinee += 1
Loop
'2. Lettura
ProgressBar1.Minimum = 0
ProgressBar1.Value = ProgressBar1.Minimum
ProgressBar1.Maximum = numLinee
SR = System.IO.File.OpenText(percorso & "TEST.txt")
For i As Integer = 1 To numLinee
strLinea = SR.ReadLine()
'...
ProgressBar1.Value = i
Next
SR.Close()
SR.Dispose()
MsgBox("Fatto.")
;)
superbau
30-10-2009, 15:39
grazie,
ho capito come impsotare il numero valore massimo della mia progress bar dal tuo esempio, però non ho capito come far partire la mia progress bar. nel senso che cmq, quando eseguirò:
Dim DocS As New XmlDocument()
'lo carico in memoria '
DocS.Load(SelezioneDatabaseANA & "selezioneAna.xml")
da quel che vedo, cmq la progress bar si "FREZZERA'" per "x" tempo, sino a quando non sarà del tutto caricato il mio documento xml.
da quel che vedo SR è il mio file aperto ma è diverso da un file xml document, quindi mi da errore l'ugualianza xmldocument Docs = SR.
Quindi non essendo la stessa cosa SR e Docs, non posso usarlo nella mia variabile XmlDocuments e quindi dovrò ricaricarmi tutto.
Public SR As System.IO.StreamReader
Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
'1. Numero linee in TEST.txt
Dim numLinee As Integer = 0
SR = System.IO.File.OpenText(PercorsoAnagrafica & NomeAnagrafica & ".xml")
Dim strLinea As String = SR.ReadLine()
Do Until strLinea Is Nothing
strLinea = SR.ReadLine()
numLinee += 1
Loop
'2. Lettura
ProgressBar1.Minimum = 0
ProgressBar1.Value = ProgressBar1.Minimum
ProgressBar1.Maximum = numLinee
SR = System.IO.File.OpenText(PercorsoAnagrafica & NomeAnagrafica & ".xml")
For i As Integer = 1 To numLinee
strLinea = SR.ReadLine()
'...
ProgressBar1.Value = i
Next
'SR.Close()
' SR.Dispose()
MsgBox("Fatto.")
End Sub
e poi ho sostituito SR al mio document ma da errore...
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
bau += 1
If bau = 2 Then
Else
'--------------------------------------------------------
'lettura database se è selezionato dal fom Gestione Files
'--------------------------------------------------------
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'controlla se esiste una precedente selezione del database
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'istanzio il documento
Dim DocS As New XmlDocument()
'lo carico in memoria '
' DocS.Load(SelezioneDatabaseANA & "selezioneAna.xml")
DocS = SR
'recupero il nodo root
Dim elementS As XmlElement = DocS.DocumentElement
'recupero il valore all'interno del primo figlio dell'elemento root
Dim nodeS As XmlNode = elementS.FirstChild
'node("RegioneSociale").InnerText
If nodeS("sclelta").InnerText = "" Then
..e non posso neppure far così:
'1. Numero linee in TEST.txt
Dim DocS As New XmlDocument()
Dim numLinee As Integer = 0
SR = System.IO.File.OpenText(DocS.Load(SelezioneDatabaseANA & "selezioneAna.xml"))
Dim strLinea As String = SR.ReadLine()
Do Until strLinea Is Nothing
strLinea = SR.ReadLine()
numLinee += 1
Loop
'2. Lettura
ProgressBar1.Minimum = 0
ProgressBar1.Value = ProgressBar1.Minimum
ProgressBar1.Maximum = numLinee
SR = System.IO.File.OpenText(DocS.Load(SelezioneDatabaseANA & "selezioneAna.xml"))
For i As Integer = 1 To numLinee
strLinea = SR.ReadLine()
'...
ProgressBar1.Value = i
Next
'SR.Close()
' SR.Dispose()
MsgBox("Fatto.")
sicuramente è come al solito, so io che non capisco na mazza... uffa so propio duro di testa :muro:
P.s.
Si dovevo fare un txt e memorizzarmi il numero di righe della mia anagrafica prima di far partire la progress bar e andar a leggere il numero da li per impostare il max value, però cmq il problema persiste quando vado a caricare effettivamente il file docs xmldocument(). Cioè.. a mio avviso dovrei per risolvere il problema, legger il file xml che contiene i dati del database e in contemporanea far andare la mia progressbar. ma questo non succede inquanto quando carica il mio documento xml cmq si freeeza tutto. Caricarlo a priori non ha senso che esista la progressbar, in quanto sarebbe già cmq caricato. L'unica sarebbe far andare in contemporanea la progressbar e il caricamento del mio database in xml.
All'atto delle cose quando carico il mio anagrafica.xml si freeza tutto sin tanto che non è completato e poi continuano i lavori.
Se non erro dovrei dunque aprire in SRTEAM il mio ducumento in xml... ho forse detto una bestemmia ?
P.p.s
Forse ho ripetuto nel p.s. 1000 volte lo stesso concetto ^^
Direi che c'è parecchia confusione...
Il mio esempio precedente era per i txt. Puoi usare un Reader generico anche con gli Xml, ma in quel caso rinunci alle potenzialità del namespace "Xml".
Se carichi e processi un Xml in un colpo solo, ovviamente non tieni traccia dell'avanzamento, e quindi puoi usare solo una ProgressBar Marquee, che non dice nulla all'utente, ma solo un generico "attendere prego...".
Esempio di lettura di un semplice Xml "elemento per elemento", con ProgressBar :
Dim xmlDoc As New Xml.XmlDocument
xmlDoc.Load(percorso & "TEST.xml")
Dim XNL As Xml.XmlNodeList = xmlDoc.GetElementsByTagName("nomeElemento")
Dim numElem As Integer = XNL.Count - 1
ProgressBar1.Minimum = 0
ProgressBar1.Value = ProgressBar1.Minimum
ProgressBar1.Maximum = numElem
For i As Integer = 0 To numElem
ListBox1.Items.Add(XNL(i).InnerText)
'...
ProgressBar1.Value = i
Next
Ovviamente con gli Xml le cose si fanno più complesse che non con un semplice txt. Ci possono essere Items, SubItems, Attributi e quant'altro, perciò a te l'adattamento dell'esempio al tuo caso particolare... ;)
superbau
31-10-2009, 11:57
grazie, come sempre preciso e perfetto nelle risposte, è un piacere rivolgere domande qui, molto professionale.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.