[Lazarus] TMemo flicker
Michael Van Canneyt
michael at freepascal.org
Tue Apr 30 11:52:59 CEST 2013
On Tue, 30 Apr 2013, José Mejuto wrote:
> El 30/04/2013 10:31, Michael Van Canneyt escribió:
>
>>> Your solution of course is mutch faster but I thought seeing the
>>> progress is important for Jürgen.
>> In that case the beginupdate/endupdate is a total waste of CPU.
>>
>
> Hello,
>
> The problem is that the behavior changes with the use of begin/end update, at
> least on Windows platform. Run attached code to test. Just create a form and
> add a button and a Memo and link the button OnClick with this code (better
> visible with a quite big Memo):
>
> -------------------------------
>
> procedure TForm1.Button1Click(Sender: TObject);
> const
> TestMode=3; //CHANGE to 1..3 to run different tests
> var
> i: integer;
> begin
> for i := 1 to 40 do begin
> Memo1.Lines.add('Some lines at the beginning to watch the up/down flicker
> effect.');
> end;
> if TestMode=1 then begin
> for i := 1 to 1000 do begin
> Memo1.Lines[Memo1.lines.Count-1]:='#### '+IntToStr(i);
> end;
> end else if TestMode=2 then begin
> for i := 1 to 1000 do begin
> Memo1.Lines.BeginUpdate;
> Memo1.Lines[Memo1.lines.Count-1]:='#### '+IntToStr(i);
> Memo1.Lines.EndUpdate;
> end;
> end else if TestMode=3 then begin
> for i := 1 to 1000 do begin
> Memo1.Lines.BeginUpdate;
> Memo1.Lines[Memo1.lines.Count-1]:='#### '+IntToStr(i);
> Memo1.Lines.EndUpdate;
> Application.ProcessMessages;
> end;
> end;
> end;
> --------------------------------
>
> If Begin/End update is being used the vertical scroll bar position is not
> updated, I do not know if this is expected :-?
This i cannot say.
What I can say is that, given the purpose of beginupdate/endupdate,
in the above code, using beginupdate/endupdate is totally pointless.
Not to mention that you should always use try/finally with beginupdate/endupdate
BeginUpdate;
try
// Do your thing
finally
EndUpdate;
end;
Michael.
More information about the Lazarus
mailing list