FIX: Viewer - crash under macOS (issue #2815)

(cherry picked from commit 151b8faf18)
This commit is contained in:
Alexander Koblov 2026-05-07 21:20:55 +03:00
commit b7dc318a3b

View file

@ -216,6 +216,7 @@ type
FTextWidth: Integer; // max char count or width in window
FTextHeight: Integer; // measured values of font, rec calc at font changed
FOnPositionChanged: TNotifyEvent;
FScrollBarsLock: Integer;
FUpdateScrollBarPos: Boolean; // used to block updating of scrollbar
FScrollBarPosition: Integer; // for updating vertical scrollbar based on Position
FHScrollBarPosition: Integer; // for updating horizontal scrollbar based on HPosition
@ -845,15 +846,19 @@ var
begin
if HandleAllocated then
begin
ScrollInfo:= Default(TScrollInfo);
ScrollInfo.cbSize:= SizeOf(ScrollInfo);
ScrollVisible:= (Which = SB_VERT) or (FViewerControlMode = vcmText);
ShowScrollBar(Handle, Which, ScrollVisible);
ScrollInfo.fMask:= SIF_POS or SIF_RANGE or SIF_PAGE;
ScrollInfo.nPage:= 1;
ScrollInfo.nMax:= 100;
ScrollInfo.nPos:= Value;
SetScrollInfo(Handle, Which, ScrollInfo, ScrollVisible);
if ScrollVisible then
begin
ScrollInfo:= Default(TScrollInfo);
ScrollInfo.cbSize:= SizeOf(ScrollInfo);
ScrollInfo.fMask:= SIF_POS or SIF_RANGE or SIF_PAGE;
ScrollInfo.nPage:= 1;
ScrollInfo.nMax:= 100;
ScrollInfo.nPos:= Value;
SetScrollInfo(Handle, Which, ScrollInfo, ScrollVisible);
end;
end;
end;
@ -3624,22 +3629,32 @@ var
ScrollVisibleH: Boolean;
ScrollInfo: TScrollInfo;
begin
if HandleAllocated then
// ShowScrollBar may send a resize message
// and trigger DoOnResize -> UpdateScrollbars
if HandleAllocated and (FScrollBarsLock = 0) then
begin
ScrollInfo:= Default(TScrollInfo);
ScrollInfo.cbSize:= SizeOf(ScrollInfo);
ScrollVisibleH:= (FViewerControlMode = vcmText);
ScrollInfo.fMask:= SIF_POS or SIF_RANGE or SIF_PAGE or SIF_DISABLENOSCROLL;
ScrollInfo.nPage:= 1;
ScrollInfo.nMax:= 100;
// Vertical
ScrollInfo.nPos:= FScrollBarPosition;
ShowScrollBar(Handle, SB_Vert, True);
SetScrollInfo(Handle, SB_Vert, ScrollInfo, True);
// Horizontal
ScrollInfo.nPos:= FHScrollBarPosition;
ShowScrollBar(Handle, SB_Horz, ScrollVisibleH);
SetScrollInfo(Handle, SB_Horz, ScrollInfo, ScrollVisibleH);
Inc(FScrollBarsLock);
try
ScrollInfo:= Default(TScrollInfo);
ScrollInfo.cbSize:= SizeOf(ScrollInfo);
ScrollInfo.fMask:= SIF_POS or SIF_RANGE or SIF_PAGE or SIF_DISABLENOSCROLL;
ScrollInfo.nPage:= 1;
ScrollInfo.nMax:= 100;
// Vertical
ScrollInfo.nPos:= FScrollBarPosition;
ShowScrollBar(Handle, SB_Vert, True);
SetScrollInfo(Handle, SB_Vert, ScrollInfo, True);
// Horizontal
ScrollVisibleH:= (FViewerControlMode = vcmText);
ShowScrollBar(Handle, SB_Horz, ScrollVisibleH);
if ScrollVisibleH then
begin
ScrollInfo.nPos:= FHScrollBarPosition;
SetScrollInfo(Handle, SB_Horz, ScrollInfo, ScrollVisibleH);
end;
finally
Dec(FScrollBarsLock);
end;
end;
end;