Newsgroup: it.comp.lang.delphi
Titolo: Movimento mouse e intercettazione

Buongiorno,
grazie in anticipo a chi mi aiuta. Come posso fare a intercettare quando
sono in determinate zone dello schermo con il mouse?
Ho una serie di zone su una mappa, e ho bisogno che quando passo con il
puntatore del mouse su una di quelle mi indichi il nome in una finestra, e
quando sono su un'altra mi appaia l'altro nome.
Come posso fare?
--------------------------------
Inviato via 
http://usenet.libero.it

sono in determinate zone dello schermo con il mouse?
OnMouseMove
e' l'evento che hanno tutti i componenti visuali di delphi e che scatenano nel
momenti in cui il puntatore del mouse ci passa sopra.
Almeno spero di aver capito il tuo concetto di "zona" (del form).
-- 
Morde. 
(morde at programmer dot net)

Come posso fare?
Ci sono diverse vie possibili a mio avviso.
1) Se le zone della mappa sono componenti Delphi che presentano
    l'evento OnMouseMove (come detto sopra) puoi scrivere del codice
    che mostri la finestrella (altro form o componente tipo panel)
    posizionata nella X,Y del componente il cui evento è stato scatenato (Sender), 
    in cui imposti la scritta (presente nella finestrella)
    al valore che desideri per quella zona (per esempio la caption della zona)
    In questo modo sono le zone stesse che gestiscono la finestrella e non la mappa.
2) Se le zone non sono componenti di delphi ma semplicemente limitazioni "spaziali" :)
    allora nell'evento  OnMouseMove del componente che visualizza la mappa
    puoi scrivere del codice che mostri la solita finestrella solo se la X,Y del mouse 
    sono interne allo sapzio delimitato da una certa zona.
    ES.   
    If ((x<=100)And(x>=0))And((y<=100)And(y>=0)) Then
    Begin
      Finestrella.Visible := False;
      Finestrella.Top := y;
      Finestrella.Left := x;
      Finestrella.Caption := 'Bari';
      Finestrella.Visible := true;
    End Else If ((x<=...)And(x>=...))And((y<=...)And(y>=...)) Then
    Begin
      Finestrella.Visible := False;
      Finestrella.Top := y;
      Finestrella.Left := x;
      Finestrella.Caption := 'Roma';
      Finestrella.Visible := true;
    End Else
    [...]
    End;
    //in questo caso finestrella e un componente tipo panel
    //creato a designTime e solo spostato e reso visibile a runTime
    //questo codice individua una zona 'Bari' di altezza e larghezza 100
    //in (0,0)
   In questo modo è un solo evento (della mappa) che gestisce tutte le zone.
3)[Proposta] Potresti creare (Immettere sulla mappa) a designTime una TImage
   per ogni zona, in cui setti la proprietà Hint al valore che vuoi che appaia
   sulla finestrella per quella zona, e la posizioni nella posizione della zona
   sulla mappa (tutto sempre a design time).
   In fine su tutte le Image delle zone setti la proprità ShowHint a true e trasparent a true
   ed il gioco è fatto ... hai ottenuto delle zone invisibili che quando ci passa il mouse
   sopra fanno vedere una finestrella (la finestrella di Hint) con il giusto valore.
   Tutti questo senza scrivere una riga di codice, ma presenta il problema di non essere 
   gestibile come "pare e piace" a te (se vuoi cambiare la forma o il colore o etc della finestra
   di hint credo che nell'Help di delphi ci sia qualcosa a riguardo).
spero di essere stato chiaro ...
ho provato solo l'ultimo dei tre metodi e funziona :)
se ti soddisfa credo che sia la maniera più veloce di farlo ;)
	Ciao
	MassimoB
 


Credo che questo sia il modo giusto di proseguire, ma ho ancora qualche
problema non essendo un esperto di delphi. Le zone nella mappa sono
disegnate con MapX e hanno tutte le proprieta' che hai citato. Ho bisogno
che quando sono sul poligono disegnato mi appaia la scritta, e non solo
quando sono su una determinata X e Y. Come si fa?
Grazie mille per la risposta precedente, sei stato molto gentile!
Ciao


 quando sono su una determinata X e Y. Come si fa?
Non ho capito che forma abbiano le zone...
Se hanno forma non rettangolare, ma variabile... molto variabile, essendo
una mappa, la soluzione a mio avviso più pulita e corretta è quella di
disegnare una maschera alla mappa. Non è un lavoro strettamente legato a
Delphi...
Ad esempio:
1. Paralellamente alla mappa, disegni su un'area identica per dimensioni ad
essa, in corrispondenza delle zone che vuoi controllare zone in unica tinta
(1 colore per zona).
2. All'evento di movimento del mouse, avendo le sue coordinate sulla mappa,
ricavi il colore di maschera ad essa corrispondente.
3. Se il colore è X fai apparire la scritta Y.
Per la maschera un bitmap a 256 colori (256 zone controllabili) potrebbe
bastarti.
Se le zone sono rettangolari la soluzione migliore è quella di istanziarti
un array di coordinate X Y - DX DY = Zona Z.
Ciao
Giuseppe

quando sono su una determinata X e Y. Come si fa?
ti metti e lavori molto di trigonometria oppure trovi dei componenti delphi
con gli eventi necessari e che ammettano forme Strane da poligoni a non so che ;)
comunque una volta che hai l'evento OnMouseMove(Sender : TObject; ...)
e la tua zona ha come caption il valore che vuoi visualizzare fai in questa maniera
scrivi un evento standard per tutte le zone che assegnerai all'OnMouseMove di ogni zona in cui
grazie al Sender sai le informazioni della zona che ha chiamato l'evento
quindi se vuoi visualizzare la finestrella
Finestrella.Top := Y;
Finestrella.Left := X;
Finestrella.Show;
Finestrella.Scritta.Caption := (Sender as TZona).Caption;
//a seconda della zona cambia la scritta e la posizione della finestrella
ovviamente è codice di fantasia (almeno come nomi) ma ti dovrebbe instradare ....
spero ;)
	Ciao
	MassimoB