La seguente subroutine in VB.NET permette di ricavare le caption di tutte le finestre aperte:
Public Sub GetAllWindowsCaption(ByRef Captions As System.Collections.ArrayList)
Dim proc As System.Diagnostics.Process
Captions.Clear()
For Each proc In Process.GetProcesses()
If proc.MainWindowTitle.Length > 0 Then
Captions.Add(proc.MainWindowTitle)
End If
Next proc
End Sub
Al ritorno dalla subroutine, la collections Captions contiene la lista delle caption.
La seguente function consente di recuperare l'occupazione di memoria (in bytes) di un processo attivo sulla macchina locale o su di una macchina in rete.
I parametri in input sono:
MachineName = nome della macchina;
Processname = nome del processo.
La funzione restituisce MEMORY_EXCEPTION se la macchina remota non esiste, MEMORY_NOPROCESS se il processo non è attivo oppure lo spazio di memoria occupato dal processo (come intero a 64 bit).
Const MEMORY_EXCEPTION As Int64 = -2
Const MEMORY_NOPROCESS As Int64 = -1
Public Function GetProcessMemory(ByVal MachineName As String, ByVal ProcessName As String) As Int64
Dim oProcess As Process
Dim oProcesses As Process()
Try
If String.Compare(MachineName, "") = 0 Then
oProcesses = Process.GetProcesses()
Else
oProcesses = Process.GetProcesses(MachineName)
End If
For Each oProcess In oProcesses
If String.Compare(oProcess.ProcessName.ToLower(), ProcessName.ToLower()) = 0 Then
Return oProcess.WorkingSet
End If
Next
Catch
Return MEMORY_EXCEPTION
End Try
Return MEMORY_NOPROCESS
End Function
La seguente function in VB.NET permette di ricavare, in maniera ricorsiva, l'insieme dei controlli presenti all'interno di una form.
L'argomento Form è la form da cui ricavare l'elenco dei controlli ed è di tipo Object per permettere la ricorsione sui controlli all'interno di controlli di tipo Container.
Public Sub GetAllControls(ByVal Form As System.Object, ByRef Controls As System.Collections.ArrayList)
Dim ctrl As System.Windows.Forms.Control
For Each ctrl In Form.controls
If ctrl.Controls.Count > 0 Then
GetAllControls(ctrl, Controls)
End If
Controls.Add(ctrl)
Next
End Sub
La seguente function in VB.NET permette di ricavare, in maniera ricorsiva, l'occupazione su disco (in Kbytes) di una directory.
La variabile Path contiene il percorso della directory (senza il carattere terminatore "\").
La funzione ritorna lo spazio occupato oppure -1 se si è verificato un errore
Il costrutto try/catch è utilizzato per garantire che la funzione non vada mai in errore.
Public Function GetDirSize(ByVal Path As System.String) As Int64
Try
Dim dirdata() As System.IO.DirectoryInfo
Dim filedata() As System.IO.FileInfo
Dim file As System.IO.FileInfo
Dim dimension As Int64 = 0
Dim dir As System.IO.DirectoryInfo = New System.IO.DirectoryInfo(Path)
' Scansione dei file della directory
filedata = dir.GetFiles("*.*")
For Each file In filedata
dimension = dimension + file.Length
Next
' Scansione delle sottodirectory
dirdata = dir.GetDirectories("*")
For Each dir In dirdata
dimension = dimension + GetDirSize(dir.FullName)
Next
Return dimension
Catch
Return -1
End Try
End Function
Vengono utilizzate le classi DirectoryInfo e FileInfo e non le classi Directory e File poichè le prime non eseguono le autorizzazioni di sicurezza ogni volta che viene utilizzato un metodo (come invece fanno le seconde) migliorando le prestazioni.
In Visual Basic 6.0 esiste l'oggetto App che ci fornisce informazioni riguardo la nostra applicazione.
In VB.NET l'oggetto App è sparito ed è comparso il namespace System.Reflection.Assembly.
La seguente funzione recupera il percorso dell'applicazione:
Public Function GetPath() as System.String
Dim Path as System.String
Path = System.Reflection.Assembly.GetExecutingAssembly.Location
Path = Path.Substring(0, Path.LastIndexOf("\"))
GetPath=Path
End Function
Il Framework .NET offre la possibilità di memorizzare, all'interno di un assembly, un qualunque tipo di file (cablandolo all'interno dell'EXE o dell DLL).
Per fare ciò è necessario:
1) importare il file all'interno del progetto utilizzando il menù Project\Add Existing Items;
2) selezionare il file all'interno del solution explorer e selezionare il menù contestuale properties;
3) modificare la proprietà Build Action in Embedded Resource;
4) utilizzare il seguente codice per caricare il contenuto del file all'interno di un array di byte:
.
.
Dim As As System.Reflection.Assembly
Dim st As System.IO.Stream
Dim bytearray As Byte()
As = Reflection.Assembly.GetExecutingAssembly
st = As.GetManifestResourceStream("RootNamespace.file.ext")
ReDim bytearray(CInt(st.Length) - 1)
st.Read(bytearray, 0, CInt(st.Length))
st.Close()
.
.
RootNameSpace è il nome del namespace root dell'assembly mentre file.ext è il nome del file inserito nel progetto.
La chiamata del metodo GetManifestResourceStream può sollevare un'eccezione se il file supera la dimensione di 2GB.
Si può fare in modo che una form non superi una dimensione massima e una dimensione minima prestabilita modificando il costruttore della form inserendon le seguenti istruzioni:
Protected Sub New()
.
.
Me.MaximumSize = New System.Drawing.Size(MaxWidth, MaxHeight)
Me.MinimumSize = New System.Drawing.Size(MinWidth, MinHeight)
.
.
End Sub
Quando si devono inserire molti valori all0'interno di una listbox, è possibile fa in modo che il framework .NET aggiorni la stessa list box una sola volta al termine del riempimento.
E' sufficiente invocare il metodo BeginUpdate() prima di cominciare il riempimento della list box e il metodo EndUpdate() al termine dello stesso per rendere effettivi i cambiamenti.
Un esempio di utilizzo di questa tecnica è riportato nel seguente pezzo di codice:
.
.
lstDati.BeginUpdate()
for i=0 to 100
lstdati.Items.Add(array(i))
next i
lstDati.EndUpdate()
.
.
Per ottenere un simpatico effetto animazione della caption delle nostre applicazioni VB.NET possiamo utilizzare la seguente routine:
Public Sub CaptionThread()
Dim strCaption As System.String = "Caption Animata ...."
Dim counter As System.Int16
While (True)
For counter = 0 To strCaption.Length
Me.Text = strCaption.Substring(0, counter)
System.Threading.Thread.Sleep(100)
Next
For counter = 0 To strCaption.Length - 1
Me.Text = strCaption.Substring(counter)
System.Threading.Thread.Sleep(100)
Next
End While
End Sub
Questa deve essere eseguita in un apposito thread della nostra form:
Private AnimationCaptionThread As System.Threading.Thread
il quale deve essere avviato nell'evento load:
Private Sub Form1_Load(.....) Handles MyBase.Load
.
.
AnimationCaptionThread = New System.Threading.Thread(AddressOf CaptionThread)
AnimationCaptionThread .Start()
.
.
End Sub
ed arrestato nell'evento Closed:
Private Sub Form1_Closed(......) Handles MyBase.Closed
.
.
AnimThread.Abort()
.
.
End Sub
La proprietà Location di un oggetto System.Windows.Forms.Control o di un oggetto System.Windows.Forms.Form restituisce la posizione fisica dell'oggetto stesso rispetto al padre.
Per poter ricavare la posizione assoluta rispetto alla form principale oppure allo schermo si può ricorrere alla seguente routine:
Private Function CalculateXPosition(ByVal Frm As System.Windows.Forms.Form, ByVal Ctrl As System.Windows.Forms.Control) As Integer
If (Ctrl.Parent Is Frm) Then
CalculateXPosition = Ctrl.Location.X
Else
CalculateXPosition = Ctrl.Location.X + CalculateXPosition(Frm, Ctrl.Parent)
End If
End Function
Il parametro Frm può essere la form principale della nostra applicazione oppure Nothing se si vuole calcolare la posizione assoluta rispetto allo schermo.
In modo analogo, utilizzando la proprietà Location.y, si può creare la function per il calcolo della coordinata y.