Newsgroup: it.comp.lang.delphi
Titolo: abilitare scroll del mouse su scrollbox

Lavoro con DElphi 2006. Non riesco a scrollare una scrollbox anche con
la rotellina del mouse. Ho visto che ci sono degli eventi della
scrollbox attinenti a questa funzionalità (onmousewheel, etc...)ma non
ho trovato indicazioni nella guida di DElphi per inserirle anche nella
mia applicazione.
C'è qualcuno che può darmi una mano?
Grazie

 Lavoro con DElphi 2006. Non riesco a scrollare una scrollbox anche con
Inserire l'oggetto TApplicationEvent nel form e su OnMessage 
mettere il codice seguente:
procedure TForm1.ApplicationEvents1Message
   (var Msg: TMsg; var Handled: Boolean) ;
var
   x: SmallInt;
begin
   if Msg.message = WM_MOUSEWHEEL then
   begin
     Msg.message := WM_KEYDOWN;
     Msg.lParam := 0;
     x := HiWord(Msg.wParam) ;
     if x > 0 then
       Msg.wParam := VK_UP
     else
       Msg.wParam := VK_DOWN;
     Handled := False;
   end;
end;


wrote:

Non funziona.
Mi puoi spiegare il codice così capisco se è quello che mi serve?

vvi...@virgilio.it
 ha scritto:

Il modo più rapido e sicuro è senz'altro quello di creare un nuovo 
controllo che derivi da *TScrollBox* in cui aggiungere l'implementazione 
mancante.
Per l'implementazione specifica, anche se si tratta di un tipo di 
controllo differente, puoi prendere spunto da quanto codificato per la 
*TDBGrid* in questa discussione:
http://tinyurl.com/2k2khv
Non ho la possibilità di testare la soluzione, al momento, ma dovrebbe 
funzionare anche per il controllo *TScrollBox*.
P.S.: se aggiungi la unit "IMouse", dato che hai a disposizione D2006, 
puoi abilitare da subito lo scrolling con il tasto centrale del mouse 
(rotellina) che effettua lo spostamento nelle quattro direzioni.
Ciao,
   Marco.
-- 
MARCO BREVEGLIERI
  (
http://www.marco.breveglieri.name
)

 funzionare anche per il controllo *TScrollBox*.
Mi autosmentisco (è il massimo, no?) perché mi sovviene che la 
*TScrollBox* contiene a sua volta altri controlli, su cui probabilmente 
si trova il mouse al momento dello "scroll", quindi l'implementazione 
della griglia (che è un controllo unico) non è valida. :-(
Si dovrebbe intercettare il messaggio ad un "livello superiore", e 
verificare poi se le coordinate del mouse sono incluse nell'area client 
occupata dal controllo *TScrollBox*, inviando poi un messaggio a 
quest'ultimo per rispondere all'azione svolta sulla rotellina.
A cosa servirebbe questa *TScrollBox*? Magari c'è una soluzione migliore 
per ottenere lo stesso effetto che si sta cercando di riprodurre con 
questo controllo.



La scrollbox contiene una serie di link che mi servono per accedere ad
altri form.
Lo stesso problema comunque ce l'avrei anche per far scorrere una
webbrowser contenente un testo troppo lungo o una dbctrlgrid
contenente un elenco di miniature.
Credevo bastasse agire sull'evento onmousewheel...

 contenente un elenco di miniature.
Il WebBrowser non sarebbe un problema, perché non avrebbe bisogno di 
alcuna ScrollBox di contenimento: basterebbe appoggiarlo al Form, 
allinearlo all'area client e caricare una pagina al suo interno.
Se la pagina è più lunga del controllo, la barra di scorrimento dovrebbe 
apparire automaticamente.
Secondo me, è la soluzione migliore, visto il tipo di contenuto che devi 
presentare.



Si Marco ma non è questo il mio problema. In tutti i casi che ho
elencato compare la barra di scorrimento se il contenuto supera la
lunghezza del controllo. Quindi sono a posto, da questo punto di
vista. Il cliente mi obbietta che vorrebbe scrollare anche tramite
rotellina del mouse perché è più comodo ed ormai si fa dappertutto. E'
possibile che sia così complicato ottenerlo anche con Delphi?
Vicky

vvi...@virgilio.it
 ha scritto:

http://delphi.newswhat.com/geoxml/forumhistorythread?groupname=borland.public.delphi.language.delphi.win32&messageid=421810a1$1...@newsgroups.borland.com
Ciao
ACSH
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 rotellina del mouse perché è più comodo ed ormai si fa dappertutto.
Se usi un *WebBrowser*, lo scrolling tramite rotellina dovrebbe essere 
abilitato, senza alcun bisogno di gestirlo manualmente.


Così dovrebbe funzionare:
procedure Tform1.FormCreate(Sender: TObject);
begin
  Application.OnMessage := AppMessage;
end;
procedure Tform1.AppMessage(var Msg: TMsg; var Handled: Boolean);
var
  i: SmallInt;
begin
  if Msg.message = WM_MOUSEWHEEL then
  begin
    Msg.message := WM_KEYDOWN;
    Msg.lParam := 0;
    i := HiWord(Msg.wParam);
    if i > 0 then
      Msg.wParam := VK_UP
    else
      Msg.wParam := VK_DOWN;
    Handled := False;
  end;
end;
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift:
TShiftState);
begin
  if ((Key = VK_DOWN) and (Shift = [])) then
  begin
    Key := 0;
   if (scrollbox1.VertScrollBar.Position +
scrollbox1.VertScrollBar.Increment <= scrollbox1.VertScrollBar.Range)
then
   begin
     scrollbox1.VertScrollBar.Position :=
