Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Renault 5 elettrica al giudizio definitivo: solo stupore iniziale o premi meritati?
Renault 5 elettrica al giudizio definitivo: solo stupore iniziale o premi meritati?
Dopo più di un anno dal primo test drive ci siamo rimessi al volante della Renault 5 E-Tech Electric, questa volta utilizzandola come prima auto per circa due settimane. Scoprite con noi se il progetto convince ancora
HONOR CHOICE Projector Air Pro: piccolo, portatile e con Netflix
HONOR CHOICE Projector Air Pro: piccolo, portatile e con Netflix
Un proiettore economico, che fa della portabilità e immediatezza i suoi punti di forza. Adatto per una camera da letto o per la casa vacanze, è basato su sistema proprietario Linux ma offre piena compatibilità ufficiale a Netflix
ASUS ProArt GoPro Edition è il notebook compatto per chi crea
ASUS ProArt GoPro Edition è il notebook compatto per chi crea
Un notebook sviluppato in collaborazione con GoPro ma che risponde al meglio alle necessità di tutti coloro che creano contenuti video: robustezza, design, potenza di calcolo e funzionalità si abbinano al meglio tra di loro, pur se a prezzo di un costo elevato per via della tanta memoria onboard
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 02-10-2009, 11:00   #1
jackk87
Senior Member
 
Iscritto dal: Jan 2007
Messaggi: 404
[VB.NET] Aiuto immagine di attesa caricamento tra form

Buongiorno,
ho la schermata principale del mio programma e quando clicco su un pulsante della toolbar mi apre la form che voglio ma questa form contiene una combobox che all'apertura di esso viene popolata leggendo i dati da un DB access e questa form non viene caricata prima di 7 secondi perchè il DB è grande contiene circa 9000 record e quindi vorrei che prima di aprire la form mi carica un'altro form che alla fine è uno splash screen (contiene "Caricamento in corso" e una gif animata) e vorrei che durante il caricamento della form mi viene visualizzato e al momento che ha finito di popolare la combobox quindi alla visualizzazione della form lo splash screen si deve chiudere.
Ho provato molte cose ma niente mi apre solo lo splash screen e non finisce di caricare la form aiuto
grazie in anticipo a tutti
jackk87 è offline   Rispondi citando il messaggio o parte di esso
Old 02-10-2009, 12:52   #2
MarcoGG
Senior Member
 
L'Avatar di MarcoGG
 
Iscritto dal: Dec 2004
Messaggi: 3210
Lo si può fare abbastanza facilmente giocando con My.Application.DoEvents(). Ad esempio, ho 3 Form :
-Form1
-FormAttesa
-Form2 ( che contiene una ComboBox "pesante" ) :

> Anzitutto, in un modulo :
Codice:
    Public FA As FormAttesa
    Public F2 As Form2
> Form1 ( Click su pulsante per aprire Form2 ) :
Codice:
        FA = New FormAttesa
        FA.Show()
        F2 = New Form2
        F2.Show()
> Form2 :
Codice:
    Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        ComboBox1.Enabled = False
        For i As Integer = 1 To 500
            ComboBox1.Items.Add("elemento_" & i)
            System.Threading.Thread.Sleep(10)
            My.Application.DoEvents()
        Next
        FA.Close()
        ComboBox1.Enabled = True

    End Sub
MarcoGG è offline   Rispondi citando il messaggio o parte di esso
Old 02-10-2009, 13:28   #3
jackk87
Senior Member
 
Iscritto dal: Jan 2007
Messaggi: 404
Ciao Marco,
dopo provo ma con te vado a occhi chiusi senza di te sono perso hihihi
grazie ancora una volta
jackk87 è offline   Rispondi citando il messaggio o parte di esso
Old 02-10-2009, 14:24   #4
jackk87
Senior Member
 
