[Example] How to scroll to selection
Posted: Tue Oct 29, 2013 10:08 am
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).
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;