WaitCursor - MiniTip

Mi trovo spesso a dover cambiare il cursore dei miei programmi in WaitCursor per suggerire all'utente di attendere. Prendendo spunto da un forum (di cui ho perso ogni riferimento) mi sono costruito la seguente mini-classe:

Public Class HourGlassCursor

    Public Sub New()
        Cursor.Current = Cursors.WaitCursor
    End Sub

    Protected Overrides Sub Finalize()
        Cursor.Current = Cursors.Default
        MyBase.Finalize()
    End Sub

End Class

 

In questo modo basta inserire ove necessario (di solito all'inizio della routine interessata) la seguente istruzione:

Dim hgc As New HourGlassCursor

Ed in uscita dalla routine stessa in cursore tornerà allo stato di default.

Technorati Tag: ,

posted @ martedì 8 luglio 2008 0.02

Print

Comments on this entry:

# re: WaitCursor - MiniTip

Left by fabrizio at 08/07/2008 8.34
Gravatar
Interessante. Non dovrebbero esserci problemi ma teoricamente non sai quando esattamente verrà chiamato il Finalize. (OK, è solo teoria)
From MSDN: "The exact time when the finalizer executes during garbage collection is undefined. Resources are not guaranteed to be released at any specific time".
http://msdn.microsoft.com/en-us/library/system.object.finalize(VS.80).aspx

Sempre su MSDN, stessa pagina, c'è anche scritto: "The thread on which the finalizer is run is unspecified". Qui non so cosa dire.... mica c'è quel problema di toccare la GUI da un'altro thread che non è il princiapale? Nel tuo codice cambi cursore, che è un elemento della GUI... Boh..

# re: WaitCursor - MiniTip

Left by Michele Bernardi at 08/07/2008 8.40
Gravatar
Io mi sono fatto una classe "stack dei cursori"... Certo hai comunque il problema di doverti ricordare la "Pop", però non quello di ricrodare che cursore avevi in precedenza.

# re: WaitCursor - MiniTip

Left by Riccardo at 08/07/2008 9.21
Gravatar
Infatti... ed a mio avviso il modo migliore di tenere traccia dello stack dei cursori è quello di farlo fare al Framework... ecco cosa scriverei in c#:

public class HourGlassCursor : IDisposable
{
private readonly Cursor _oldCursor;

public HourGlassCursor()
{
_oldCursor = Cursor.Current;
Cursor.Current = Cursors.WaitCursor;
}

public void Dispose()
{
Cursor.Current = _oldCursor;
}
}

ed in fase di utilizzo scriverei semplicemente:
using (new HourGlassCursor())
{
Mio codice
}

ciao, Riccardo.

# re: WaitCursor - MiniTip

Left by Nazareno at 08/07/2008 10.06
Gravatar
Grazie per i suggerimenti... direi che la versione di Riccardo porta la "mia" classe HourGlassCursor alla versione 2.0 :-)

# re: WaitCursor - MiniTip

Left by M.rkino at 08/07/2008 11.27
Gravatar
come ti han detto, attento il Finalize non è affidabile... la risorsa potrebbe non essere liberata quando speri.

La tua esigenza suona simile a un suggerimento che ho aperto su "lady bug", che avevo raccontanto qui http://blogs.ugidotnet.org/Markino/archive/2006/04/15/38867.aspx

# re: WaitCursor - MiniTip

Left by M.rkino at 08/07/2008 11.28
Gravatar
Qui su "lady bug", http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=117101 ...stato Postponed :(

Your comment:



 (will not be displayed)


 
 
 
Please add 8 and 3 and type the answer here:
 

Live Comment Preview:

 
«febbraio»
domlunmarmergiovensab
2930311234
567891011
12131415161718
19202122232425
26272829123
45678910