Iscritto dal: Jan 2007
Messaggi: 404
Ciao Marco,
ho provato ma non ci sono riuscito allora i primi due passi è come hai scritto tu il terzo per quando riguarda il form2 il mio è così:
Codice:
Private Sub NuovoB_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        data.Value = Now.Date
        CaricaSpedizione()
        CaricaCitta()
        System.Threading.Thread.Sleep(100)
        My.Application.DoEvents()
        frmAttesa.Close()
        start = 1
    End Sub
questa è la procedura caricacitta che va a riempire la combobox:
Codice:
'Procedura per far per riempire la combobox citta
    Public Sub CaricaCitta()
        '***********************DATABASE***********************
        Dim sql As String 'variabile dove memorizzo la stringa sql

        'query
        sql = "select * from dbo_Comuni_ISTAT order by Descrizione"

        'effettuo la connessione al database ed eseguo la query memorizzando nella variabile
        Dim objDataAdapter As New OleDbDataAdapter(sql, Cn1)
        'crea il datatable
        Dim objTable As New DataTable()
        'inserisce i dati nel dataadapter
        objDataAdapter.Fill(objTable)

        citta.DataSource = objTable
        citta.DisplayMember = "Descrizione"
        citta.ValueMember = "Codice"
        citta.Text = ""

        If citta.Items.Count = 0 Then
            ecitta.Enabled = False
        Else
            ecitta.Enabled = True
        End If

        'effettuo la connessione al database ed eseguo la query memorizzando nella variabile
        Dim objDataAdapter1 As New OleDbDataAdapter(sql, Cn1)
        'crea il datatable
        Dim objTable1 As New DataTable()
        'inserisce i dati nel dataadapter
        objDataAdapter.Fill(objTable1)

        cittaM.DataSource = objTable1
        cittaM.DisplayMember = "Descrizione"
        cittaM.ValueMember = "Codice"
        cittaM.Text = ""

        If cittaM.Items.Count = 0 Then
            ecittam.Enabled = False
        Else
            ecittam.Enabled = True
        End If
        CalcolaCitta()
    End Sub
funziona tutto solo che tra i due form non mi carica quello per l'attesa

Ultima modifica di jackk87 : 02-10-2009 alle 14:26.
jackk87 è offline   Rispondi citando il messaggio o parte di esso
Old 02-10-2009, 15:17   #5
MarcoGG
Senior Member
 
L'Avatar di MarcoGG
 
Iscritto dal: Dec 2004
Messaggi: 3210
Codice:
System.Threading.Thread.Sleep(10)
L'ho usato io nell'esempio per simulare un caricamento oneroso, nel tuo caso è inutile metterlo.

Inoltre, se usi quel sistema ovvio che non funziona. Tu usi un Adapter, perciò carichi i dati in un colpo solo, oltretutto in sola lettura un DataReader è più veloce. Usa un DataReader, poi, nel ciclo di lettura del DataReader ( inserimento delle città nella Combo una per volta ) inserisci il DoEvents()...
MarcoGG è offline   Rispondi citando il messaggio o parte di esso
Old 03-10-2009, 11:11   #6
jackk87
Senior Member
 
Iscritto dal: Jan 2007
Messaggi: 404
Ciao Marco quindi dovrei fare questo:
Codice:
Dim cmd As New OleDbCommand(sql, Cn1)
   
Dim dr As OleDbDataReader = cmd.ExecuteReader

Do While dr.Read()
     citta.Items.Add(dr.Item("Descrizione"))
Loop
dr.Close()
Allora il primo problema è che il ciclo mi rimane in loop, il secondo come faccio ad assegnare anche il valore alla combobox?
ES. prima utilizzavo citta.ValueMember = "Codice"

utilizzavo citta.DataSource = objTable per l'autocomplete adesso come lo faccio?

scusa Marco se ti faccio queste domande ma il datareader a me non funziona mai come dovrebbe funzionare
jackk87 è offline   Rispondi citando il messaggio o parte di esso
Old 03-10-2009, 12:04   #7
jackk87
Senior Member
 
