Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / lazarus / 2018-09

Custom control with stepwise size adjustment

5 messages · 3 people · –

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

gabor

Hi.
How to properly create a control with step-size adjustment? I mean a control whose width is a multiple of, eg. 16 (16,32,48...). In delphi, I simply override TCustomControl.SetBounds method.

procedure TMyControl.SetBounds(aTop, aLeft, aWidth, aHeight: Integer);
begin
   aWidth := (aWidth div 16) * 16;
   if aWidth = 0 then
     aWidth := 16;
   aHeight := (aHeight div 16) * 16;
   if aHeight = 0 then
     aHeight := 16;
   inherited SetBounds(aTop, aLeft, aWidth, aHeight);
end;

Unfortunately, the same does not work well with LCL. Especially in connection with Anchors or in form designer.
So how to deal with it?

Regards, Michał.

Reply by email

Vojtěch Čihák

Try set Constraints - set MinHeight=MaxHeight=your calculated height, and the same for Width. But it will maybe fool Lazarus autosizing mechanism.  
V.
______________________________________________________________

Show quoted text 5 lines
Od: "gabor via Lazarus" Komu: Datum: 19.09.2018 14:29 Předmět: [Lazarus] Custom control with stepwise size adjustment

Hi.
How to properly create a control with step-size adjustment? I mean a control whose width is a multiple of, eg. 16 (16,32,48...). In delphi, I simply override TCustomControl.SetBounds method.

 procedure TMyControl.SetBounds(aTop, aLeft, aWidth, aHeight: Integer);
 begin
   aWidth := (aWidth div 16) * 16;
   if aWidth = 0 then
     aWidth := 16;
   aHeight := (aHeight div 16) * 16;
   if aHeight = 0 then
     aHeight := 16;
   inherited SetBounds(aTop, aLeft, aWidth, aHeight);
 end;

Unfortunately, the same does not work well with LCL. Especially in connection with Anchors or in form designer.
So how to deal with it?

Regards, Michał.

Reply by email

gabor
to Vojtěch Čihák

Thanks for the hint but I found a solution. I've moved code to ChangeBounds method and it looks like it works correctly with Anchors. There is still a problem with form designer, but I can live with it - I simply use object inspector instead of using a mouse.

Regards, Michał.

W dniu 2018-09-19 o 15:17, Vojtěch Čihák via Lazarus pisze:

Show quoted text 42 lines
Try set Constraints - set MinHeight=MaxHeight=your calculated height, and the same for Width. But it will maybe fool Lazarus autosizing mechanism. V. ______________________________________________________________ > Od: "gabor via Lazarus" > Komu: > Datum: 19.09.2018 14:29 > Předmět: [Lazarus] Custom control with stepwise size adjustment > Hi. How to properly create a control with step-size adjustment? I mean a control whose width is a multiple of, eg. 16 (16,32,48...). In delphi, I simply override TCustomControl.SetBounds method. procedure TMyControl.SetBounds(aTop, aLeft, aWidth, aHeight: Integer); begin   aWidth := (aWidth div 16) * 16;   if aWidth = 0 then     aWidth := 16;   aHeight := (aHeight div 16) * 16;   if aHeight = 0 then     aHeight := 16;   inherited SetBounds(aTop, aLeft, aWidth, aHeight); end; Unfortunately, the same does not work well with LCL. Especially in connection with Anchors or in form designer. So how to deal with it? Regards, Michał. -- _______________________________________________ Lazarus mailing list https://lists.lazarus-ide.org/listinfo/lazarus

Reply by email

gabor
to Juha Manninen

W dniu 2018-09-20 o 19:20, Juha Manninen via Lazarus pisze:

You can override procedures CalculatePreferredSize and GetPreferredSize, defined in TControl.

I tried. Unfortunately, it does not work with Anchors or Align - preferred values are ignored. But size correction in ChangeBounds actually works.

TWinControl has more virtual methods that you should check out.

I noticed. The AutoSize mechanism is bit complicated.

Regards, Michał

Reply by email