Как отключить копирование/вставку в TEdit

Я хотел бы предотвратить копирование, вырезание и вставку в моем TEdit. Как я могу это сделать?

Я попытался установить событие Key=NULL на KeyDown при нажатии CTRL+V на элементе управления, но это не сработало.


person Jonas    schedule 08.05.2009    source источник
comment
Вы пробовали событие OnKeyUp?   -  person stukelly    schedule 09.05.2009
comment
stackoverflow.com/questions/10158861/   -  person Escape Velocity    schedule 27.09.2016


Ответы (5)


Вам нужно запретить отправку сообщений WM_CUT, WM_COPY и WM_PASTE на ваш TEdit. Этот ответ описывает, как это сделать с помощью только Windows API. Для VCL может быть достаточно создать подкласс TEdit и изменить его свойство DefWndProc или переопределить его метод WndProc.

person Josh Kelley    schedule 08.05.2009

Назначьте это TEdit.OnKeyPress :

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
 if (Key=#22) or (Key=#3) then Key:=#0;   // 22 = [Ctrl+V] / 3 = [Ctrl+C]
end;
person Marus Nebunu    schedule 11.08.2014
comment
К сожалению, это не работает, когда пользователь щелкает правой кнопкой мыши и выбирает «Вставить». - person Escape Velocity; 27.09.2016

Я знаю, что это старый вопрос, но я добавлю то, что нашел. В оригинальном плакате почти было решение. Он отлично работает, если вы игнорируете вырезание/копирование/вставку в событии нажатия клавиши вместо события нажатия клавиши. т.е. (с++ строитель)

void __fastcall Form::OnKeyPress(TObject *Sender, System::WideChar &Key)
{
   if( Key==0x03/*ctrl-c*/ || Key==0x16/*ctrl-v*/ || Key==0x018/*ctrl-x*/ )
      Key = 0;  //ignore key press
}
person dschaeffer    schedule 29.01.2013

Вы можете использовать некоторые глобальные программы, которые захватывают ярлыки и блокируют C-V C-C C-X, когда окно TEdit активно.

person Łukasz Lew    schedule 08.05.2009

Старый вопрос, но те же самые плохие ответы все еще витают вокруг.

unit LockEdit;

// Version of TEdit with a property CBLocked that prevents copying, pasting,
// and cutting when the property is set.

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, StdCtrls, Windows;

type

  TLockEdit = class(TEdit)
  protected
      procedure WndProc(var msg: TMessage); override;
  private
      FLocked: boolean;
  public
      property CBLocked: boolean read FLocked write FLocked default false;
  end;

implementation

  procedure TLockEdit.WndProc(Var msg: TMessage);
  begin
  if ((msg.msg = WM_PASTE) or (msg.msg = WM_COPY) or (msg.msg = WM_CUT))
      and CBLocked
          then msg.msg:=WM_NULL;
  inherited;
  end;

end.                
person T.G. Grace    schedule 12.06.2021