scrollbox1.VertScrollBar.Position +
scrollbox1.VertScrollBar.Increment;
   end
   else
   begin
     scrollbox1.VertScrollBar.Position :=
scrollbox1.VertScrollBar.Range;
    end;
  end;
  if (Key = VK_UP) and (Shift = []) then
  begin
    Key := 0;
    if (scrollbox1.VertScrollBar.Position -
scrollbox1.VertScrollBar.Increment >= 0) then
    begin
      scrollbox1.VertScrollBar.Position :=
scrollbox1.VertScrollBar.Position -
scrollbox1.VertScrollBar.Increment;
    end
    else
    begin
      scrollbox1.VertScrollBar.Position := 0;
    end;
  end;
end;
bye

procedure TForm1.ApplicationEventsMessage(var Msg: tagMSG;
  var Handled: Boolean);
   // Disattiva la rotellina del mouse Wheel
   if ActiveControl=StringGrid1 then
      if Msg.message = WM_MOUSEWHEEL then begin Msg.wParam := 0; EXIT; 
end;
DA USARE con ActiveControl=.... per ridurre il lavoro su processore 
oppure deriva il componente...
--- posted by geoForum on 
http://www.delphiedintorni.it

Io sto usando questo codice che in effetti mi permette di scrollare la
scrollbox con la rotellna del mouse:
procedure TformIndice.ScrollBox1MouseWheel(Sender: TObject; Shift:
TShiftState;
  WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
begin
  if wheeldelta > 0 then
    scrollbox1.ScrollBy(0,(scrollbox1.height div 2));
  if wheeldelta < 0 then
    scrollbox1.ScrollBy(0,-(scrollbox1.height div 2));
end;
Il problema è che sia verso l'alto che verso il basso lo scrolling va
all'infinito mostrando un enorme spazio vuoto sia sopra che sotto.
La scrollbox è allineata all'area client del form.

 La scrollbox è allineata all'area client del form.
Già provato questo codice (trovato su internet)? A me funziona.
Se poi setti la VertScrollBar con la proprietà Smooth l'effetto è ancora 
più carino.
procedure TForm1.ScrollBox1MouseWheelUp(Sender: TObject;
   Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
begin
   Handled := (SendMessage(ScrollBox1.Handle, WM_VSCROLL, SB_LINEUP, 0) 
= 0);
end;
procedure TForm1.ScrollBox1MouseWheelDown(Sender: TObject;
   Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
begin
   Handled := (SendMessage(ScrollBox1.Handle, WM_VSCROLL, SB_LINEDOWN, 
0) = 0);
end;
-- 
Jax