vclmessagemousewheeltmemoc++builder-xe3

How to get Scrollbar notifications from a TMemo control?


I have a VCL TMemo control and need to be notified every time the text is scrolled. There is no OnScroll event and the scroll messages doesn't seem to propagate up to the parent form.

Any idea of how to get the notification? As a last resort I can place an external TScrollBar and update the TMemo in the OnScroll event, but then I have to keep them in sync when I move the cursor or scroll the mouse wheel in TMemo...


Solution

  • You can subclass the Memo's WindowProc property at runtime to catch all of messages sent to the Memo, eg:

    private:
        TWndMethod PrevMemoWndProc;
        void __fastcall MemoWndProc(TMessage &Message);
    

    __fastcall TMyForm::TMyForm(TComponent *Owner)
        : TForm(Owner)
    {
        PrevMemoWndProc = Memo1->WindowProc;
        Memo1->WindowProc = MemoWndProc;
    }
    
    void __fastcall TMyForm::MemoWndProc(TMessage &Message)
    {
        switch (Message.Msg)
        {
            case CN_COMMAND:
            {
                switch (reinterpret_cast<TWMCommand&>(Message).NotifyCode)
                {
                    case EN_VSCROLL:
                    {
                        //...
                        break;
                    }
    
                    case EN_HSCROLL:
                    {
                        //...
                        break;
                    }
                }
    
                break;
            }
    
            case WM_HSCROLL:
            {
                //...
                break;
            }
    
            case WM_VSCROLL:
            {
                //...
                break;
            }
        }
    
        PrevMemoWndProc(Message);
    }