Page 1 of 1

Index out of bounds exception

Posted: Sun Dec 11, 2005 8:14 pm
by Splinter
Hi Sergey,

I can consistently reproduce this error in RichViewEdit 1.9.15.1, Delphi 5 if you:

type some text
insert a table
in the LAST cell of the table insert an animated gif image (using Anders component)
type some text under the table

Then, when you press backspace to delete the text, when you reach the beginning of the line and go to the previous line, the exception occurs.

I've emailed you an attachment containing a cut-down sample application that reproduces this error. Just right click the RVE and choose 'Import file' and import the attached .RVF file, then just press backspace a few times from the bottom to get the error.

I could not reproduce this problem in RichViewActions and wonder if it is related to use of unicode in my app?

Thanks for any suggestions :-)

Posted: Mon Dec 12, 2005 5:17 pm
by Sergey Tkachenko
Yes, I can confirm it.
But this exception is not dangerous, because it is catched by TRichView code (you will not notice it when running outside Delphi IDE).
But for any case, I modified my copy of code to avoid this exception.

Posted: Mon Dec 12, 2005 11:11 pm
by Splinter
Thanks Sergey,

Yes in the cut-down app I emailed you, the exception does seem to be captured. However, I discovered this problem when in my main app the problem occured and in red letters in the top left corner of the RVE was the message 'Error: List index out of bounds (7)'. So I think in some circumstances it was not captured so well :( . I have emailed you two screen shots 'before' and 'after' displaying this error.

Do you think your fix will have captured this more serious one as well? Which version number will this be released in?

:D

Posted: Tue Dec 13, 2005 5:48 pm
by Sergey Tkachenko
I can explain where you need to modify.

Change 1, CRVFData.pas.
Beginning of DrawItem2Item must be:

Code: Select all

procedure TCustomRVFormattedData.DrawItem2Item(DrawItemNo, DrawItemOffs: Integer;
                             var ItemNo, ItemOffs: Integer);
var dli: TRVDrawLineInfo;
begin
  ItemNo := -1;
  if (DrawItemNo = -1) or (DrawItemNo>=DrawItems.Count) then exit;
Change 2, RVTable.pas, change TRVTableItemInfo.CompletelySelected

Code: Select all

function TRVTableItemInfo.CompletelySelected: Boolean;
var SN,EN,SO,EO,No: Integer;
begin
  Result := Rows.FMainRVData is TCustomRVFormattedData;
  if not Result then
    exit;
  if rvstCompletelySelected in Rows.FMainRVData.State then
    exit;
  TCustomRVFormattedData(Rows.FMainRVData).GetSelectionBounds(SN,SO,EN,EO,True);
  Result := (SN>=0) and (EN>=0);
  if not Result then
    exit;
  No := GetMyItemNo;
  Result := ((No>SN) or ((No=SN) and (SO=0))) and
            ((No<EN) or ((No=EN) and (EO=1)));
end;

Posted: Tue Dec 13, 2005 9:58 pm
by Splinter
Works perfectly. Thanks. :mrgreen: