[Lazarus] Autosize behaviour
Michael Van Canneyt
michael at freepascal.org
Tue Apr 6 10:48:58 CEST 2010
On Tue, 6 Apr 2010, Hans-Peter Diettrich wrote:
> Michael Van Canneyt schrieb:
>
>>>> I have been thinking about layout managers. I think that this should be
>>>> an add-on
>>>> to the currently existing layouting (to preserve delphi compatibility): I
>>>> imagine a component that one drops on a form. One sets the 'target'
>>>> control (control whose children should be managed) and some properties.
>>>
>>> I imagine a Layout property for TWinControls, or an intermediate layer,
>>> that is initialized to the Delphi compatible manager. That property then
>>> can be assigned any other layout manager.
>>
>> That is the same as what I am saying, only the arrow points in the opposite
>> direction. I want to avoid this extra TWinControl property.
>
> I wonder how you want LCL code to use a dropped layout component. When no
> predefined property exists, every TWinControl had to be searched for an
> according component, whenever a layout method or property shall be accessed.
I would use a mechanism similar to the datalink. As soon as you tell the
layout manager to manage a certain control, a hook is installed in the
control.
>
> With a dedicated LayoutManager property, all anchor-docking related stuff
> could be moved from TWinControl into the AnchoredLayoutManager, and
> DockManager could be replaced (or merged with) the LayoutManager. In further
> steps the DockClient list could be removed, the Controls list can be used
> instead. Delphi compatibility can be maintained by delegation to the still
> existing elements.
The reason I don't want to introduce the layoutmanager property is that it
simply does not make sense for all TWinControls. a TEdit does not need a
layoutmanager, only the parent of the TEdit needs one.
>>> The layout should take into account the standard TControl properties,
>>> including alignment, constraints and anchors. It also should use the
>>> layout managers of child controls, for forward/backward transfer of
>>> autosize information.
>>
>> This is *exactly* what I want to avoid.
>>
>> - Either one uses the 'ordinary' delphi properties, and only those.
>
> This shall be the default, when no dedicated manager is specified for a
> TWinControl.
>
>> - Or one uses layouters.
>
> When a special manager is installed for a TWinControl.
>
>> But not a mixture of both, which will be a source of implementation/usage
>> problems and confusion.
>
> What should be complicated, when the Delphi layout manager is one of multiple
> available managers? How do you want to implement different layout management
> for parts of a form?
Simply drop 2 layouters, and point them to the right parts of the form.
>
> IMO the autosize woes only result from the overcomplicated handling of
> multiple layout models at the same time (Delphi compatible and Lazarus anchor
> "docking" management).
>
>> Keep it simple.
>
> I *only* want to simplify everything. When every TWinControl now can have an
> DockManager, it will have an LayoutManager after the redesign. That manager
> will allow to manage the layout of every TWinControl independently, and the
> extra code for resizing DockSites can be removed.
>
> The default manager will be the Delphi compatible one, that can continue to
> reside in TWinControl, when no other manager has been installed; or it can be
> moved into the TLayoutManager base class, or into a descendant of that class.
>
>> Once this split works correctly, you can always later try to create a
>> TLayout descendent which tries to mimic Delphi behaviour, taking into
>> account all TControl/TWincontrol properties; Then remove all old code
>> and insert the new layouter.
>>
>> In my opinion, this approach guarantees has a bigger chance of success than
>> immediatly trying to do everything at once...
>
> I don't understand what you want to separate - but perhaps we mean the same
> thing?
I think we mean the same thing, it's just some details that are different... :-)
Michael.
More information about the Lazarus
mailing list