Visualizzazione dei risultati da 1 a 10 su 10

Discussione: VB .NET:Metodo Show

  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2004
    Messaggi
    200

    VB .NET:Metodo Show

    Ciao a tutti, ho un comportamento di un form che non riesco a capire.

    Dal form principale chiamo un semplicissimo form secondario contentente un panel e una label con una scritta.

    Ebbene, quando il form secondario finalmente viene chiamato con FormSecondario.Show, questo appare ma la label con la scritta no. L'effetto visivo che si presenta è come quello di una pagina di giornale dove centralmente è stato ritagliato un articolo. Al posto della label, si intravede insomma lo sfondo del desktop.

    La visualizzazione corretta si ottiene solo dopo che il form principale è stato visualizzato.

    Codice:

    Public Class FormPrincipale

    Sub OpenFormSecondario() Handles Me.Load

    FormSecondario.Show() 'vedo il form con il ritaglio al posto della label
    Sleep(1000)

    End Sub 'finalmente dopo la end sub vedo il form principale ed il secondario con la label

    End Class

    Qualcuno sà spiegarmi questo strano comportamento?

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Prima della Sleep inserisci una DoEvents ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2004
    Messaggi
    200
    Originariamente inviato da oregon
    Prima della Sleep inserisci una DoEvents ...
    Ti ringrazio per la solerte risposta. Sì, ho dovuto usare il metodo My.Application.DoEvents anche se non ne ho capito il motivo.
    Infatti, se è pur vero che il metodo show viene richiamata all'interno di un modulo sul quale grava l'Handler (Load in questo caso) e che quindi gli altri eventi vengono per default accodati per essere gestiti solo alla fine dell'evento in corso, è anche vero che ha mio avviso il form secondario non dovrebbe generare alcun evento e quindi in teoria non ci sarebbe stato bisogno di forzare la Doevents. A meno che, la preparazione del form non venga inteso dal framework come un evento. Mah!

    Comunque adesso funziona. Ti ringrazio.

    Solo una curiosità. Per avere la risposta pronta ci avrai sbattuto la testa un bel po' di volte. Vero?

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da Calaf1966
    Solo una curiosità. Per avere la risposta pronta ci avrai sbattuto la testa un bel po' di volte. Vero?
    No ... conosco la risposta perche' so come funziona Windows ...

    Se esegui una Sleep, viene messo in pausa dal sistema operativo il thread corrente che e' quello che si occupa di processare tutti i messaggi che lo stesso sistema operativo invia alla finestra per ridisegnarsi; così facendo, tali messaggi (WM_PAINT e simili) non sono processati completamente e il ridisegno non avviene correttamente.

    La DoEvents garantisce che la "message pump" si occupi interamente di tali messaggi prima di "addormentare" il thread.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2004
    Messaggi
    200
    Originariamente inviato da oregon

    Se esegui una Sleep....
    Sì, per la Sleep potrei anche capire ma anche senza sleep avrei lo stesso comportamento. Ho usato il debug per verificare. Solo dopo ho aggiunto una Sleep. Per questo ancora non capisco quale tipo di evento sia legato (e quindi accodato) alla visualizzazione del form secondario (completamente vuoto a parte la label). Che sia l'evento Shown? Mah!

  6. #6
    Credo che si tratti banalmente del messaggio WM_PAINT...
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2004
    Messaggi
    200
    Originariamente inviato da MItaly
    Credo che si tratti banalmente del messaggio WM_PAINT...
    Messaggio WM_Paint? Veramente ero in cerca di un evento. La DoEvents ordina al framework di eseguire immediatamente anche gli altri eventi accodati e generati durante la gestione di un altro evento. Nel mio caso il framework stava gestendo l'evento Load. Nel gruppo di istruzioni scritte per gestire tale evento, ho inserito la FormSecondario.Show. Ora, non avendo dato l'esito voluto se non dopo la fine della gestione dell'evento Load, ho forzato con la "DoEvents" la gestione real time di eventuali eventi accodati. A questo punto la visualizzazione del formsecondario è stata impeccabile. Da ciò si deduce che quella "FormSecondario.Show()" ha generato un evento la cui gestione è fondamentale per l'esecuzione completa della Show stessa. Tale evento generato si è accodato per essere eseguito dopo l'evento Load. La "DoEvents" ha ordinato di eseguirlo subito, sedutastante. Ora, ciò che mi sono chiesto è: quale tipo di evento è stato mai generato?

    La domanda mi pare lecita, poichè in fase di programmazione, pur conoscendo il metodo "DoEvents", mai e poi mai mi sarebbe venuto in mente di utilizzarlo. Perchè mai è poi mai mi sarebbe venuto in mente che una semplice Show di un form senza codice (solo la presenza di una label in un panel) avrebbe generato un evento fondamentale da gestire.

    Con ciò, voglio dire che a volte per ottenere quello che si vuole bisogna andare a tentoni. E quando in futuro qualcuno avrà lo stesso problema, certamente saprò cosa rispondere nel caso mi si chieda aiuto. Ma non saprò dare una spiegazione esatta.

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Si deve parlare di "messaggi" (WM_PAINT e' un messaggio ... http://msdn2.microsoft.com/en-us/lib...01(VS.85).aspx) che vengono scambiati tra Windows e l'applicazione (le finestre dell'applicazione).

    La DoEvents non ordina nulla al framework. Questa lavora ad un livello piu' "basso" (infatti e' un discorso comune a tutti i programmi scritti, anche in altri linguaggi, su Windows ...).

    La DoEvents serve (ma te lo avevo gia' scritto) alla "message pump" per "processare" tutti i messaggi che stanno nell'apposita "coda" del thread, tra cui quello per il ridisegno del form.
    Questo lavoro verrebbe comunque compiuto alla fine dell'evento Load.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Utente di HTML.it
    Registrato dal
    Feb 2004
    Messaggi
    200
    Originariamente inviato da oregon
    Si deve parlare di "messaggi" (WM_PAINT e' un messaggio ... http://msdn2.microsoft.com/en-us/lib...01(VS.85).aspx) che vengono scambiati tra Windows e l'applicazione (le finestre dell'applicazione).

    La DoEvents non ordina nulla al framework. Questa lavora ad un livello piu' "basso" (infatti e' un discorso comune a tutti i programmi scritti, anche in altri linguaggi, su Windows ...).

    La DoEvents serve (ma te lo avevo gia' scritto) alla "message pump" per "processare" tutti i messaggi che stanno nell'apposita "coda" del thread, tra cui quello per il ridisegno del form.
    Questo lavoro verrebbe comunque compiuto alla fine dell'evento Load.
    Per quanto ne sò non si tratta di messaggi ma di eventi.
    Riporto fedelmente quanto letto sul manuale relativamente al DoEvents:

    "Il metodo My.Application.DoEvents consente all'applicazione di gestire altri eventi che potrebbero verificarsi durante l'esecuzione del codice. Il metodo My.Application.DoEvents ha lo stesso comportamento del metodo DoEvents.

    Quando si esegue un'applicazione Windows Forms, viene creato un nuovo form che resta quindi in attesa di eventi da gestire. Ogni volta che il form gestisce un evento, come ad esempio un clic su un pulsante, esso elabora tutto il codice associato all'evento. Tutti gli altri eventi aspettano in coda. Mentre il codice gestisce l'evento, l'applicazione non risponde. La finestra, ad esempio, non viene ridisegnata se le viene trascinata sopra un'altra finestra.

    Se nel codice viene inserita una chiamata al metodo My.Application.DoEvents, l'applicazione può gestire gli altri eventi. Se ad esempio il codice aggiunge dei dati a una classe ListBox in un ciclo, e dopo ogni passaggio del ciclo chiama il metodo My.Application.DoEvents, il form viene ridisegnato quando un'altra finestra gli viene trascinata sopra. Se il metodo My.Application.DoEvents viene rimosso dal codice, il form non verrà ridisegnato finché il gestore eventi Click del pulsante non ha terminato l'esecuzione".

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Sì ma il discorso che ti ho fatto sta "sotto" la faccenda della gestione degli eventi.

    Gli eventi sono richiamati in un certo ordine perche' c'e' una certa gestione dei "messaggi" da parte di Windows al di "sotto" del framework.

    Non fermarti allo strato .NET ... per capire cosa succede esattamente con il DoEvents devi spingerti un po' piu' "sotto" dando un'occhiata allo scambio di messaggi di Windows.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

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.