Tips&Tricks I trucchi del mestiere

 

Come convertire una stringa in maiuscoletto

Una semplice funzione che si affianca alle standard LCase e UCase; con essa è possibile convertire una determinata stringa in maiuscoletto.
Tip fornito dal sig. M.Luciani

<%
'----
'Funzione Maiuscoletto
'
'la stringa strSource passata alla
'funzione CCase verrα convertita
'in maiuscoletto
'
'Massimiliano Luciani
'webmaster@byluciani.com
'http://www.byluciani.com
'----
Function CCase(strSource)
  Dim arrWords
  Dim i
  If IsNull(strSource) Or Len(Trim(strSource)) < 1 Then
    CCase = strSource
  Else
    strSource = LCase(strSource)
    arrWords = Split(strSource)
    For i = 0 To UBound(arrWords)
      arrWords(i) = UCase(Left(arrWords(i), 1)) & Mid(arrWords(i), 2)
    Next
    CCase = Join(arrWords)
  End If
End Function
'str = "Un TIP per convertire una stringa in " & _
'      "maiuscoletto - Massimiliano Luciani - byluciani.com"
str="                d             "
Response.Write "Origine: " & str
Response.Write "

" Response.Write "Maiscoletto: " & CCase(str) %>

Come monitorare un file o una cartella di sistema

Il tip, in linguaggio VB.NET, consente di monitorare costantemente una cartella o un file del sistema avvertendo l'utente ogni qualvolta accade una variazione, per esempio il file viene rinominato o modificato. Il codice lavora in background e si attiva alla pressione del button1; nell'esempio viene monitorizzato il file test.txt presente nella directory c:\. Il tip è personalizzabile per controllare qualunque file del sistema. Tip fornito dal sig. O.Miceli

Imports System
Imports System.Diagnostics
Imports System.IO
Imports System.Threading
Public Class Form1
    Inherits System.Windows.Forms.Form
    Private Allarme As System.IO.FileSystemWatcher
    Private InfoFile As FileInfo
#Region " Codice generato da Progettazione Windows Form "
àààààààà
#End Region
    Private Sub Button1_Click(ByVal sender As System.Object, 
ByVal e As System.EventArgs) 
      Handles Button1.Click
        AddHandler Allarme.Changed, AddressOf Cambiamento
        AddHandler Allarme.Renamed, AddressOf Rinomina
        Allarme.EnableRaisingEvents = True
    End Sub
    Private Sub Cambiamento(ByVal Sorgente As Object, ByVal 
e As FileSystemEventArgs)
       MsgBox("Attenzione il file Φ cambiato in qualche sua componente")
    End Sub
    Private Sub Rinomina(ByVal Sorgente As Object, ByVal 
e As System.IO.RenamedEventArgs)
        MsgBox("Attenzione il file Φ stato Rinominato")
    End Sub
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal 
e As System.EventArgs) Handles MyBase.Load
        Allarme = New FileSystemWatcher()
        InfoFile = New FileInfo("c:\test.txt")
        With Allarme
            .Path = InfoFile.DirectoryName.ToString
            .Filter = ""
            .NotifyFilter = NotifyFilters.FileName Or _
              NotifyFilters.Size Or NotifyFilters.LastWrite 
Or NotifyFilters.CreationTime
        End With
    End Sub

End Class



Come leggere lo stato del CAPS LOCK

Nel codice che segue la funzione IsCapsLockOn ritorna True o False il tasto attivato o disattivato.

function IsCapsLockOn : boolean; 
begin 
Result := 0 <> (GetKeyState(VK_CAPITAL) and $01); 
end;


Come spostare il focus all'oggetto successivo o precedente

Per spostare il focus all'oggetto successsivo usare:

SelectNext(ActiveControl as TWinControl,True,True );

per il precedente usare:

SelectNext(ActiveControl as TWinControl,False,True );

Come ricavare il nome della window posizionata in una specifica posizione dello schermo

La funzione NomeWindow ritorna in output il nome della window posizionata nelle coordinate x,y:

function NomeWindow( X, Y : integer ) : string;
var
  P : TPoint;
  W : TWinControl;
