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

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

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

:: MVP ::

:: RSS ::

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

Как запретить вставку текста (Ctrl + V) в TEdit?

uses
  {...,} ClipBrd;

function NewEditProc(MyWnd: HWND; uMsg: UINT; MyWParam: WPARAM; MyLParam: LPARAM): Integer; stdcall;
var
  s: string;
  i: Integer;
begin
   if (uMsg = WM_PASTE) and Clipboard.HasFormat(CF_TEXT) then
   begin
      s := Clipboard.AsText;

      if StrLen(PChar(s)) > 10 then // Запрет на вставку строк
         uMsg := 0;                 // длиной более 10 символов
  end;
  Result := CallWindowProc(Pointer(GetWindowLong(MyWnd, GWL_USERDATA)),
     MyWnd, uMsg, MyWParam, MyLParam);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
   SetWindowLong(Edit1.Handle, GWL_USERDATA,
      SetWindowLong(Edit1.Handle, GWL_WNDPROC, LPARAM(@NewEditProc)));
end;


Как подавить реакцию TEdit на горячие клавиши (Ctrl + C, Ctrl + V, Ctrl + X, Ctrl + Z и т.п.)?

// Способ первый
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
   if Key in [#3 {Ctrl + C}, #22 {Ctrl + V}, #24 {Ctrl + X}, #26 {Ctrl + Z}] then
      Key := #0;
end;

// Способ второй
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
   // Выполняя проверку Key in [^A..^Z] можно отловить нажатие
   // буквенных клавиш совместно с модификатором Control
   if Key in [^C {Ctrl + C}, ^V {Ctrl + V}, ^X {Ctrl + X}, ^Z {Ctrl + Z}] then
      Key := #0;
end;


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

type
  TEdit = class({Vcl.}StdCtrls.TEdit)
    procedure EMSetSel(var Msg: TMessage); message EM_SETSEL;
  end;

implementation

procedure TEdit.EMSetSel(var Msg: TMessage);
begin
   // Начальная позиция выделения
   // (в символах)
   Msg.WParam := 2;
   // Конечная позиция выделения
   // (в символах)
   Msg.LParam := 3;
   inherited;
end;

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