How to define a minimum size for a component #79

Question
I have a component (derived from TGraphicControl) and the user should only be able to resize the component to a minimum size or higher. How do I have to implement the SetHeight and SetWidth procedures?

You can override the SetBounds method. Since this method is responsible for setting new coordinates and dimensions for the control. Here's an example:

TMyGraphicControl = class(TGraphicControl)
  public
    procedure SetBounds(ALeft: Integer; ATop: Integer; AWidth:
      Integer; AHeight: Integer); override;
  end;

const
  min_Widht = 20;
  min_Height = 20;

procedure TMyGraphicControl.SetBounds(ALeft: Integer; ATop: Integer;
  AWidth: Integer; AHeight: Integer);
begin
  if AWidth < min_Widht then
    AWidth := min_Widht;
  if AHeight < min_Height then
    AHeight := min_Height;
  inherited SetBounds(ALeft, ATop, AWidth, AHeight);
end;

You may also take a look at the CanResize method. It is called automatically when an attempt is made to resize the control, after any autosizing has occurred. You can override it and return false in the result, in case the new height or width is less than the minimum value.

type
  TMyGraphicControl = class(TGraphicControl)
  protected
    function CanResize(var NewWidth: Integer;
      var NewHeight: Integer): Boolean; override;
  end;

function TMyGraphicControl.CanResize(var NewWidth: Integer;
  var NewHeight: Integer): Boolean;
begin
  if not (csLoading in ComponentState) and ((NewWidth < min_Width)
  or (NewHeight < min_Height)) then
    Result := false
  else
    Result := inherited CanResize(NewWidth, NewHeight);
end;

Alternative Method

Montor suggests the following solution:

with MyControl.Constraints do
begin
  MaxHeight :=100;
  MaxWidth  :=100;
  MinHeight :=50;
  MinWidth  :=50;
end;
Original resource: The Delphi Pool
Author: Serge Gubenko
Added: 2009/08/12
Last updated: 2011/01/16