Newsgroup: it.comp.lang.delphi
Titolo: Disabilitare scroll del mouse

Ho bisogno di disabilitare nelle Tcombobox lo scroll del mouse.
Qualcuno ha qualche dritta da darmi??
Grazie

 Qualcuno ha qualche dritta da darmi??
Dovresti creare un controllo discendente da *TComboBox*; dovresti poi 
dotare la classe corrispondente di un metodo che sia in grado di gestire 
il messaggio WM_MOUSEWHEEL (attraverso la direttiva *message*) e, al suo 
interno, inibire tale messaggio, magari impostando il campo /Result/ del 
record di tipo *TMessage* passato come parametro al metodo al valore 0 
(zero).
Per la massima sicurezza, consulta la documentazione Microsoft in merito 
al messaggio WM_MOUSEWHEEL per verificare con precisione in che modo va 
trattato.
Ciao! :-)
-- 
Marco «Alka» Breveglieri
  (marco [@] abls [.] it)
  ABLS Team S.n.c. - Software & Web
  42019 Scandiano (Reggio Emilia)
 
http://www.abls.it

 ha scritto nel messaggio
news:PeIQd.549852$b5.25...@news3.tin.it...



Scusa ho visto l'help in linea e infatti potrebbe essere la soluzione giusta
però, scusa l'ignoranza, non riesco a capire quando far partire l'evento.
A me servirebbe che quando si apre la form tutte e solo le combobox abbiano
l'evento disattivato.
Puoi darmi qualche chiarimento??
Grazie.

 "intercettare" l'msg WM_MOUSEWHELL e "spegnerlo".
Ho suggerito la soluzione di creare un discendente perchè supponevo che 
il nostro amico non volesse "spegnere" quel messaggio globalmente per 
l'intera applicazione, ma solo per il controllo ComboBox nello specifico.
Creando un discendente e inserendo nella classe del controllo la 
gestione, o meglio la "ingestione" del messaggio, si ottiene una 
ComboBox con tale funzionalità pienamente riutilizzabile in tutti i 
punti in cui si ritiene necessario. :-)


> l'intera applicazione, ma solo per il controllo ComboBox nello specifico.
E' esattamente quello che ottieni col subclassing, che non e' globale ma
riguarda il componente dove lo implementi.
Ulisse, nel .Create delle ComboBox1 salvi l'indirizzo originale della sua
WindowProc e fai il subclassing con un'assegnazione:
OldWindProc:=ComboBox1.WindowProc;
ComboBox1.WindowProc:=NewWindProc;
la funzione NewWindowProc e' definita e implementata :
procedure TForm1.NewWindowProc(var Message: TMessage); // passi tutti i msg
alla windproc
// originale escluso Mousewhell, cosi lo "spegni"
begin
    if Message.msg<> WM_Mousewheel then
          OldWindProc(Message);
  end;
da non dimenticare!!!
al Destroy della ComboBox1 rimetti tutto com'era:
ComboBox1.WindowProc:=OldWindProc;
Ora non saprei se il msg WM_MouseWhell e' postato o inviato col send,
perche' nel primo caso potresti bloccarlo anche all'evento
Application.OnMessage controllando che gli handle siano quelli delle
combobox, nel secondo caso potresti fare un hook dell'applicazione. Per
quest'ultimo metodo, che non e' difficile, cerca in Google o in Torry,
troverai tutto cio' ti serve.
giorgio

 Torry, troverai tutto cio' ti serve.
Senza dubbio ciň che scrivi č corretto e fattibile, ma quello che Marco
intendeva (sono un pň presuntuoso nell'indovinare le sue intenzioni ;-)
) č di avere una soluzione semplice sfruttando le caratteristiche della
OOP. In fondo, ereditando il componente devi soltanto aggiungere una
procedura che intercetti il messaggio e lo fagociti. Se non hai bisogno
di un eccessivo utilizzo di tale componente puoi risparmiarti anche di
registrarlo per la palette e crearlo direttamente a runtime, imho.
guastatore

procedura che intercetti il messaggio e lo fagociti.
                                            ^^^^^^^
ehm... scus... off..ough!!! ORFH!! MMPFFF!!
MMMMH!! MMH!!
(ULTRALOL!)
-- 
Morde. 
(
mo...@despammed.com
)
M-List di icld: 
http://it.groups.yahoo.com/group/icld/

 (ULTRALOL!)
... nel fagocitare puo' anche andare "di traverso" :-)

... nel fagocitare puo' anche andare "di traverso" :-)
Da Garzantilinguistica.it :
Lemma:  	fagocitare
Sillabazione/Fonetica: 	[fa-go-ci-tà-re]
Etimologia: 	
Verbo: 	
Definizione 	v. tr. [io fagòcito o fagocìto ecc.]
1 (biol.) inglobare, assorbire per fagocitosi
2 (fig.) incorporare, inglobare, includere nel proprio ambito; annettersi.
3 (inform.) L'atto di intercettazione di un messaggio di sistema da parte di
una procedura di un componente subderivato.
mitico!


Siccome ho letto il messaggio un po' in ritardo mi sono adattato in questo
modo:
Ho scoperto che su ogni form c'è l'evento onmousewheel.
Dentro questo evento ho confrontato che l'Activecontrol.owner fosse uguale
al nome.owner di una qualsiasi combobox all'interno della form, se ciò è
vero ho dato l'abort.
Praticamente:
procedure Tform1.FormMouseWheel(Sender: TObject; Shift: TShiftState;
  WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
begin
  if activecontrol.Owner = nome.Owner
  then abort;
end;
Due righe e ho risolto anche se un po' grossolanamente...
Grazie mille a tutti.

 mitico!
Hai dimenticato la tripla t :-))) Ed il punto 3 sono sicuro che č
venuto fuori dal grande vocabolario della lingua Mordiana ;-))
ciao
Antonio


 Ho scritto una bestialata scusate....
 if activecontrol is tcombobox
 then abort;
Testato OK
Ciao

 Ciao
-- 
Ciao, Anto', [37, 143, AQ] 
MB C SC 220 CDI Magma Rot
"Oggi c'è una grande battaglia di idee, ma alla 
fine, non ci saranno ne vinti, ne vincitori, ne idee!"
S. Benni da Elianto

 OOP.
Proprio così! ;-)
Oltre alla questione della semplicità, la soluzione che è stata scelta 
(gestire l'evento apposito del form) andrebbe replicata su tutti i form 
per ottenere lo stesso effetto; in alternativa, si potrebbe creare un 
form di base in cui viene gestita l'inibizione dello "scroll" con il 
mouse ed ereditare da questo, ma allora si arriva a quello che suggerivo 
io, con il risultato che - secondo me - è sbagliato introdurre codice 
nel form per gestire una funzionalità che riguarda uno solo dei controlli.
E se poi non fosse necessario disabilitare lo "scroll" su tutte le 
ComboBox ma solo su alcune? Ci sarebbe un proliferare di *if*, *case* e 
altri costrutti che, secondo me, complicherebbero il codice...il tutto 
per evitare di creare un controllo discendente, che in Delphi si ottiene 
selezionando banalmente la voce di menu [Component|New Component...].
Considerando la gamma delle potenzialità e delle opportunità che Delphi 
mette a disposizione, mi sembrava la soluzione più sicura e adattabile. :-|
Ciao a tutti! :-)


 ha scritto nel messaggio
news:HhiRd.558230$b5.25...@news3.tin.it...
