Can anybody explain how to scroll in a TMemo with moving caret using the MouseWheel?
First. Wheel event do before change, you need scroll after change, so, do some PostMessage or use Timer. For example, use Timer with Interval = 10 and Enabled = False. When wheel scroll, set Timer.Enabled := True;
Second. Detect memo limit:
procedure GetMemoLimit(Memo: TMemo; out FirstLineIndex, LastLineIndex: Integer);
var
R: TRect;
H: THANDLE;
begin
H := Memo.Handle;
FirstLineIndex := SendMessage(H, EM_GETFIRSTVISIBLELINE, 0, 0);
SendMessage(H, EM_GETRECT, 0, LPARAM(@R));
LastLineIndex := HIWORD(SendMessage(H, EM_CHARFROMPOS, 0, MAKELPARAM(R.Left + 1, R.Bottom - 2)));
end;
Third. Do process in timer event:
var
FirstLineIndex, LastLineIndex: Integer;
P: TPoint;
begin
Timer1.Enabled := False;
GetMemoLimit(Memo1, FirstLineIndex, LastLineIndex);
P := Memo1.CaretPos;
if P.y < FirstLineIndex then
begin
P.y := FirstLineIndex;
Memo1.CaretPos := P;
end
else
if P.y > LastLineIndex then
begin
P.y := LastLineIndex;
Memo1.CaretPos := P;
end;
end;