15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


Как автоматически расширить TEdit

Следующий компонент автоматически подстраивается под текст, вводимый в него:

unit ExpandingEdit;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TExpandingEdit = class(TEdit)
  private
    FCanvas: TControlCanvas;
  protected
    procedure Change; override;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  end;

procedure Register;

implementation

constructor TExpandingEdit.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FCanvas := TControlCanvas.Create;
  FCanvas.Control := Self;
end;

destructor TExpandingEdit.Destroy;
begin
  FCanvas.Free;
  inherited Destroy;
end;

procedure TExpandingEdit.Change;
const
  EditMargin = 8;
var
  W: Integer;
begin
  inherited Change;
  if not HandleAllocated then Exit;
  FCanvas.Font := Font;
  W := FCanvas.TextWidth(Text) + (2 * EditMargin);
  if (Width < W) then Width := W;
end;

procedure Register;
begin
  RegisterComponents('Samples', [TExpandingEdit]);
end;

end.