FAQ VCL
Компоненты\Edit

:: Меню ::
:: На главную ::
:: FAQ ::
:: Заметки ::
:: Практика ::
:: Win API ::
:: Проекты ::
:: Скачать ::
:: Секреты ::
:: Ссылки ::

:: Сервис ::
:: Написать ::

:: MVP ::

:: RSS ::

Яндекс.Метрика

Как сделать, чтобы Edit воспринимал одни цифры и DecimalSeparator?

// Chr(VK_BACK) нужен для того, чтобы работала
// клавиша Backspace. Уберите Chr(VK_BACK), и
// удалять символы можно будет только клавишей Delete.

// Способ первый
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
   if (GetAsyncKeyState(VK_CONTROL) shr 16) and 1 <> 1 then
      if not(Key in ['0'..'9', DecimalSeparator, Chr(VK_BACK)]) then
         Key := #0;
end;

// Способ второй
type
  TEdit = class(Vcl.StdCtrls.TEdit)
  protected
    procedure KeyPress(var Key: Char); override;
  end;

implementation

procedure TEdit.KeyPress(var Key: Char);
begin
   if (GetAsyncKeyState(VK_CONTROL) shr 16) and 1 <> 1 then
   begin
      if not (Key in ['0'..'9', FormatSettings.DecimalSeparator, Chr(VK_BACK)]) then
         Key := #0;
   end
   else
      inherited;
end;


Как заставить TEdit работать не только в режиме вставки символов, но и в режиме замены?

// Элемент управления Windows TEdit не имеет режима замены.
// Однако этот режим можно эмулировать установив свойство SelLength TEdit'а в 1
// при обработке события KeyPress. Это заставит его перезаписывать символ в
// текущей позиции курсора.
// Режим вставка/замена переключается клавишей "Insert".
// Если сделать это для TMemo, то клавиши
// Enter и Backspace будут работать некорректно.

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    procedure Edit1KeyPress(Sender: TObject; var Key: Char);
    procedure Edit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  private
    { Private declarations }
    InsertOn: boolean;
  public
    { Public declarations }
  end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
   if ( ( Edit1.SelLength = 0 ) and ( not InsertOn ) ) then
      Edit1.SelLength := 1;
end;

procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
   if ( key = VK_INSERT ) and ( Shift = [] ) then
      InsertOn := not InsertOn;
end;


Как ограничить длинну текста, вводимого в TEdit, чтобы ширина текста не превышала ширину TEdit'а?

// Перхватываем событие KeyPress TEdit'а и измеряем ширину уже введенного текста
// и ширину нового символа. Если ширина больше чем клиентская область TEdit'а,
// новый символ отбрасывается.

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var
  Rect : TRect;
  bm : TBitmap;
begin
   if ( ( Ord( Key ) <> VK_TAB ) and ( Ord( Key ) <> VK_RETURN ) and
      ( Ord( Key ) <> VK_LEFT ) and ( Ord( Key ) <> VK_BACK ) ) then
   begin
      Windows.GetClientRect( Edit1.Handle, Rect );
      bm := TBitmap.Create;
      bm.Width := Rect.Right;
      bm.Height := Rect.Bottom;
      bm.Canvas.Font := Edit1.Font;
      if bm.Canvas.TextWidth( Edit1.Text + Key + ' ' ) > Rect.Right then
         Key := #0;
      bm.Free;
   end;
end;


Как ввести текст в "чужой" Edit?

procedure TForm1.Button1Click(Sender: TObject);
begin
   SendMessage( EditHandle, WM_SETTEXT,
                0, LParam( PChar( 'MyText' ) ) );
end;


Как поставить выделение надписи в зависимости от введенного текста?

procedure TForm1.Edit1Change(Sender: TObject);
begin
   if Edit1.Text = 'Delphi' then
   begin
      Edit1.SelStart := 0;
      Edit1.SelLength := Length( Edit1.Text );
   end;
end;


Как в TEdit сделать выравнивание по правому краю?

type  
  TNumEdit = class(TEdit)
  public
    procedure CreateParams(var Params: TCreateParams); override;
  end;

procedure TNumEdit.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  Params.Style := Params.Style or ES_RIGHT;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  NumEdit: TNumEdit;
begin
   NumEdit := TNumEdit.Create( Self );
   NumEdit.Parent := Form1;
   NumEdit.Show;
end;


Как перехватить клавишу табуляции (Tab) в TEdit?

type
  TForm1 = class(TForm)
    Edit1: TEdit;
  private
    { Private declarations }
    procedure CMDialogKey( Var Msg: TWMKey ); message CM_DIALOGKEY;
  public
    { Public declarations }
  end;

procedure TForm1.CMDialogKey(var Msg: TWMKey);
begin
   if ( ActiveControl is TEdit ) and ( Msg.Charcode = VK_TAB ) then
      ShowMessage( 'Нажата клавиша TAB' );
   inherited;
end;


Как убрать звук при нажатии Enter в TEdit?

uses
  {...,} ShellAPI;

// Выключить
SystemParametersInfo( SPI_SETBEEP, 0, nil, 0 );
// SystemParametersInfo( SPI_SETBEEP, 0, nil, SPIF_UPDATEINIFILE );

// Включить
SystemParametersInfo( SPI_SETBEEP, 1, nil, 0 );
// SystemParametersInfo( SPI_SETBEEP, 1, nil, SPIF_UPDATEINIFILE );


Как перевести в верхний регистр первый вводимый символ?

// Способ первый
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
   if Edit1.SelStart = 0 then
      Key := UpCase( Key );
end;

// Способ второй
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
   with Sender as TEdit do
      if ( SelStart = 0 ) or ( Text[SelStart] = ' ' ) or
         ( SelLength = Length( Text ) ) or ( Text = ' ' ) then
         if Key in ['a'..'z'] then
             Key := UpCase( Key );
end;


Как в TEdit преобразовать первую букву каждого слова к верхнему регистру?

procedure TForm1.Edit1Change(Sender: TObject);
var
  OldChange: TNotifyEvent;
  OldStart: integer;
begin
   with ( Sender as TEdit ) do
   begin
      OldChange := OnChange;
      OnChange := nil;
      OldStart := SelStart;
      if ( ( SelStart > 0 ) and ( Text[SelStart - 1] = ' ' ) ) or ( SelStart = 1 ) then
      begin
         SelStart := SelStart - 1;
         SelLength := 1;
         SelText := AnsiUpperCase( SelText );
      end;
      OnChange := OldChange;
      SelStart := OldStart;
   end;
end;

При использовании материала - ссылка на сайт обязательна