begin
  P.X := X;
  P.Y := Y;
  W := FindVCLWindow( P );
  if( nil <> W )then
  begin
    Result := W.Name;
  end else

  begin
    Result := '';
  end;
end;

Come mappare l'hard-disk

In talune applicazioni pu≥ capitare di dover creare una unitα disco logica che faccia riferimento al percorso di rete di un disco su un server remoto. Il tip proposto si occupa proprio di "mappare" un disco in modo del tutto automatico

DWORD WNetAddConnection2( 
    LPNETRESOURCE lpNetResource,  
    LPCTSTR lpPassword,
    LPCTSTR lpUsername,
    DWORD dwFlags 
   ); 

Function MappaDischi(LocalUnit, UserN, PassW: String): boolean; 
var 
  NRW: NetResource;
  Res: DWORD; begin 
  Result := False; 

  NRW.dwType := RESOURCETYPE_DISK; 
  NRW.lpLocalName := PChar(LocalUnit + ':');
  NRW.lpRemoteName := PChar('\\indirizzoIP\D$'); 
  NRW.lpProvider := ''; 

  Res = WNetAddConnection2(NRW, PChar(PassW), PChar(UserN), 
CONNECT_UPDATE_PROFILE) 

  Result := (Res <> NO_ERROR) 
  If Not Result Then ShowMessage('Non Φ possibile eseguire la mappatura); 
end;  

Come leggere la data dell'ultimo accesso ad un file

Poche righe di codice per conoscere la "storia" di un file e in particolare quando si Φ verificato l'ultimo utilizzo dello stesso:

function Ultimoaccesso(sFileName : string ) : TDateTime;
var
  ffd : TWin32FindData;
  dft : DWord;
  lft : TFileTime;
  h   : THandle;
begin
    h := Windows.FindFirstFile(PChar(sFileName), ffd);
  if (INVALID_HANDLE_VALUE <> h) then
  begin
      Windows.FindClose( h );
      FileTimeToLocalFileTime(ffd.ftLastAccessTime, lft );
      FileTimeToDosDateTime(lft,LongRec(dft).Hi, LongRec(dft).Lo);
      Result := FileDateToDateTime(dft);
  end;
end; 

Come chiedere conferma per la chiusura di una applicazione

Con la procedura presentata di seguito si offre la possibilitα all'utente di confermare una scelta delicata come la chiusura dell'applicazione:

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: 
Boolean);
begin
  if(mrNo = MessageDlg('Sei sicuro di voler terminare il programma?'', 
mtInformation,[mbYes, mbNo],0)) then
  begin
    CanClose := False;
  end;
end;

Aprire e chiudere il carrello del lettore del CD

Per utilizzare queste due funzioni Φ necessario includere nel progetto la unit MMSYSTEM.

Procedure ApriCD; 
Begin 
mciSendString('Set cdaudio door open', nil, 0, 0); 
End; 

Procedure ChiudiCD; 
Begin 
mciSendString('Set cdaudio door closed', nil, 0, 0); 
End; 

Inviare una e-mail con il programma di posta elettronica predefinito

Per poter utilizzare il codice presentato, Φ necessario aggiungere al progetto la unit ShellApi

