- Ottenere il numero di linee di una casella di testo -
 
COSA SERVE PER QUESTO TUTORIAL
Download | Chiedi sul FORUM | Glossario Microsoft Visual Basic 6 - Conoscenze basiche di VB
Introduzione alle chiamate API in VB6: SendMessage e EM_GETLINECOUNT

OTTENERE IL NUMERO DI LINEE DI UNA CASELLA DI TESTO TRAMITE LE API
La funzione SendMessage di user32.dll e il messaggio EM_GETLINECOUNT

In questo documento verrà illustrato come in Visual Basic attraverso le API (=Application Programming Interface) di Windows, cioè l'insieme delle costanti (dichiarazioni di valori costanti), i tipi (o strutture in C), le dichiarazioni di funzioni presenti nei principali DLL di Windows (come user32.dll, advapi32.dll, gdi32.dll ecc.), si possa ottenere o impostare un'informazione (ad esempio il testo di una casella di testo, il suo colore e il suo carattere) di un controllo (un pulsante, una barra degli strumenti, una casella di testo...) o di un form (una finestra).
Si supponga di avere una casella di testo della quale si deve sapere il numero di righe.
Per prima cosa è necessario creare con VB un EXE standard e inserire una TextBox con le seguenti proprietà:
  • Name = Prova
  • MultiLine = True
  • Text = Cinque righe qualsiasi

Questa è la casella di testo della quale si cercherà di scoprire il numero di righe (anche se già è noto che sono cinque).
A questo punto è possibile bisogna aggiungere al progetto un modulo e inserire il codice che segue:


Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
    (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long 

Ecco in dettaglio il significato di questa riga:

  • Public, indica che al dichiarazione è relativa all'intero progetto e non solo a questo modulo;
  • Declare, indica che quanto segue è una dichiarazione di una funzione di una DLL esterna;
  • Function, indica che ciò che si sta dichiarando è una funzione e che quindi deve restituire un valore;
  • SendMessage, indica il nome attraverso il quale la funzione potrà essere invocata nel programma e, non in questo caso, può voler dire anche il nome nella DLL dalla quale si sta acquisendo la funzione altrimenti definito dopo Alias;
  • Lib "User32", indica il nome della DLL nella quale si trova la funzione dichiarata;
  • Alias "SendMessageA", indica che nella DLL la funzione ha un nome diverso da quello indicato dopo Function e specifica quale è questo nome;
  • (ByVal hwnd As Long, ...), indica i parametri della funzione che si sta dichiarando, analizzeremo più avanti il significato di ognuno di questi;
  • As Long, indica il tipo di valore restituito dalla funzione, Long è un numero compreso nell'intervallo fra -2147483648 e 2147483647;

La funzione appena dichiarata servirà per inviare a un controllo o a un form la richiesta di restituire o impostare l'informazione che ci interessa (in questo caso il numero di righe). La funzione in questione prende come secondo parametro un valore numerico indicante il messaggio da inviare. La costante numerica che identifica il messaggio per ottenere il numero di linee è EM_GETLINECOUNT (valore esadecimale 0xBA ovvero 186).

Public Const EM_GETLINECOUNT = &HBA

Le possibili operazioni sono migliaia e ognuna ha un suo valore. Il nome, che è comunque possibile cambiare a piacimento, e i valori di queste costanti si possono trovare nel file winuser.h o su MSDN ma lo strumento più semplice da usare è certamente l'API Viewer che si trova nella cartella degli strumenti di Visual Studio. Una volta avviato, dal menu File selezionare Carica file di testo e poi win32api.txt. Per convertire un numero dal formato esadecimale a decimale la calcolatrice di Windows in modalità scientifica è più che sufficiente: selezionare Hex incollare il numero da trasformare e poi tornate su Dec
Al form precedentemente creato va ora aggiunta un'altra casella di testo (proprietà Name impostata su NumRighe)in cui saranno visualizzate il numero di righe della TextBox Prova. Va infine aggiunto un CommandButton (un normalissimo pulsante, Name impostato su Agisci) che una volta premuto ricaverà il numero di righe. Nel codice del form inseriamo la Sub seguente che verrà richiamata appunto alla pressione del pulsante Agisci:


Private Sub Agisci_Click()
    NumRighe.Text = SendMessage(Prova.hwnd, EM_GETLINECOUNT, 0, 0)
End Sub

In queste righe impostiamo il testo della caselle NumRighe sul valore restituito dalla chiamata a SendMessage (funzione in user32.dll precedentemente dichiarata nel modulo). A SendMessage viene passato come primo parametro l'handle (ovvero un numero Long che fa identificatore univoco) della casella di testo su cui vogliamo agire (ma potrebbe trattarsi di un qualsiasi altro controllo, finestra o anche del desktop stesso); in Visual Basic per ottenere l'handle di un controllo si utilizza la proprietà hWnd; come secondo parametro abbiamo invece passato la costante EM_GETLINECOUNT dichiarata nel modulo precedentemente, così da comunicare alla funzione che ciò che ci interessa ottenere (e che verrà quindi restituito da SendMessage) è il numero di linee della casella di testo in questione; i due parametri rimanenti sono entrambi impostati a zero perché per EM_GETLINECOUNT non sono necessari ulteriori dettagli (al contrario di quello che vedremo tra poco per altri messaggi).
Facendo partire il programma nella TextBox NumRighe apparirà un numero in più rispetto al numero di righe digitato in fase di progettazione per il semplice fatto che la casella di testo di VB aggiunge automaticamente una riga vuota.
 

<< INDIETRO by VeNoM00