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:
skalogryz
2015-03-25 04:19:12 +00:00
parent 671e0af7b1
commit 8f4b0570a8

View File

@ -38,24 +38,27 @@ uses
type
{ TWin32RichMemoStringsW }
TWin32RichMemoStringsW = class(TWin32MemoStrings)
TWin32RichMemoStrings = class(TWin32MemoStrings)
protected
fUpd : Boolean;
fHandle : HWND;
function GetTextStr: string; override;
procedure SetUpdateState(Updating: Boolean); override;
public
constructor Create(AHandle: HWND; TheOwner: TWinControl);
end;
{ TWin32RichMemoStringsW }
TWin32RichMemoStringsW = class(TWin32RichMemoStrings)
protected
function GetTextStr: string; override;
end;
{ TWin32RichMemoStringsA }
TWin32RichMemoStringsA = class(TWin32MemoStrings)
TWin32RichMemoStringsA = class(TWin32RichMemoStrings)
protected
fHandle : HWND;
function GetTextStr: string; override;
public
constructor Create(AHandle: HWND; TheOwner: TWinControl);
end;
{ TWin32WSCustomRichMemo }
@ -170,16 +173,25 @@ const
FORMAT_RENDER = 1;
FORMAT_ESTIMATE = 0;
procedure LockRedraw(AHandle: HWND);
procedure LockRedraw(rm: TCustomRichMemo; AHandle: THandle);
var
ln: TWin32RichMemoStrings;
begin
ln:=TWin32RichMemoStrings(rm.Lines);
if not Assigned(ln) or not ln.fUpd then
SendMessage(AHandle, WM_SETREDRAW, 0, 0);
end;
procedure UnlockRedraw(AHandle: HWND; NeedInvalidate: Boolean = true);
procedure UnlockRedraw(rm: TCustomRichMemo; AHandle: HWND; NeedInvalidate: Boolean = true);
var
ln: TWin32RichMemoStrings;
begin
ln:=TWin32RichMemoStrings(rm.Lines);
if not Assigned(ln) or not ln.fUpd then begin
SendMessage(AHandle, WM_SETREDRAW, 1, 0);
if NeedInvalidate then
Windows.InvalidateRect(AHandle, nil, true);
end;
end;
function RichEditNotifyProc(const AWinControl: TWinControl; Window: HWnd;
@ -276,14 +288,22 @@ begin
inherited Destroy;
end;
{ TWin32RichMemoStringsW }
{ TWin32RichMemoStrings }
constructor TWin32RichMemoStringsW.Create(AHandle: HWND; TheOwner: TWinControl);
constructor TWin32RichMemoStrings.Create(AHandle: HWND; TheOwner: TWinControl);
begin
inherited Create(AHandle, TheOwner);
fHandle:=AHandle;
end;
procedure TWin32RichMemoStrings.SetUpdateState(Updating: Boolean);
begin
fUpd:=Updating;
inherited SetUpdateState(Updating);
end;
{ TWin32RichMemoStringsW }
function TWin32RichMemoStringsW.GetTextStr: string;
var
p : GETTEXTLENGTHEX;
@ -309,12 +329,6 @@ end;
{ TWin32RichMemoStringsA }
constructor TWin32RichMemoStringsA.Create(AHandle: HWND; TheOwner: TWinControl);
begin
inherited Create(AHandle, TheOwner);
fHandle:=AHandle;
end;
function TWin32RichMemoStringsA.GetTextStr: string;
var
p : GETTEXTLENGTHEX;
@ -470,11 +484,11 @@ begin
NeedLock := (OrigStart <> TextStart) or (OrigLen <> TextLen);
if NeedLock then begin
LockRedraw(AWinControl.Handle);
LockRedraw( TCustomRichMemo(AWinControl), AWinControl.Handle);
RichEditManager.SetSelection(AWinControl.Handle, TextStart, TextLen);
RichEditManager.SetSelectedTextStyle(AWinControl.Handle, Params );
RichEditManager.SetSelection(AWinControl.Handle, OrigStart, OrigLen);
UnlockRedraw(AWinControl.Handle);
UnlockRedraw( TCustomRichMemo(AWinControl), AWinControl.Handle);
end else
RichEditManager.SetSelectedTextStyle(AWinControl.Handle, Params);
@ -500,15 +514,15 @@ begin
NeedLock := (OrigStart <> TextStart);
if NeedLock then begin
LockRedraw(AWinControl.Handle);
LockRedraw(TCustomRichMemo(AWinControl), AWinControl.Handle);
RichEditManager.SetSelection(AWinControl.Handle, TextStart, 1);
Result := RichEditManager.GetSelectedTextStyle(AWinControl.Handle, Params );
RichEditManager.SetSelection(AWinControl.Handle, OrigStart, OrigLen);
UnlockRedraw(AWinControl.Handle, false);
UnlockRedraw(TCustomRichMemo(AWinControl), AWinControl.Handle, false);
end else begin
LockRedraw(AWinControl.Handle);
LockRedraw(TCustomRichMemo(AWinControl), AWinControl.Handle);
Result := RichEditManager.GetSelectedTextStyle(AWinControl.Handle, Params);
UnlockRedraw(AWinControl.Handle, false);
UnlockRedraw(TCustomRichMemo(AWinControl), AWinControl.Handle, false);
end;
RichEditManager.SetEventMask(AWinControl.Handle,eventmask);
@ -549,13 +563,7 @@ begin
eventmask := RichEditManager.SetEventMask(AWinControl.Handle, 0);
RichEditManager.GetSelection(AWinControl.Handle, OrigStart, OrigLen);
LockRedraw(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);
LockRedraw(TCustomRichMemo(AWinControl), AWinControl.Handle);
RichEditManager.SetSelection(AWinControl.Handle, TextStart, 1);
try
@ -563,10 +571,8 @@ begin
except
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);
UnlockRedraw(AWinControl.Handle, false);
UnlockRedraw(TCustomRichMemo(AWinControl), AWinControl.Handle, false);
RichEditManager.SetEventMask(AWinControl.Handle, eventmask);
end;