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
...
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);
}