Blog Stats
  • Posts - 11
  • Articles - 0
  • Comments - 588
  • Trackbacks - 38

 

Tuesday, November 18, 2003

VB.NET: Ricavare tutte le caption delle finestre aperte

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.

VB.NET: Ricavare l'occupazione di memoria di un processo

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

VB.NET: Recuperare la collection dei controlli presente in una form

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 

VB.NET: Recuperare l'occupazione di una directory

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.

VB.NET: Recuperare il path dell'applicazione

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

VB.NET: Memorizzare un file all'interno di un assembly

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.

VB.NET: Forzare le dimensioni massime e minime per una form

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

VB.NET: Evitare il redraw di un list box quando si inseriscono molti record

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()
 .
 .

VB.NET: Caption Animata in VB.NET

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

VB.NET: Calcolare la posizione assoluta di un controllo in una form

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.

 

 

Copyright © Massimo Bonanni