Lazarus

Programming => General => Topic started by: Never on September 13, 2014, 11:49:57 am

Title: How can I disable screen update
Post by: Never on September 13, 2014, 11:49:57 am
is there a cross platform function to use and achieve the same result?

Code: [Select]
SendMessage(Handle, WM_SETREDRAW, WPARAM(False), 0);
  try
    // Create  controls
  finally
    // enable updates
    SendMessage(Handle, WM_SETREDRAW, WPARAM(True), 0);
    // Invalidate;  Might  required
  end;

Code: [Select]
.Canvas.Lock; is the way or something else?
Title: Re: How can I disable screen update
Post by: Mike.Cornflake on September 13, 2014, 12:26:37 pm
I'm using TForm.FormIsUpdating/TForm.BeginFormUpdate/TForm.EndFormUpdate

Code: [Select]
  If Not FormIsUpdating Then
    BeginFormUpdate;     

Code: [Select]
    If FormIsUpdating Then
      EndFormUpdate;   

There's minor issues if you're creating your form dynamically.  Dynamic TToolbars in particular don't like being populated during a FormUpdate. I just needed to be careful with positioning my BeginFormUpdate/EndFormUpdate wraps...
Title: Re: How can I disable screen update
Post by: Never on September 13, 2014, 01:38:04 pm
Hello @Mike.Cornflake thank you for your answer
Quote
I'm using TForm.FormIsUpdating/TForm.BeginFormUpdate/TForm.EndFormUpdate

How? TForm does not provide these
if i create a form with the designer  ex[TfrmTest]
 TfrmTest.FormIsUpdating/TfrmTest.BeginFormUpdate/TfrmTest.EndFormUpdate
 these are provided only for the specific form

if  [var x:TForm; x:=TForm.create()] the above are not available
Title: Re: How can I disable screen update
Post by: Mike.Cornflake on September 13, 2014, 01:56:34 pm
Oh, I see.  They're declared protected in TCustomForm, and unfortunately they're not declared virtual.  I've only ever used them inside a form.

If you want to use them from outside your TForm code, then a simple way could be:
Code: [Select]
  TForm1 = class(TForm)
  private
    { private declarations }
  public
    Procedure MyBeginFormUpdate;
    Procedure MyEndFormUpdate;
    Function MyFormIsUpdating: Boolean;
  end;

implementation

procedure TForm1.MyBeginFormUpdate;
begin
  BeginFormUpdate;
end;

procedure TForm1.MyEndFormUpdate;
begin
  EndFormUpdate;
end;

function TForm1.MyFormIsUpdating: Boolean;
begin
  Result := FormIsUpdating;
end;

And then just call the MyXXXX routines from the outside...

(There's probably a better way to widen the scope of the original calls - if so, hopefully others will chime in :) )

UPDATE: Been thinking about this.  Having them declared Protected was a wise design decision.  Essentially what the LCL developers are saying is that only a Form should be responsible for it's own controls/drawing, and that really you should be moving all the code that dynamically creates controls (assuming that's what you're doing) to inside the Form itself.  In light of this, the method I've proposed above, while it will work, should be considered a hack.
Title: Re: How can I disable screen update
Post by: Never on September 13, 2014, 02:17:23 pm
i think i will go for
Quote
.Canvas.Lock;
Title: Re: How can I disable screen update
Post by: donaldklopper on January 19, 2022, 06:20:44 am
A couple of years later... I'm on Linux Mint with Lazarus 2.0.6.

SLOW UPDATES: Not locking the form  for update delivers about the same performance as Canvas.Lock and Canvas.Unlock. It's slow.

FASTER UPDATES: Using BeginFormUpdate and EndFormUpdate is SEVERAL ORDERS OF MAGNITUDE faster.

I have a simple little visual CPU killer implemented in a timer event like this:

When the FBounceObjectList size in my example is hundreds of items long the performance difference is extreme.

Code: Pascal  [Select][+][-]
  1.   BeginFormUpdate;
  2.   //Canvas.Lock;
  3.   for i := 0 to FBounceObjectList.Count-1 do
  4.   begin
  5.     TBounceObj(FBounceObjectList[i]).move;
  6.   end;
  7.   //Canvas.Unlock;
  8.   EndFormUpdate;
  9.  
TinyPortal © 2005-2018