Newsgroup: it.comp.lang.delphi
Titolo: D7E - Scrollbox

Ho trovato nei vecchi post delle soluzioni su come gestire la rotella
del mouse su un TScrollBox.
Quelle basate sugli eventi di applicazione non posso usarle.
Ho provato a ereditare dal componente per gestire i messaggi ma niente
da fare.
Ho notato che Scrollbox non becca il focus...
Ho anche provato a cercare su torry qualcosa di alternativo ma non ho
trovato niente di recente.
Qualcuno ha gia' tozzato su questa cosa?
Aggiungo che trovo abbastanza surreale che un componente del genere
non abbia un evento di scroll...
Grazie per ogni eventuale risposta.
A.

Io utilizzo questa procedura, inserita nel form "base" dal quale
eredito tutti gli altri form dell'applicazione.
Consiste nel trasformare l'evento WM_MOUSEWHEEL in WM_KEYDOWN (up or
down), gestito dai controlli griglia, combo, ...
Non so se sia applicabile nel tuo caso, ad ogni modo qui sotto ti
riporto il segmento di codice che lo implementa.
Alessandro B.
type
  TFormBase = class(TForm)
public
  procedure AppMessage( var Msg: tagMSG; var Handled: Boolean );
...
procedure TFormBase.AppMessage( var Msg: tagMSG; var Handled:
Boolean );
var x: SmallInt;
begin
  inherited;
  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;

Ciao...E grazie.
Ho gia trovato cose simili ma a me serve x forza sul singolo
componente.
Il form su cui sta la scrollbox e' bello tosto e non posso usare una
gestione cosi' brutale" che valore per tutti i controlli.
Ancora grazie!
A.

Alberto Salvati ha scritto:




Non ho Delphi per poter controllare: esistono gli eventi wheeldown e
wheelup 
in quel componente?
ACSH
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 in quel componente?
Si ma non scattano... :-(
A.

 in quel componente?
Ok, ho controllato in D2009 e ci sono. Quindi devi gestire 
con l'API SystemParametersInfo il valore restituito con 
il parametro SPI_GETWHEELSCROLLLINES.
Cos�, pi� o meno:
Nella dichiarazione della form:
  private
    function LeggiSpostamentoMouse: integer;
    property SpostamentoMouse: integer Read 
LeggiSpostamentoMouse;
Poi definisci la function:
function TForm1.LeggiSpostamentoMouse: integer;
begin
  SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, @Result, 0);
end;
Poi implementi i due eventi. Per esempio:
procedure TForm1.JvScrollBox1MouseWheelUp(Sender: TObject; 
Shift: TShiftState;
  MousePos: TPoint; var Handled: Boolean);
begin
  jvscrollbox1.vertscrollbar.position :=
         jvscrollbox1.vertscrollbar.position - 
SpostamentoMouse;
end;
procedure TForm1.JvScrollBox1MouseWheelDown(Sender: TObject; 
Shift: TShiftState;
  MousePos: TPoint; var Handled: Boolean);
begin
  jvscrollbox1.vertscrollbar.position :=
         jvscrollbox1.vertscrollbar.position + 
SpostamentoMouse;
end;
Provato velocemente senza altri componenti sulla form oltre 
alla ScrollBox.
Ciao


 procedure TForm1.JvScrollBox1MouseWheelUp(Sender: TObject;
ehm...forse non mi sono spiegato bene... Gli eventi ci sono MA NON
SCATTANO.
Inoltre, dal tuo codice sembra che non fai riferimento alla scrollbox
standard di delphi ma a qualcosa di jvcl...
O sbaglio?
A.

Alberto Salvati ha scritto:


Ho usato la Scrollbox delle Jedi per abitudine, ma non dovrebbe cambiare 
nulla per il tuo problema.
Mi stai dicendo che in D7, mettendo una scrollbox su una form vuota e 
riempiendola a caso, mettendo poi quel codice che ti ho postato, 
non succede nulla?
(Ora non ho Delphi a disposizione per poter provare)


 non succede nulla?
A scanso equivoci, ho fatto un prj di test.
Un form, una tscrollbox con dentro 2 cosi...
Ho messo del codice negli eventi OnMouseWeel,  OnMouseWeelDown,
OnMouseWeelUp...
Vado sulla scrollbox, uso la kaz di rotella ma non succede niente: gli
eventi non scattano.
Queste sono le cose che mi fanno ...zzzare! Se ci sono xche non
scattano?? uff..... dupallas.... :-((
A.

Su suggerimento di un collega ho fatto altre prove...
Se dentro la scrollbox metto un tmemo, gli eventi scattano.
Se dentro la scrollbox metto un tchart (che e' quello che mi serve) o
un tgroupbox, gli eventi non scattano.
Se dentro la scrollbox metto un tpanel con dentro un tchart gli eventi
non scattano
Ma se dentro la scrollbox metto un tpanel con dentro un tmemo o un
tedit gli eventi scattano.
Ho anche provato a mettere nella scrollbox 2 chart ed un tedit: gli
eventi scattano.
Ma se sul tedit metto visible=false, gli eventi non scattano.
Idem se sostituisco tedit con una tlabel...
Secondo me gli eventi weel non sono generati *direttamente* da
TScrollBox ma solo a seguito della ricezione di qualche messaggio di
winzozz da uno dei controlli di cui la scrollbox stessa e' il parent.
A.

 A.
MSDN dice che:
WM_MOUSEWHEEL Message
Sent to the focus window when the mouse wheel is rotated.
The DefWindowProc function propagates the message to the window's parent.
sembra quindi che occorra almeno un controllo child che possa ricevere 
il focus tipo il TEdit