Zitat von cobines <[email protected]>:

2010/2/12 Mattias Gärtner <[email protected]>:
Zitat von cobines <[email protected]>:

2010/2/12 Paul Ishenin <[email protected]>:

Bevels reduce ClientRect by BevelSize value.

I thought so that they're supposed to do that, but if I put a TPanel
on a form with a outer bevel set to Lowered , the panel's ClientHeight
= Height.

Bevel reduces the AdjustClientRect, which is ClientRect minus the Bevels.
ClientWidth is the client area width from the widgetset. The bevels are
custom drawn by TPanel and therefore not in the ClientWidth of TPanel.


Ok, that clears up why ClientWidth=Width. But why the bevels are
included in ClientRect? I think child controls are not supposed to
occupy the bevels' space. Can the ClientWidth, ClientHeight from the
widgetset be adjusted to include bevels?

The widgetset values should only include the widgetset things.

Maybe you want new properties AdjustedClientWidth, AdjustedClientHeight. Changing ClientWidth/ClientHeight would be a big change and some third party controls rely on that. Note: The LCL ClientWidth/Height are not compatible to the VCL, so Delphi compatibility is irrelevant here.


For example if I want to check how much space is in the Panel for a
control, I do:

SpaceAvailable := Panel.ClientHeight;
if SpaceAvailable >= 100 then
  ShowMyControl_of_size_100_or_more (because I'm sure it will fit)
else
  HideMyControl... (don't want to show it partially)

(The Panel size is controlled by the user.)

However, if TPanel contains bevels then the space available for the
child control is ClientHeight - BevelSize * 2. I have to take it into
account when calculating space. Otherwise, either my control will not
be fully shown, or it will be drawn over the bevels. Is there some
other property I can check that will include all borders, bevels,
etc.?

r:=ClientRect;
AdjustClientRect(r);
SpaceAvailable:=r.Right-r.Left;

Did you know, that you can anchor controls:
MyControl.AnchorParallel(akLeft,0,MyControl.Parent);
MyControl.AnchorParallel(akRight,0,MyControl.Parent);

This will expand MyControl to the full client area width, excluding the bevels.


BevelSize is used to calculate the ClientRect in
TCustomPanel.AdjustClientRect.

Yes, that function recalculates the rectangle correctly, but it seems
it's somehow not propagated to the auto size algorithm or to the
stored client rectangle.

The autosize algorithm uses AdjustClientRect.

It still puts child controls over the bevels. I don't know, maybe I'm
confusing it with aligning child controls. It is supposed to either
make the child control smaller so that it doesn't overwrite the
bevels, or make the TPanel bigger so that the child control fits in
whole and there's still space left for the bevels.

It works here on a simple example. Child controls are not on the bevels but within the bevels with autosize=true on gtk2.


Please add an example to demonstrate the problem.

I have found an already existing bug on this with a good example. But
it said the problem is only for BevelWidth > 1 and only for GTK, GTK2.
I confirmed this issue also on QT and with any bevel width. I'll check
later on Win32.

Unfortunately Mantis died on me while I was reading it so I didn't get
the bug number. Will try later.

Thanks.

Mattias



--
_______________________________________________
Lazarus mailing list
[email protected]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus

Reply via email to