Scrollrad versus Scrolleiste bei TStringGrid



  • Hallo,

    mich ärgert StringGrid ein bisschen, und da ich nicht genau weiß, wonach ich suchen soll, wollte ich euch fragen, ob ihr mir weiterhelfen könnt.

    Was ich möchte:
    - wenn ich scrolle, soll diese Zeile angewählt bleiben, und die Tabelle scrollen

    Was ich habe:
    - wenn ich mit der Scrollbar scrolle, funktioniert alles prima, aber wenn ich mit dem Mausrad scrolle, wechselt die markierte Zeile, statt einem Scroll durch die Tabelle

    Ich hätte ein paar halbgare Ideen für Workarounds, aber vielleicht kann man die entsprechenden Funktionen ja auch direkt an und ausschalten?

    Viele Grüße,
    GoldenAge



  • Hi,

    im BCB2009 gibts die Events OnMouseWheelUp / OnMouseWheelDown.

    Da kann man schreiben

    void __fastcall TFormMain::GridMouseWheelDown(TObject *Sender, TShiftState Shift,
    		  TPoint &MousePos, bool &Handled)
    {
    	SendMessage(Grid->Handle, WM_VSCROLL,  MAKELONG( SB_LINEDOWN, MousePos.y), NULL);
    	Handled = true;
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TFormMain::GridMouseWheelUp(TObject *Sender, TShiftState Shift, TPoint &MousePos,
              bool &Handled)
    {
    	SendMessage(Grid->Handle, WM_VSCROLL,  MAKELONG( SB_LINEUP, MousePos.y), NULL);
    	Handled = true;
    }
    

    Wichtig ist das Handled.

    Bei BCB-Versionen ohne diese Ereignisse für das TStringGrid siehts etwas anders aus. Da mappt man WM_MOUSEWHEEL.



  • Vielen Dank, funktioniert einwandfrei! 🙂

    Rein aus Neugier: Was hat das Handled für einen Einfluss?



  • GoldenAge schrieb:

    Was hat das Handled für einen Einfluss?

    Für den Message Dispatcher: Message bereits verarbeitet, mach was anders 😉

    BCB Hilfe schrieb:

    Wenn er ein entsprechendes Aktionselement findet, ruft der Dispatcher die Behandlungsroutine für
    das Ereignis OnAction (hier OnMouseWheelUp/OnMouseWheelDown kpeter) des Aktionselements auf.
    Diese Ereignisbehandlungsroutine kann die Anforderung entweder vollständig verarbeiten, sie nur teilweise bearbeiten
    und dann an andere Aktionselemente übergeben, oder sie ohne Bearbeitung an andere Aktionselemente weiterleiten.
    Durch Setzen des Parameters Handled auf False zeigt die Ereignisbehandlungsroutine für OnAction an, daß der Dispatcher
    die Anforderung an andere Aktionselemente weiterleiten soll.

    mfg
    kpeter



  • Mit "Handled = true" signalisierst du, daß die Methode das Ereignis abgearbeitet hat und nicht mehr die Standard-Methode aufgerufen werden soll.

    Kannst ja mal testweise "Handled = false" setzen, dann müßten sowohl die Scrollbar scrollen als auch die markierte Zeile wechseln...



  • Th69 schrieb:

    Mit "Handled = true" signalisierst du, daß die Methode das Ereignis abgearbeitet hat und nicht mehr die Standard-Methode aufgerufen werden soll.

    Glaubst du, der DAU liest mit? 😃


Log in to reply