Iscritto dal: Jan 2007
Messaggi: 404
Ciao Marco,
ho risolto così i miei problemi allora ho fatto la procedura carica città in questo modo:
Codice:
Public Sub CaricaCitta()
        '***********************DATABASE***********************
        Dim sql As String 'variabile dove memorizzo la stringa sql

        'query
        sql = "select * from dbo_Comuni_ISTAT order by Descrizione"
        'effettuo la connessione al database ed eseguo la query memorizzando nella variabile
        Dim cmd As New OleDbCommand(sql, Cn1)
        'inserisce il risultato nel datareader
        Dim dr As OleDbDataReader
        Dim Dati As ArrayList = New ArrayList()
        Dim Dati1 As ArrayList = New ArrayList()
        Try
            dr = cmd.ExecuteReader()
            While dr.Read
                Dati.Add(New addValore(dr.Item("Descrizione"), dr.Item("Codice")))
                Dati1.Add(New addValore(dr.Item("Descrizione"), dr.Item("Codice")))
                'System.Threading.Thread.Sleep(100)
                My.Application.DoEvents()
            End While
            frmAttesa.Close()
        Catch e As Exception
            MessageBox.Show("Errore: " + e.ToString)
        Finally
            cmd.Dispose()
            dr.Close()
            dr.Dispose()
        End Try
        citta.DataSource = Dati
        citta.DisplayMember = "Display"
        citta.ValueMember = "Value"

        cittaM.DataSource = Dati1
        cittaM.DisplayMember = "Display"
        cittaM.ValueMember = "Value"
    End Sub
dove addValore è una classe che contiene:
Codice:
Public Class addValore

    Private m_Display As String
    Private m_Value As String

    Public Sub New(ByVal Display As String, ByVal Value As String)
        m_Display = Display
        m_Value = Value
    End Sub

    Public ReadOnly Property Display() As String
        Get
            Return m_Display
        End Get
    End Property

    Public ReadOnly Property Value() As String
        Get
            Return m_Value
        End Get
    End Property
End Class
così ho risolto i miei problemi che ti ho elengato prima però il form di attesa me lo fa vedere solo per 2 sec e non per il tempo che il programma ci mette a popolare le combobox come posso risolvere?
grazie in anticipo

Ultima modifica di jackk87 : 03-10-2009 alle 12:12.
jackk87 è offline   Rispondi citando il messaggio o parte di esso
Old 04-10-2009, 09:24   #8
MarcoGG
Senior Member
 
L'Avatar di MarcoGG
 
Iscritto dal: Dec 2004
Messaggi: 3210
Allora, non sono molto d'accordo con la tua soluzione : perchè usare 2 ArrayList d'appoggio ? Vediamo di sistemare il popolamento della Combo, poi pensiamo al discorso della splash d'attesa.

1. Come hai giustamente notato la ComboBox può gestire elenchi di Oggetti, quindi classi, a questo punto è inutile richiamare .ValueMember e .DisplayMember, e sono inutili ulteriori passaggi tra Reader e array di appoggio superflui :

Codice:
        ...
        ...
        Dim RDR As OleDb.OleDbDataReader = CMD.ExecuteReader()

        While (RDR.Read())

            ComboBox1.Items.Add(New ComboItem(RDR("campo1"), RDR("campo2")))

        End While
        RDR.Close()
        ...
        ...
2. ComboItem è la mia classe personalizzata per gestire gli oggetti della Combo ( la tua "addValore"... ) :

Codice:
Public Class ComboItem

    Private m_displayMember As String
    Private m_valueMember As String

    Public Sub New(ByVal dm As String, ByVal vm As String)

        m_displayMember = dm
        m_valueMember = vm

    End Sub

    Public Overrides Function ToString() As String
        Return m_displayMember
    End Function

    Public Property DMember() As String
        Get
            Return m_displayMember
        End Get
        Set(ByVal value As String)
            m_displayMember = value
        End Set
    End Property

    Public Property VMember() As String
        Get
            Return m_valueMember
        End Get
        Set(ByVal value As String)
            m_valueMember = value
        End Set
    End Property

End Class
Da notare che eseguendo l'Override di .ToString(), se vado ad aggiungere alla Combo l'oggetto con .Add(), la Combo "capirà" che il DisplayMember è "campo1".

