Chissà quante volte avrete maledetto il Pascal perché può ricevere input solo dalla tastiera...
Beh, a colmare questa grande lacuna del Pascal ha pensato un certo Tim Gordon, il quale ha scritto una semplice libreria che, attraverso l’uso di codice assembly, ci permette di interagire col mouse!


Nota:
L’ambiante di sviluppo di riferimento è Borland Turbo Pascal 7. In altri ambienti cambia solo la compilazione della libreria.

Scaricare e compilare la libreria:
Prima di tutto dovete andare all’indirizzo http://www.programmersheaven.com/d/click.aspx?ID=F34596, dove scaricherete il file "34596.zip" che contiene il file che a noi interessa: "Mouse.PAS".
Compilata la libreria (basta cliccare "compile/make"), basterà spostate il file "Mouse.TPU" nella cartella dove avete anche il sorgente del programma che la usa.

Procedure e funzioni principali
Procedure ResetMouse: Resetta il mouse. È bene metterla sia all’inizio che alla fine del programma, per evitare errori dovuti all’uso inappropriato della procedure SetMouseWindow;
Function getmousex: Restituisce la posizione del mouse rispetto all’asse X;
Function getmousey: Restituisce la posizione del mouse rispetto all’asse Y;
Function leftpressed: Restituisce true se è premuto il tasto sinistro del mouse;
Function rightpressed: Restituisce true se è premuto il tasto destro del mouse;
Function MouseInstalled: Restituisce true se è collegato un mouse;
Procedure SetMouseWindow (X1,Y1,X2,Y2:integer): Imposta i limiti del mouse, ovvero il rettangolo che va da X1,Y1 a X2,Y2.

Suggerimento:
Sebbene sia utilizzabile anche in applicazioni che fanno uso solo del modulo crt, la libreria è più portata per applicazioni che usano il modulo graph.

Un’applicazione di esempio che usa la libreria "Mouse.TPU":

program programma_prova_mouse_in_graph;
uses mouse,crt,graph;
var gd,gr:integer;{variabili per l'inizializzazione della grafica}
    x,y:integer;{variabili per memorizzare la posizione del mouse}

begin
{ciclo di controllo per verificare che sia collegato il mouse}
if not mouseinstalled then
begin
     writeln('Errore: Mouse non collegato!');
     readln;
     halt;
end;
{proviamo ad avviare la grafica}
gd:=detect;
initgraph(gd,gr,'');
{controlliamo eventuali errori}
if graphresult<>grok then
begin
     writeln('Errore: Impossibile avviare la grafica');
     readln;
     halt;
end;
{resettiamo il mouse}
resetmouse;
{impostiamo i limiti del mouse}
setmousewindow(5,5,GetMaxX-5,GetMaxY-5);
{ciclo per l'aggiornamento della posizione del puntatore}
repeat
      {disegnamo un bottone}
      setcolor(red);
      rectangle(200,120,300,140);
      outtextxy(205,125,'Clicca qui!');
      {otteniamo la posizione x e y del mouse}
      x:=getmousex;
      y:=getmousey;
      {disegnamo il puntatore: un cerchio giallo}
      setcolor(yellow);
      circle(x,y,5);
      {aspettiamo 10 ms}
      delay(10);
      {cancelliamo il cerchio di prima}
      setcolor(getbkcolor);
      circle(x,y,5);
      {usciamo dal ciclo se viene premuto uno dei tasti del mouse}
until rightpressed or leftpressed;

setcolor(white);
{se il mouse era sopra il 'bottone' quando l'utente ha cliccato,
scriviamo una frase sullo schermo.}
if ((x>=200) and (x<=300) and (y>=120) and (y<=140)) then
outtextxy(200,200,'Hello World!');
readkey;
{IMPORTANTE: resettate sempre il mouse alla fine!}
resetmouse;
{chiudiamo la grafica}
closegraph;
end.


Conclusione:
Spero questa lezione vi sia utile per creare programmi sempre più professionali e semplici da usare e, perché no, anche giochetti vari (penso ad esempio ad un bel Campo Minato o alla Battaglia Navale...).
Come al solito, per dubbi, problemi o errori nell'articolo, non esitate a contattarmi o a scrivere sul forum...


=John=
Mail/MSN: brsk_992@hotmail.com