Page 1 of 1

[Example] How to scroll to selection

Posted: Tue Oct 29, 2013 10:08 am
by Sergey Tkachenko
The function below scrolls to make selection visible.
It works both for TRichView and TRichViewEdit.

This function is especially useful in TRichView, because TRichView does not scroll after making selection (except for selecting with SearchText).

Code: Select all

uses CRVFData, CRVData, Math; 
procedure ShowSelection(rv: TCustomRichView); 
var RVData: TCustomRVFormattedData; 
    StartItemNo, StartOffs, EndItemNo, EndOffs: Integer; 
    i, StartDItemNo, StartDOffs, EndDItemNo, EndDOffs: Integer; 
    R: TRect; 
begin 
  // finding subdocument containing selection (a main document or a cell) 
  RVData := RV.RVData; 
  while RVData.GetChosenRVData<>nil do 
    RVData := TCustomRVFormattedData(RVData.GetChosenRVData); 
  // getting selection 
  RVData.GetSelectionBoundsEx(StartItemNo, StartOffs, EndItemNo, EndOffs, True); 
  if (StartItemNo<0) or (EndItemNo<0) then 
    exit; 
  // converting selection position from item indices to drawing item indices 
  RVData.Item2DrawItem(StartItemNo, StartOffs, StartDItemNo, StartDOffs); 
  RVData.Item2DrawItem(EndItemNo, EndOffs, EndDItemNo, EndDOffs); 
  // (roughly) calculating selection coordinates in local coordinates of RVData 
  with RVData.DrawItems[StartDItemNo] do 
    R := Bounds(Left, Top, Width, Height); 
  for i := StartDItemNo+1 to EndDItemNo do 
    with RVData.DrawItems[i] do begin 
      R.Left := Min(R.Left, Left); 
      R.Top := Min(R.Top, Top); 
      R.Right := Max(R.Right, Left+Width); 
      R.Bottom := Max(R.Bottom, Top+Height); 
    end; 
  // scrolling to the selection 
  RVData.ShowRectangle(R.Left, R.Top, R.Right-R.Left, R.Bottom-R.Top); 
end;