3. Come faccio, a questo punto, dato che non ho settato il ValueMember della Combo, ad estrarlo su selezione dell'utente ? Semplice :

Codice:
    Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged

        MsgBox(CType(ComboBox1.SelectedItem, ComboItem).VMember)

    End Sub


4. Infine, come già detto, basta che aggiungi un My.Application.DoEvents() nel ciclo di lettura del Reader, e, seguendo il mio esempio precedente, avrai la tua Form di attesa !
MarcoGG è offline   Rispondi citando il messaggio o parte di esso
Old 05-10-2009, 07:59   #9
jackk87
Senior Member
 
Iscritto dal: Jan 2007
Messaggi: 404
Ciao Marco,
ho provato e ho capito tutti gli errori anzi gli orrori che ho fatto in precedenza come hai detto tu funziona perfettamente. l'unica domanda che è rimasta adesso è facendo in questo modo cioè caricare la combobox 1 ad 1 ci mette più di 3 minuti a caricare la form mentre caricandoli tutti insieme come facevo in precedenza ci mette 10 secondi c'è un modo per velocizzare in questo modo?altrimenti mi conviene farla aprire dopo 10 secondi senza il form attesa che con il form attesa però dopo 3 minuti...aspetto tue risposte grazie ancora per la pasienza
jackk87 è offline   Rispondi citando il messaggio o parte di esso
Old 05-10-2009, 10:20   #10
MarcoGG
Senior Member
 
L'Avatar di MarcoGG
 
Iscritto dal: Dec 2004
Messaggi: 3210
Quote:
Originariamente inviato da jackk87 Guarda i messaggi
Ciao Marco,
ho provato e ho capito tutti gli errori anzi gli orrori che ho fatto in precedenza come hai detto tu funziona perfettamente. l'unica domanda che è rimasta adesso è facendo in questo modo cioè caricare la combobox 1 ad 1 ci mette più di 3 minuti a caricare la form mentre caricandoli tutti insieme come facevo in precedenza ci mette 10 secondi c'è un modo per velocizzare in questo modo?altrimenti mi conviene farla aprire dopo 10 secondi senza il form attesa che con il form attesa però dopo 3 minuti...aspetto tue risposte grazie ancora per la pasienza
3 minuti ?
Mi pare strano, anche se ammetto che My.Application.DoEvents() in un ciclo appesantisce parecchio l'operazione...

In ogni caso, c'è sempre la possibilità di aprire la FormAttesa su un Thread separato ( e adesso che ci penso, forse la dovevo mettere come prima scelta... ).

In pratica :

> Modulo :
Codice:
Public F2 As Form2
> Apertura Form2 :
Codice:
        F2 = New Form2
        F2.Show()
> Form2 :
Codice:
Public Class Form2

    Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim T As New System.Threading.Thread(AddressOf Metodi.MostraFormAttesa)
        T.Start()

        ComboBox1.Enabled = False
        ...
        ...
        CODICE inserimento da DB a ComboBox
        ...
        ...
        ComboBox1.Enabled = True

        Metodi.ChiudiFormAttesa()

    End Sub

End Class
A questo punto "CODICE inserimento da DB a ComboBox" può essere qualsiasi cosa, Adapter + DataSet, DataReader, ecc... E inoltre NON è più necessario il DoEvents() !

> Metodi, Classe statica che gestisce la FormAttesa :

Codice:
Public Class Metodi

    Private Sub New()
        'Classe statica
    End Sub

    Private Shared FA As FormAttesa

    Public Shared Sub MostraFormAttesa()

        FA = New FormAttesa
        Application.Run(FA)
 
    End Sub

    Public Shared Sub ChiudiFormAttesa()

        FA.Chiudi()

    End Sub

End Class
> FormAttesa :
Codice:
Public Class FormAttesa

    Private Delegate Sub DlgChiudiForm()

    Public Sub Chiudi()

        If Me.InvokeRequired Then
            Dim C As New DlgChiudiForm(AddressOf Chiudi)
            Me.Invoke(C)
        Else
            Me.Close()
        End If

    End Sub