ShellExecute(Handle, 'open', 'mailto:
GiuseppeSgro@email.it?subject=mail', '', '', SW_SHOWDEFAULT); 

Lanciare il browser predefinito ed aprire una pagina web

Anche in questo caso Φ necessario aggiungere al progetto la unit ShellApi:

ShellExecute(Handle, 'open', 'http://www.delphitips.com', '', '', 
SW_SHOWDEFAULT); 

Come convertire un carattere nel suo corrispondente codice ascii

Nel seguente esempio viene convertito un carattere nel suo codice ascii e viceversa.

Label1.Caption:='Il codice ASCII del carattere "A" Φ ' + 
IntToStr(ord('A')); 
Label2.Caption:='Il carattere corripondente al codice ASCII 65 Φ' + 
chr(65); 

Lanciare un'applicazione ed attenderne la fine dell'esecuzione

Una porzione di codice utilissima, che consente una semplice interazione fra applicazioni diverse:

procedure Esempio;
var ProgramHandle : THandle;
begin 
ProgramHandle := WinExec('C:\Programma.exe', SW_SHOWNORMAL);
while GetModuleusage(ProgramHandle) <> 0 do 
application.processmessages;
 {Tutto ci≥ che verrα iserito qui sarα eseguito finchΦ non termina 
l'applicaizone esegiuta da winexec} 
end; 



Usare cut & paste in Java

Le applicazioni Java possono utilizzare la clipboard creando un'istanza dell'oggetto Clipboard e richiedendone o settandone il contenuto:

Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard();
String str = textarea.getText();
StringSelection contents = new StringSelection(str);
cb.setContents(contents, null);

Dall'altra parte si può invece recuperare il contenuto della clipboard con:

Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard();
Transferable content = cb.getContents(this);
try {
   String str = (String)content.getTransferData(DataFlavor.stringFlavor);
   textarea.setText(str);
} catch (Throwable e) 
{ System.err.println(e); }

Nella documentazione API di Java potete trovare tutte le informazioni necessarie a recuperare anche altri tipi di dati dalla clipboard per aggiungere ai vostri programmi tutta la comodità e la potenza della funzionalità di cut & paste.

Concatenazione di stringhe e performance

Se avete del codice in cui la concatenazione di stringhe Φ un'operazione molto frequente, tenete a mente che l'utilizzo dell'operazione + sulle stringhe:

String string1 = "Ciao ";
String string2 = "Federico";
string1 = string1 + string2;

è molto meno performante del metodo append dello string buffer

StringBuffer buffer1 = "Ciao ";
String string2 = "Federico";
buffer1.append(string2);

Questo Φ dovuto al fatto che le stringhe in Java sono immutabili e quindi l'operatore + (unico operatore overloaded in Java) per unire due stringe deve compiere le seguenti operazioni:
Se sostituite, quindi, lo StringBuffer alla String nei punti dove la concatenazione avviene spesso, potreste rendere molto pi∙ efficienti i vostri algoritmià


Pass-by-Value e Pass-By-Reference

Considerate il seguente codice di esempio di una classe qualunque:

void passByValue(int i) { f = 15; }
void passByReference(StringBuffer sb) { sb.append(" vedo?"); }
void provaMetodi() 
{
 	int i = 1;
	StringBuffer sb = new StringBuffer("Cosa");
	passByValue(i);
	passByReference(sb);
	System.out.println("Value of i: " + i);
	System.out.println("Value of sb: " + sb);
}

Il risultato stampato sarα

Value of i: 1
Value of sb: Cosa vedo?

In altre parole il valore intero originale non ha subito le modifiche del metodo passByValue, mentre l'oggetto StringBuffer si porta dietro, dal metodo passByReference, gli effetti della manipolazione subita. Il fatto Φ che tutti i tipi primitivi in java sono passati per valore, cioΦ ne viene fatta una copia prima del passaggio ad un metodo chiamato. Gli oggetti e gli array invece sono passati per riferimento, ovverosia ai metodi invocati viene offerto un "puntatore" - per dirla alla C++ - alla locazione di memoria dove si trova l'oggetto originale, e quindi se l'oggetto viene manipolato nel metodo viene modificata l'unica copia dell'oggetto disponibile. Tenete sempre a mente gli effetti collaterali del passaggio di riferimento quando scrivete dei metodi che ricevono degli oggetti o degli array come parametri, in modo da non modificarli inavvertitamente e trovare delle sorprese inaspettate al ritorno dalla chiamata del metodo.

La corto-circuitazione degli operatori booleani

Considerate il seguente codice:

if ( object != null && object.equalsTo(otherObject) ) 
{
      // fai qualcosa con object 
}

Se gli operatori booleani non fossero ottimizzati, il problema sarebbe che quando object non Φ inizializzato, la seconda parte della condizione genera una fastidiosa NullPointerException e il programma si ferma. Invece sia && che || sono corto-circuitati, nel senso che se il primo dei due operandi di questi operatori restituisce un valore per cui il valore del secondo operando non va ad influire sul risultato dell'espressione, il secondo operando non viene valutato, risparmiando cos∞ tempo di esecuzione e sulla nidificazione degli if. In breve, quando object != null Φ false, il valore di object.equalsTo(otherObject) non pu≥ cambiare il fatto che l'intero if sarα falso, e quindi non viene valutato, evitando cos∞ la dolorosa eccezione che dicevamo. La stessa cosa vale per ||, ma in questo caso l'ottimizzazione scatta per valori true. Questo Φ una conseguenza delle tabelle di veritα di AND e di OR, che fanno riferimento alla base dell'aritmetica booleana.

Thread ed eccezioni

Quando in un thread vengono sollevate delle eccezioni che non sono gestite, la macchina virtuale termina il thread in questione ed invoca il metodo uncaughtException del ThreadGroup cui il thread appartiene. ╚ possibile derivare una propria implementazione di ThreadGroup e riscrivere il metodo uncaughtException per avere pieno controllo sulla chiusura problematica dei thread che la vostra applicazione utilizza e per poter gestire, in un solo punto, tutte le eccezioni che non volete catturare singolarmente in ogni metodo dei vostri thread. La signature del metodo da riscrivere Φ:

public void uncaughtException(Thread t, Throwable e) 

mentre per la creazione di un thread associato ad un gruppo che avete derivato voi, usate uno dei seguenti costruttori

Thread(ThreadGroup tg, Runnable target, String name)
Thread(ThreadGroup tg, Runnable target)
Thread(ThreadGroup tg, String name)

Internazionalizzare le applicazioni

Quando nelle applicazioni si devono visualizzare o stampare numeri e date o confrontare stringhe, spesso si deve far caso alle differenze che queste operazioni comportano rispetto a culture diverse. In Java Φ possibile utilizzare delle classi apposite che permettono di gestire in maniera semplice questa varietα. Nel package java.text esistono delle classi per lo pi∙ astratte per la formattazione di numeri e date, che utilizzano dei metodi getInstance per restituire degli oggetti di formattazione dei valori:

NumberFormat nf2 = NumberFormat.getInstance(Locale.ITALIAN);
System.out.println(nf2.format(1234.56));

visualizzerα il seguente output

1.234,56

secondo la nostra convenzione di utilizzare la virgola come punto decimale ed il punto come separatore delle migliaia. Siccome le funzionalitα offerte sono molte e riguardano la rappresentazione di svariati formati numerici (percentuali, valuta, decimali, interi, etc.), di date, ed il confronto nazionalizzato di stringhe. Si consiglia di consultare l'API di Java per approfondire l'argomento se pensate che vi possa tornare utile.

Classi interne e classi anonime

Nel seguente codice troviamo un esempio sintattico dell'utilizzo di classi interne e di classi anonime. Le prime sono classi che vengono utilizzate solo all'interno di altre classi, in quanto sono definite proprio internamente al blocco stesso di definizione della classe che le include. La loro utilitα Φ quella di non essere visibili se non nell'oggetto che le definisce e quindi sono comode in quelle situazioni in cui servono degli oggetti solo per l'implementazione di una classe. Le definizioni anonime invece vengono impiegate nella ridefinizione al volo di qualche tipo di dati, ridefinizione che per≥ non ha altri impieghi se non nel contesto in cui Φ dichiarata.

class UnaClasseNormale 
{
  void unMetodo() {}
  void unAltroMetodo() {}
}  
class UnAltraClasseNormale 
{
  // Queste due classi saranno visibili solo in UnAltraClasseNormale
  static class UnaClasseInterna {} // classe interna statica
  class AltraClasseInterna {} // classe interna
  void unMioMetodo() 
 {
     class ClasseInternaLocale {} // classe interna locale al metodo  
  }
  void mioAltroMetodo() 
 {
    // classe anonima: ridefinisce un metodo della classe originale
    UnaClasseNormale bref = new UnaClasseNormale () 
   { 
       void unMetodo() {} // Qui ridefinisco il metodo originale 
    }; 
  } 
}

Come dichiarare array anonimi

Quando in un metodo Φ richiesto un array come parametro o comunque in qualunque circostanza vi sia necessitα di un array, ricordate che esiste una sintassi abbreviata che vi consente di creare array all'istante (un po' come per le classi anonime) e senza associarli ad una variabile. Questo pu≥ evitarvi la creazione di variabili inutili e semplifica il vostro codice. Ecco un esempio:

myMethod(new int[] {10, 23, 45, 9, 12, 59});
// dichiarazione di myMethod: void myMethod(int[] values)

Ovviamente questo ha senso solo se l'array del caso poi non vi serve pi∙, perchΘ non avete nessun riferimento all'oggetto anonimo creato come mostrato qui sopra.

Gestire le versioni dei package

Pu≥ essere utile creare dei package java in diverse versioni, in modo da poter scrivere del codice che faccia riferimento alle caratteristiche di una o dell'altra release delle classi che fanno parte del package stesso. Esiste una specifica java (Java Product Versioning Specification) che consente di aggiungere informazioni relative al livello di sviluppo di un package attraverso il manifest file del JAR in cui le varie classi vengono raccolte. Ecco un esempio di manifest.mf con informazioni di versioning:

Manifest-Version: 1.0
Name: it/fedmest/myclasses
Specification-Title: Java Package con Versioni 
Specification-Vendor: Federico Mestrone
Specification-Version: 1.0
Implementation-Title: it.fedmest.myclasses
Implementation-Vendor: FedericoMestrone.Com
Implementation-Version: Build 1.0.3-b32

Queste informazioni possono poi essere utilizzate nel vostro codice con i metodi della classe java.lang.Package:

Package pkg = Package.getPackage("it.fedmest.myclasses");
System.out.println("Package name:\t" + pkg.getName());
System.out.println("Spec title:\t" + pkg.getSpecificationTitle());
System.out.println("Spec vendor:\t" + pkg.getSpecificationVendor());
System.out.println("Spec version:\t" + pkg.getSpecificationVersion());
System.out.println("Impl title:\t" + pkg.getImplementationTitle());
System.out.println("Impl vendor:\t" + pkg.getImplementationVendor());
System.out.println("Impl version:\t" + pkg.getImplementationVersion());

Realizzare un file Zip in Java

Java viene fornito completo di tutte le classi necessarie a creare dei file ZIP compressi. Con il codice seguente viene creato un file zippato che include un file .doc compresso. ╚ interessante notare che Φ anche possibile zippare dei dati in memoria, senza necessariamente passare per un file, utilizzando uno stream di input diverso da FileInputStream.

BufferedInputStream origin = null;
FileOutputStream dest = new FileOutputStream("D:\\filezippato.zip");
ZipOutputStream out = new ZipOutputStream(new 
BufferedOutputStream(dest));
out.setMethod(ZipOutputStream.DEFLATED); // Attiva la compressione
byte data[] = new byte[2048];
FileInputStream fi = new FileInputStream("D:\\filenormale.doc");
origin = new BufferedInputStream(fi, BUFFER);
ZipEntry entry = new ZipEntry("D:\\filenormale.doc");
out.putNextEntry(entry);
int count;
while((count = origin.read(data, 0, 2048)) != -1) 
{ out.write(data, 0, count); 
}
origin.close();
out.close();

ZipAnywhere: WinZip secondo Java

Esiste un'applicazione grafica Java - gratuita per uso non commerciale - con la quale potete compiere tutte le operazioni classiche di WinZip, oltre a crearvi dei JAR auto-estraibili, molto comodi per distribuire le vostre applicazioni. Il programma si chiama ZipAnywhere ed Φ necessario solo un ambiente run-time Java per poterlo utilizzare. Lo potete scaricare (si tratta di soli 87Kb) all'indirizzo http://www.geocities.com/zipanywhere - si tratta di un file jar eseguibile quindi basta un doppio click per avviare la finestra principale.

Memoria a disposizione

Se volete conoscere il valore della memoria a disposizione della vostra applicazione, basta utilizzare il codice che segue:

Runtime rt = Runtime.getRuntime();
System.out.println("Memoria totale massima a disposizione della VM: " + 
  rt.totalMemory());
System.out.println("Memoria ancora non utilizzata di quella a 
disposizione: " +   rt.freeMemory());

Il metodo freeMemory() dell'oggetto Runtime restituisce il valore in bite della memoria di sistema ancora disponibile per la macchina virtuale, mentre con totalMemory potete conoscere il numero di byte che il sistema operativo ha allocato per la JVM.



Come ricavare la versione del programma sviluppato

Il codice che segue permette di ricavare la versione del programma, le stesse informazioni visualizzate dal menu proprietà di un file Windows.

Me.Caption = Me.Caption &App.Major & "." & App.Minor & "." 
& App.Revision

Convertire in modo semplice un file grafico da WMF a BMP

Un piccolo pezzo di codice che rende possibile il passaggio fra due tra i più diffusi formati grafici.

Private Sub Command1_Click() 
' Legge il file WMF Prova dal disco e:
Picture1.Picture = LoadPicture("e:\prova.wmf") 
' Salva nella stessa directory il corrispondente file in formato BMP
SavePicture Picture1.Image, ""
End Sub

Spostare un file su disco

Per spostare un file su disco basta semplicemente utilizzare il seguente codice:

Name "C:\MIOFILE.TXT" As "C:\COPIA\MIOFILE.TXT"

Invece di rinominare il file il risultato sarà lo spostamento in un'altra directory.


Controllare se un form Φ presente in memoria

╚ possibile utilizzare il seguente codice per verificare se un form con un nome predefinito e' presente in memoria. La funzione cerca tra tutti i form uno che abbia il nome da noi scelto.

Private Function CercaForm(ByVal form_name As String) As Form
    Dim i As Integer
' Per default la form non e' trovata.
        Set CercaForm = Nothing
        ' Ciclo per la ricerca.
        For i = 0 To Forms.Count - 1
            If Forms(i).Name = form_name Then
                ' We found it. Return this form.
                Set CercaForm = Forms(i)
                Exit For
            End If 
       Next i
 End Function

Accettare solo caratteri numerici all'interno di una textbox

Il codice inserito nell' evento di una textbox, nell'esempio chiamata Text1, scarta tutti i tasti premuti che non corrispondono ad un carattere numerico.

Private Sub Text1_Change()
If Not IsNumeric(Text1.Text) Then
 Text1.Text = ""
End If 


Come rilevare una connessione internet attiva

La funzione seguente, utilizzando la libreria wininet, testa lo stato della connesione ad internet cosi' da rilevare se si e' connessi alla rete, se e' presente una connessione viene ritornato un valore 1 altrimenti viene ritornato un valore 0.

Private Declare Function InternetGetConnectedState Lib "wininet" 
(ByRef dwflags As Long,ByVal dwReserved As Long) As Long

Con queste costanti possiamo anche distinguere il tipo di connessione attiva.

Private Const CONNECT_LAN As Long = &H2

Private Const CONNECT_MODEM As Long = &H1

Private Const CONNECT_PROXY As Long = &H4

Private Const CONNECT_OFFLINE As Long = &H20

Il codice che segue illustra un possibile uso della funzione in oggetto.

Public Function IsWebConnected(Optional ByRef ConnType As String) 
As Boolean
Dim dwflags As Long
Dim WebTest As Boolean
ConnType = ""
WebTest = InternetGetConnectedState(dwflags, 0&)
Select Case WebTest
    Case dwflags And CONNECT_LAN: ConnType = "LAN"
    Case dwflags And CONNECT_MODEM: ConnType = "Modem"
    Case dwflags And CONNECT_PROXY: ConnType = "Proxy"
    Case dwflags And CONNECT_OFFLINE: ConnType = "Offline"
End Select
IsWebConnected = WebTest
End Function
Private Sub Command1_Click()
Dim msg As String
If IsWebConnected(msg) Then
    msg = "Sei connesso ad internet tramite : " & msg
Else
    msg = "Non sei connesso ad internet."
End If
MsgBox msg, vbOKOnly, "Stato della connessione ad internet"
End Sub

Come rilevare il tipo di unitα fornita come parametro

Per rilevare il tipo di unità facciamo ricorso alle API ed in particolare alla funzione GetDriveType contenuta in Kernel32:

Declare Function GetDriveType Lib "kernel32" Alias "GetDriveTypeA" 
(ByVal nDrive As String) As Long

La funzione accetta in input l' identificativo logico dell'unitα da esaminare e ritorna in output un valore del tipo:

Rilevare lo spazio disponibile su un disco e altre informazioni

La funzione GetDiskFreeSpace permette di sapere quanto spazio libero è ancora presente in un disco, la dichiarazione è la seguente:

Private Declare Function GetDiskFreeSpace Lib "kernel32" Alias 
"GetDiskFreeSpaceA" (ByVal lpRootPathName As String, 
lpSectorsPerCluster As Long, lpBytesPerSector As Long, 
lpNumberOfFreeClusters As Long, lpTtoalNumberOfClusters 
As Long) As Long

Passando come primo parametro l'identificativo logico dell'unita da esaminare, la funzione assegna ai restanti parametri i valori rilevati, a questo punto per determinare lo spazio libero su disco basta moltiplicare: (Settori per cluster) * (bytes per settori) * (numero di cluster liberi)

Conoscere la dimensione in byte di un file

La funzione FileLen ritorna in output il numero di byte che compongono il file specificato nel parametro in input.

Dimensione=FileLen("c:\miofile.txt ")


Come rilevare il nome del computer in uso

La funzione Nomepc, facendo uso di GetComputerName, ritorna come valore il nome del pc.

Private Declare Function GetComputerName Lib "kernel32" Alias 
"GetComputerNameA" (ByVal lpBuffer As String, nSize As Long)  As Long
Function Nomepc() As String
    Dim ls_Mach       As String
    Dim ll_MachLen    As Long
    ll_MachLen = 16
    ls_Mach = String$(ll_MachLen, 0)
    If GetComputerName(ls_Mach, ll_MachLen) Then Nomepc = 
Left$(ls_Mach, ll_MachLen)
End Function


Nascondere il puntatore del mouse

Usando la seguente funzione è possibile evitare che venga visualizzata la freccetta utilizzata come puntatore del mouse:

Declare Function ShowCursor& Lib "user32" (ByVal bShow As Long)

L'uso è molto semplice:

ShowCursor 0    ' nasconde il puntatore
ShowCursor 1    ' riattiva la visualizzazione del puntatore


Come generare codici alfanumerici univoci

Questo tip si consente di generare degli ID alfanumerici di 32 caratteri/numeri sfruttando la API di Windows CoCreateGuid ed eliminando dal GUID le parentesi graffe e i trattini. Questo sistema può essere utile in una tabella di un DB se non si vuole utilizzare un campo sequence, per file e cartelle temporanee e per tutti i casi in cui si abbia bisogno di un codice univoco. Tip fornito dal sig. A.Castaldo

Option Explicit
Private Declare Function CoCreateGuid Lib "ole32.dll" (pguid As Guid) 
AsLong
Private Declare Function StringFromGUID2 Lib "ole32.dll" (rguid As Any,
ByVal lpstrClsId As Long, ByVal cbMax As Long) As Long
Private Type Guid
    Data1 As Long
    Data2 As Long
    Data3 As Long
    Data4(8) As Byte
End Type
Public Function CreateGUID() As String
    Dim udtGUID As Guid
    Dim strGUID As String
    Dim bytGUID() As Byte
    Dim lngLen As Long
    Dim lngRetVal As Long
    Dim lngPos As Long
    lngLen = 40
    bytGUID = String(lngLen, 0)
    CoCreateGuid udtGUID
    lngRetVal = StringFromGUID2(udtGUID, VarPtr(bytGUID(0)), lngLen)
    strGUID = bytGUID
    If (Asc(Mid$(strGUID, lngRetVal, 1)) = 0) Then
        lngRetVal = lngRetVal - 1
    End If
    strGUID = Left$(strGUID, lngRetVal)
    CreateGUID = strGUID
End Function
Public Function CreateID() As String
    CreateID = RemoveChars(CreateGUID, "{-}")
End Function
Private Function RemoveChars(Source As String, Chars As String) As String
    Dim enumChars As Long
    RemoveChars = Source
    For enumChars = 1 To Len(Chars)
        RemoveChars = Replace(RemoveChars, Mid(Chars, enumChars, 1), "")
    Next
End Function
Sub main()
    MsgBox CreateID()
End Sub