You've already forked lazarus-ccr
richmemo: win32 verify the update state of Lines before changing WM_SETREDRAW flag
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@4065 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
@ -36,26 +36,29 @@ uses
|
|||||||
// RichMemo headers
|
// RichMemo headers
|
||||||
RichMemo, WSRichMemo, Win32RichMemoProc, Win32RichMemoOle;
|
RichMemo, WSRichMemo, Win32RichMemoProc, Win32RichMemoOle;
|
||||||
|
|
||||||
type
|
type
|
||||||
|
|
||||||
{ TWin32RichMemoStringsW }
|
TWin32RichMemoStrings = class(TWin32MemoStrings)
|
||||||
|
|
||||||
TWin32RichMemoStringsW = class(TWin32MemoStrings)
|
|
||||||
protected
|
protected
|
||||||
|
fUpd : Boolean;
|
||||||
fHandle : HWND;
|
fHandle : HWND;
|
||||||
function GetTextStr: string; override;
|
procedure SetUpdateState(Updating: Boolean); override;
|
||||||
public
|
public
|
||||||
constructor Create(AHandle: HWND; TheOwner: TWinControl);
|
constructor Create(AHandle: HWND; TheOwner: TWinControl);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
{ TWin32RichMemoStringsW }
|
||||||
|
|
||||||
|
TWin32RichMemoStringsW = class(TWin32RichMemoStrings)
|
||||||
|
protected
|
||||||
|
function GetTextStr: string; override;
|
||||||
|
end;
|
||||||
|
|
||||||
{ TWin32RichMemoStringsA }
|
{ TWin32RichMemoStringsA }
|
||||||
|
|
||||||
TWin32RichMemoStringsA = class(TWin32MemoStrings)
|
TWin32RichMemoStringsA = class(TWin32RichMemoStrings)
|
||||||
protected
|
protected
|
||||||
fHandle : HWND;
|
|
||||||
function GetTextStr: string; override;
|
function GetTextStr: string; override;
|
||||||
public
|
|
||||||
constructor Create(AHandle: HWND; TheOwner: TWinControl);
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{ TWin32WSCustomRichMemo }
|
{ TWin32WSCustomRichMemo }
|
||||||
@ -170,16 +173,25 @@ const
|
|||||||
FORMAT_RENDER = 1;
|
FORMAT_RENDER = 1;
|
||||||
FORMAT_ESTIMATE = 0;
|
FORMAT_ESTIMATE = 0;
|
||||||
|
|
||||||
procedure LockRedraw(AHandle: HWND);
|
procedure LockRedraw(rm: TCustomRichMemo; AHandle: THandle);
|
||||||
|
var
|
||||||
|
ln: TWin32RichMemoStrings;
|
||||||
begin
|
begin
|
||||||
SendMessage(AHandle, WM_SETREDRAW, 0, 0);
|
ln:=TWin32RichMemoStrings(rm.Lines);
|
||||||
|
if not Assigned(ln) or not ln.fUpd then
|
||||||
|
SendMessage(AHandle, WM_SETREDRAW, 0, 0);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure UnlockRedraw(AHandle: HWND; NeedInvalidate: Boolean = true);
|
procedure UnlockRedraw(rm: TCustomRichMemo; AHandle: HWND; NeedInvalidate: Boolean = true);
|
||||||
|
var
|
||||||
|
ln: TWin32RichMemoStrings;
|
||||||
begin
|
begin
|
||||||
SendMessage(AHandle, WM_SETREDRAW, 1, 0);
|
ln:=TWin32RichMemoStrings(rm.Lines);
|
||||||
if NeedInvalidate then
|
if not Assigned(ln) or not ln.fUpd then begin
|
||||||
Windows.InvalidateRect(AHandle, nil, true);
|
SendMessage(AHandle, WM_SETREDRAW, 1, 0);
|
||||||
|
if NeedInvalidate then
|
||||||
|
Windows.InvalidateRect(AHandle, nil, true);
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function RichEditNotifyProc(const AWinControl: TWinControl; Window: HWnd;
|
function RichEditNotifyProc(const AWinControl: TWinControl; Window: HWnd;
|
||||||
@ -276,14 +288,22 @@ begin
|
|||||||
inherited Destroy;
|
inherited Destroy;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{ TWin32RichMemoStringsW }
|
{ TWin32RichMemoStrings }
|
||||||
|
|
||||||
constructor TWin32RichMemoStringsW.Create(AHandle: HWND; TheOwner: TWinControl);
|
constructor TWin32RichMemoStrings.Create(AHandle: HWND; TheOwner: TWinControl);
|
||||||
begin
|
begin
|
||||||
inherited Create(AHandle, TheOwner);
|
inherited Create(AHandle, TheOwner);
|
||||||
fHandle:=AHandle;
|
fHandle:=AHandle;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TWin32RichMemoStrings.SetUpdateState(Updating: Boolean);
|
||||||
|
begin
|
||||||
|
fUpd:=Updating;
|
||||||
|
inherited SetUpdateState(Updating);
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TWin32RichMemoStringsW }
|
||||||
|
|
||||||
function TWin32RichMemoStringsW.GetTextStr: string;
|
function TWin32RichMemoStringsW.GetTextStr: string;
|
||||||
var
|
var
|
||||||
p : GETTEXTLENGTHEX;
|
p : GETTEXTLENGTHEX;
|
||||||
@ -309,12 +329,6 @@ end;
|
|||||||
|
|
||||||
{ TWin32RichMemoStringsA }
|
{ TWin32RichMemoStringsA }
|
||||||
|
|
||||||
constructor TWin32RichMemoStringsA.Create(AHandle: HWND; TheOwner: TWinControl);
|
|
||||||
begin
|
|
||||||
inherited Create(AHandle, TheOwner);
|
|
||||||
fHandle:=AHandle;
|
|
||||||
end;
|
|
||||||
|
|
||||||
function TWin32RichMemoStringsA.GetTextStr: string;
|
function TWin32RichMemoStringsA.GetTextStr: string;
|
||||||
var
|
var
|
||||||
p : GETTEXTLENGTHEX;
|
p : GETTEXTLENGTHEX;
|
||||||
@ -470,11 +484,11 @@ begin
|
|||||||
|
|
||||||
NeedLock := (OrigStart <> TextStart) or (OrigLen <> TextLen);
|
NeedLock := (OrigStart <> TextStart) or (OrigLen <> TextLen);
|
||||||
if NeedLock then begin
|
if NeedLock then begin
|
||||||
LockRedraw(AWinControl.Handle);
|
LockRedraw( TCustomRichMemo(AWinControl), AWinControl.Handle);
|
||||||
RichEditManager.SetSelection(AWinControl.Handle, TextStart, TextLen);
|
RichEditManager.SetSelection(AWinControl.Handle, TextStart, TextLen);
|
||||||
RichEditManager.SetSelectedTextStyle(AWinControl.Handle, Params );
|
RichEditManager.SetSelectedTextStyle(AWinControl.Handle, Params );
|
||||||
RichEditManager.SetSelection(AWinControl.Handle, OrigStart, OrigLen);
|
RichEditManager.SetSelection(AWinControl.Handle, OrigStart, OrigLen);
|
||||||
UnlockRedraw(AWinControl.Handle);
|
UnlockRedraw( TCustomRichMemo(AWinControl), AWinControl.Handle);
|
||||||
end else
|
end else
|
||||||
RichEditManager.SetSelectedTextStyle(AWinControl.Handle, Params);
|
RichEditManager.SetSelectedTextStyle(AWinControl.Handle, Params);
|
||||||
|
|
||||||
@ -500,15 +514,15 @@ begin
|
|||||||
|
|
||||||
NeedLock := (OrigStart <> TextStart);
|
NeedLock := (OrigStart <> TextStart);
|
||||||
if NeedLock then begin
|
if NeedLock then begin
|
||||||
LockRedraw(AWinControl.Handle);
|
LockRedraw(TCustomRichMemo(AWinControl), AWinControl.Handle);
|
||||||
RichEditManager.SetSelection(AWinControl.Handle, TextStart, 1);
|
RichEditManager.SetSelection(AWinControl.Handle, TextStart, 1);
|
||||||
Result := RichEditManager.GetSelectedTextStyle(AWinControl.Handle, Params );
|
Result := RichEditManager.GetSelectedTextStyle(AWinControl.Handle, Params );
|
||||||
RichEditManager.SetSelection(AWinControl.Handle, OrigStart, OrigLen);
|
RichEditManager.SetSelection(AWinControl.Handle, OrigStart, OrigLen);
|
||||||
UnlockRedraw(AWinControl.Handle, false);
|
UnlockRedraw(TCustomRichMemo(AWinControl), AWinControl.Handle, false);
|
||||||
end else begin
|
end else begin
|
||||||
LockRedraw(AWinControl.Handle);
|
LockRedraw(TCustomRichMemo(AWinControl), AWinControl.Handle);
|
||||||
Result := RichEditManager.GetSelectedTextStyle(AWinControl.Handle, Params);
|
Result := RichEditManager.GetSelectedTextStyle(AWinControl.Handle, Params);
|
||||||
UnlockRedraw(AWinControl.Handle, false);
|
UnlockRedraw(TCustomRichMemo(AWinControl), AWinControl.Handle, false);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
RichEditManager.SetEventMask(AWinControl.Handle,eventmask);
|
RichEditManager.SetEventMask(AWinControl.Handle,eventmask);
|
||||||
@ -549,24 +563,16 @@ begin
|
|||||||
eventmask := RichEditManager.SetEventMask(AWinControl.Handle, 0);
|
eventmask := RichEditManager.SetEventMask(AWinControl.Handle, 0);
|
||||||
|
|
||||||
RichEditManager.GetSelection(AWinControl.Handle, OrigStart, OrigLen);
|
RichEditManager.GetSelection(AWinControl.Handle, OrigStart, OrigLen);
|
||||||
LockRedraw(AWinControl.Handle);
|
LockRedraw(TCustomRichMemo(AWinControl), AWinControl.Handle);
|
||||||
InitScrollInfo(hInfo);
|
|
||||||
InitScrollInfo(vInfo);
|
|
||||||
hVisible:=GetScrollbarVisible(AWinControl.Handle, SB_Horz);
|
|
||||||
vVisible:=GetScrollbarVisible(AWinControl.Handle, SB_Vert);
|
|
||||||
GetScrollInfo(AWinControl.Handle, SB_Horz, hInfo);
|
|
||||||
GetScrollInfo(AWinControl.Handle, SB_Vert, vInfo);
|
|
||||||
|
|
||||||
RichEditManager.SetSelection(AWinControl.Handle, TextStart, 1);
|
RichEditManager.SetSelection(AWinControl.Handle, TextStart, 1);
|
||||||
try
|
try
|
||||||
Result := RichEditManager.GetStyleRange(AWinControl.Handle, TextStart, RangeStart, RangeLen);
|
Result := RichEditManager.GetStyleRange(AWinControl.Handle, TextStart, RangeStart, RangeLen);
|
||||||
except
|
except
|
||||||
end;
|
end;
|
||||||
|
|
||||||
if hVisible then SetScrollInfo(AWinControl.Handle, SB_Horz, hInfo, false);
|
|
||||||
if vVisible then SetScrollInfo(AWinControl.Handle, SB_Vert, vInfo, false);
|
|
||||||
RichEditManager.SetSelection(AWinControl.Handle, OrigStart, OrigLen);
|
RichEditManager.SetSelection(AWinControl.Handle, OrigStart, OrigLen);
|
||||||
UnlockRedraw(AWinControl.Handle, false);
|
UnlockRedraw(TCustomRichMemo(AWinControl), AWinControl.Handle, false);
|
||||||
|
|
||||||
RichEditManager.SetEventMask(AWinControl.Handle, eventmask);
|
RichEditManager.SetEventMask(AWinControl.Handle, eventmask);
|
||||||
end;
|
end;
|
||||||
|
Reference in New Issue
Block a user