[Lazarus] typecast to an empty local class

Mattias Gaertner nc-gaertnma at netcologne.de
Sun Apr 25 17:42:23 CEST 2010


On Fri, 23 Apr 2010 20:06:29 +0200
Hans-Peter Diettrich <DrDiettrich1 at aol.com> wrote:

> Mattias Gaertner schrieb:
> 
> >> Maybe I'm wrong (didn't look into), but seem that delphi/kylix triggers 
> >> form.OnResize when everything is resized inside form (children), or it 
> >> triggers twice : at form resize, and then after all children resized.
> > 
> > Don't forget that Delphi has a simple top down autosize algorithm. It
> > does not even support a theme independent groupbox with buttons.
> 
> Why requires theme support to break that stable processing?

It is not that "stable". It is simple and limited to simple layouts.

Maybe you don't know how the VCL resizes:
As soon as a size or position changes the layout must recomputed. This
is done by resizing the control itself and telling the parent to
realign its children. This can trigger other controls and so forth, a
random walk until nothing changes anymore. A control can
resize/position several times this way. And every time the new bounds
are sent to the winapi.

For theme support you need "bottom up" too:
For example a Control with Align=alBottom is anchored to the left and
right, so its width is defined by its Parent. When 
Parent.AutoSize is true it should resize itself according to its
children. Now you have a circle dependency. 
The bottom up part is done in the LCL with the CalculatePreferredSize.
This was already done with the old autosizing code. It also used the
random walk approach.

The random walk has (at least) three disadvantages:
1. it is random. A control can resize several times. This is especially
true for the LCL, because it has more autosize properties than
the VCL, has additionally bottom up, runs on different widgetsets
with different order of WMSize messages. This makes this "stable"
algorithm go nuts and causes a lot of flickering.
2. it is not sufficient for bottom up. Only checking the parent and
sibling is not enough if you have a two level dependency. For example a
label in a groupbox in a notebook.
3. It does not work well with some special phases. For example
when a form is set to visible, all handles must be created and turned
visible. Creating a handle means applying all properties to the handle -
a lot of changes. This starts the random walk many times - more
flickering.

 
> I'd accept a two-pass resize, with the determination of the min/max 
> sizes in the first pass, and the distribution of available space in the 
> second pass.
> 
> How does the new autosize work?

There were several changes:
- the update is now done for the whole form, allowing arbitrary
  nesting levels. With the random walk approach this would cause more
  flickering.
- the autosize now uses a two-pass resize with the determination of the
  preferred sizes in the first pass, and the distribution of available
  space in the second pass. Because of OnResizes, overrides and non
  linear dependencies this might need some repeats.
- the changes are not immediately sent to the widgetset, but collected
  and sent after all the computation.
- to further reduce flickering the visible flags are delayed until the
  handles are created and all bounds have been computed.
- you can now delay autosizing and visibility for the whole form. This
  is important for docking were you have to work with arbitrary forms. 
- as side effect many workarounds of the old autosize code to reduce the
  random walk problems are no longer needed and were removed.
- with the removal of the workarounds it is now possible to think about
  custom layout managers that can be written without being an LCL
  expert.


Mattias




More information about the Lazarus mailing list