End Class
Soluzione sicuramente più adattabile e valida della precedente.
Prova con l'Adapter e anche col DataReader, e vedi quale va meglio...
MarcoGG è offline   Rispondi citando il messaggio o parte di esso
Old 05-10-2009, 15:52   #11
jackk87
Senior Member
 
Iscritto dal: Jan 2007
Messaggi: 404
Ciao Marco,
adesso funziona tutto perfettamente meno di 10 secondi e con il form di caricamento grazie davvero prima o poi dovrò farti un monumento
jackk87 è offline   Rispondi citando il messaggio o parte di esso
Old 08-10-2009, 12:52   #12
jackk87
Senior Member
 
Iscritto dal: Jan 2007
Messaggi: 404
Ciao Marco,
scusami ancora un'ultima cosa io ho bisogno di far visualizzare il form in modalità showdialog. Se il form lo faccio avviare in questa modalità dopo la chiusura del thread quindi alla visualizzazione del form l'applicazione perde il focus cioè se ho delle finestre aperte il programma va dietro tutte le finestre. Se il form lo faccio partire senza quello d'attesa quindi senza thread non ho problemi il programma rimane con il focus e lo stesso se inserisco il form di attesa ma il secondo form lo avvio normalmente con show.Ho provato a inserire dei focus ma niente non funziona spero che puoi aiutarmi grazie
jackk87 è offline   Rispondi citando il messaggio o parte di esso
Old 08-10-2009, 13:18   #13
MarcoGG
Senior Member
 
L'Avatar di MarcoGG
 
Iscritto dal: Dec 2004
Messaggi: 3210
Prova con .BringToFront sulla/sulle Form che desideri stiano in primo piano. ShowDialog non è sempre necessario...
MarcoGG è offline   Rispondi citando il messaggio o parte di esso
Old 10-10-2009, 11:22   #14
jackk87
Senior Member
 
Iscritto dal: Jan 2007
Messaggi: 404
Ciao Marco,
non funziona neanche con bringtofront e se lo metto alla chiusura del form di attesa si blocca su questo form e non mi apre il secondo. Ho notato anche che come parte il form di attesa il primo form perde il focus e se ci clicco con il mouse sul primo form al termine del form di attesa non si naascondono sotto le finestre ma rimane tutto in primo piano come vorrei io. grazie ancora marco spero che mi aiuterai
jackk87 è offline   Rispondi citando il messaggio o parte di esso
Old 10-10-2009, 12:25   #15
MarcoGG
Senior Member
 
L'Avatar di MarcoGG
 
Iscritto dal: Dec 2004
Messaggi: 3210
Quote:
Originariamente inviato da jackk87 Guarda i messaggi
Ciao Marco,
non funziona neanche con bringtofront e se lo metto alla chiusura del form di attesa si blocca su questo form e non mi apre il secondo. Ho notato anche che come parte il form di attesa il primo form perde il focus e se ci clicco con il mouse sul primo form al termine del form di attesa non si naascondono sotto le finestre ma rimane tutto in primo piano come vorrei io. grazie ancora marco spero che mi aiuterai
Non ho chiaro cosa vuoi ottenere. Ma se pensi di avere il Focus su più Form contemporaneamente temo rimarrai deluso. In un'applicazione WinForms il Focus va automaticamente sull'ultimo Form aperto, e in ogni caso, un solo Form per volta ( e un solo controllo per volta sullo stesso Form ) può avere il Focus...
MarcoGG è offline   Rispondi citando il messaggio o parte di esso
Old 10-10-2009, 12:49   #16
jackk87
Senior Member
 
