richmemo: adding the check for a valid character offset, for most GetXXXX attributes methods. bug #32296

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@7282 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
skalogryz
2020-01-13 15:09:10 +00:00
parent 042de4a95e
commit 274ebf2d71

View File

@ -206,6 +206,7 @@ type
LinkStart, LinkEnd: Integer); LinkStart, LinkEnd: Integer);
function GetCanRedo: Boolean; virtual; function GetCanRedo: Boolean; virtual;
function isValidCharOfs(TextStart: integer): Boolean;
public public
constructor Create(AOwner: TComponent); override; constructor Create(AOwner: TComponent); override;
procedure CopyToClipboard; override; procedure CopyToClipboard; override;
@ -677,7 +678,8 @@ function TCustomRichMemo.GetTextAttributes(TextStart: Integer; var TextParams: T
begin begin
if not HandleAllocated then HandleNeeded; if not HandleAllocated then HandleNeeded;
if HandleAllocated then if HandleAllocated then
Result := TWSCustomRichMemoClass(WidgetSetClass).GetTextAttributes(Self, TextStart, TextParams) Result := isValidCharOfs(TextStart)
and TWSCustomRichMemoClass(WidgetSetClass).GetTextAttributes(Self, TextStart, TextParams)
else else
Result := false; Result := false;
end; end;
@ -686,7 +688,7 @@ function TCustomRichMemo.GetStyleRange(CharOfs: Integer; var RangeStart,
RangeLen: Integer): Boolean; RangeLen: Integer): Boolean;
begin begin
if HandleAllocated then begin if HandleAllocated then begin
Result := TWSCustomRichMemoClass(WidgetSetClass).GetStyleRange(Self, CharOfs, RangeStart, RangeLen); Result := isValidCharOfs(CharOfs) and TWSCustomRichMemoClass(WidgetSetClass).GetStyleRange(Self, CharOfs, RangeStart, RangeLen);
if Result and (RangeLen = 0) then RangeLen := 1; if Result and (RangeLen = 0) then RangeLen := 1;
end else begin end else begin
RangeStart := -1; RangeStart := -1;
@ -698,8 +700,9 @@ end;
function TCustomRichMemo.GetParaAlignment(TextStart: Integer; function TCustomRichMemo.GetParaAlignment(TextStart: Integer;
var AAlign: TParaAlignment): Boolean; var AAlign: TParaAlignment): Boolean;
begin begin
Result := HandleAllocated and Result := HandleAllocated
TWSCustomRichMemoClass(WidgetSetClass).GetParaAlignment(Self, TextStart, AAlign); and isValidCharOfs(TextStart)
and TWSCustomRichMemoClass(WidgetSetClass).GetParaAlignment(Self, TextStart, AAlign);
end; end;
function TCustomRichMemo.GetParaAlignment(TextStart: Integer): TParaAlignment; function TCustomRichMemo.GetParaAlignment(TextStart: Integer): TParaAlignment;
@ -718,7 +721,8 @@ function TCustomRichMemo.GetParaMetric(TextStart: Integer;
var AMetric: TParaMetric): Boolean; var AMetric: TParaMetric): Boolean;
begin begin
if HandleAllocated then if HandleAllocated then
Result := TWSCustomRichMemoClass(WidgetSetClass).GetParaMetric(Self, TextStart, AMetric) Result := isValidCharOfs(TextStart)
and TWSCustomRichMemoClass(WidgetSetClass).GetParaMetric(Self, TextStart, AMetric)
else else
Result := false; Result := false;
end; end;
@ -752,7 +756,8 @@ begin
Result:=false; Result:=false;
if not HandleAllocated then HandleNeeded; if not HandleAllocated then HandleNeeded;
if HandleAllocated then if HandleAllocated then
Result:=TWSCustomRichMemoClass(WidgetSetClass).GetParaRange(Self, CharOfs, ParaRange); Result:=isValidCharOfs(CharOfs)
and TWSCustomRichMemoClass(WidgetSetClass).GetParaRange(Self, CharOfs, ParaRange);
end; end;
function TCustomRichMemo.GetParaRange(CharOfs: Integer; var TextStart, function TCustomRichMemo.GetParaRange(CharOfs: Integer; var TextStart,
@ -777,7 +782,8 @@ begin
Result:=false; Result:=false;
if not HandleAllocated then HandleNeeded; if not HandleAllocated then HandleNeeded;
if HandleAllocated then if HandleAllocated then
Result:=TWSCustomRichMemoClass(WidgetSetClass).GetParaTabs(Self, CharOfs, AStopList); Result:= isValidCharOfs(CharOfs)
and TWSCustomRichMemoClass(WidgetSetClass).GetParaTabs(Self, CharOfs, AStopList);
end; end;
function TCustomRichMemo.GetContStyleLength(TextStart: Integer): Integer; function TCustomRichMemo.GetContStyleLength(TextStart: Integer): Integer;
@ -1119,6 +1125,14 @@ begin
Result:=false; Result:=false;
end; end;
function TCustomRichMemo.isValidCharOfs(TextStart: integer): Boolean;
begin
// TextStart, where TextStart = GetTextLen, is a location at the end of the text
// it's technically a valid character offset (position)
// Because it's where the entry should occur
Result := (TextStart >= 0) and (TextStart <= GetTextLen);
end;
function TCustomRichMemo.PrintMeasure(const params: TPrintParams; var est: TPrintMeasure): Boolean; function TCustomRichMemo.PrintMeasure(const params: TPrintParams; var est: TPrintMeasure): Boolean;
begin begin
if not Assigned(Printer) then begin if not Assigned(Printer) then begin