Iscritto dal: Jan 2007
Messaggi: 404
Quote:
Originariamente inviato da MarcoGG Guarda i messaggi
Non ho chiaro cosa vuoi ottenere. Ma se pensi di avere il Focus su più Form contemporaneamente temo rimarrai deluso. In un'applicazione WinForms il Focus va automaticamente sull'ultimo Form aperto, e in ogni caso, un solo Form per volta ( e un solo controllo per volta sullo stesso Form ) può avere il Focus...
allora io ho il mio form principale dove se clicco sul pulsante "nuovo" mi deve aprire il form di inserimento in modalità showdialog e l'applicazione rimane in primo piano. Se tra i due form inserisco il form di attesa al momento della chiusura di lui e dell'apertura del form nuovo l'applicazione passa in secondo piano quindi è come se si riduce ad icona. mentre se il form nuovo lo apro con il form d'attesa e in modalita show questo non accade vorrei solo che all'apertura del form nuovo in modalità showdialog l'applicazione non passa in secondo piano ma rimane in primo piano
jackk87 è offline   Rispondi citando il messaggio o parte di esso
Old 10-10-2009, 13:38   #17
MarcoGG
Senior Member
 
L'Avatar di MarcoGG
 
Iscritto dal: Dec 2004
Messaggi: 3210
Quote:
Originariamente inviato da jackk87 Guarda i messaggi
allora io ho il mio form principale dove se clicco sul pulsante "nuovo" mi deve aprire il form di inserimento in modalità showdialog e l'applicazione rimane in primo piano. Se tra i due form inserisco il form di attesa al momento della chiusura di lui e dell'apertura del form nuovo l'applicazione passa in secondo piano quindi è come se si riduce ad icona. mentre se il form nuovo lo apro con il form d'attesa e in modalita show questo non accade vorrei solo che all'apertura del form nuovo in modalità showdialog l'applicazione non passa in secondo piano ma rimane in primo piano
E' vero, probabilmente a causa dell'apertura del FormAttesa in un thread separato, ma succede solo con ShowDialog... Strano comportamento. Comunque, prima di sbatterci la testa, perchè ti serve per forza uno ShowDialog ? Se è per disabilitare il Form chiamante basta fare un .Enabled = False e ripristinarlo sulla chiusura del Form2. Se è per passare un valore dalla Form2 al Form di partenza, può essere fatto tranquillamente senza ShowDialog...
MarcoGG è offline   Rispondi citando il messaggio o parte di esso
Old 10-10-2009, 14:19   #18
jackk87
Senior Member
 
Iscritto dal: Jan 2007
Messaggi: 404
ok marco grazie per i consigli cerco di trovare un'altra strada tipo quelle che mi hai suggerito grazie ancora
jackk87 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Renault 5 elettrica al giudizio definitivo: solo stupore iniziale o premi meritati? Renault 5 elettrica al giudizio definitivo: solo...
HONOR CHOICE Projector Air Pro: piccolo, portatile e con Netflix HONOR CHOICE Projector Air Pro: piccolo, portati...
ASUS ProArt GoPro Edition è il notebook compatto per chi crea ASUS ProArt GoPro Edition è il notebook c...
Fable e Sol a confronto: due cartoni animati creati su un PC con RTX 3090 Fable e Sol a confronto: due cartoni animati cre...
Il tablet rugged leggero e sottile: Lenovo ThinkTab X11 offre resistenza, doppia USB-C e batteria rimovibile Il tablet rugged leggero e sottile: Lenovo Think...
Le marmotte finiscono su OnlyFans, ma il...
Xbox Cloud Gaming si espande e arriva su...
Il riconoscimento facciale con IA per co...
MacBook Ultra: il nuovo design arriver&a...
Gli utenti passano più tempo su Instagra...
L'AI sta facendo guadagnare miliardi anc...
L'Odissea di Nolan rilancia Assassin's C...
Russia vieta il mining di criptovalute a...
Lenovo sta preparando il lancio di un Go...
L'intelligenza artificiale colpisce dove...
Xiaomi, si prepara ad aggiornare la fasc...
Rincari in arrivo per gli iPhone: i nuov...
Le edizioni fisiche dei giochi per PlayS...
Aziende IA comprano migliaia di libri ac...
L'IA frena gli utenti di Reddit: azioni ...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 06:21.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v