//下面这样基本可以实现,但我觉得还是不太好 //我想应该拦截粘贴的事件来实现,才是最完善的 procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if (Key = 86) and (ssCtrl in Shift) then begin Edit1.ReadOnly := true; Key := 0; end else Edit1.ReadOnly := False; end;
截获WM_PASTE消息,怎么写,有没有现成代码?
//自己做了一个,这个应该是比较完美的 unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) Edit1: TEdit; procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } procedure MYProc(var Msg: TMessage); end;var Form1: TForm1;implementation{$R *.dfm} var oldProc: TWndMethod;procedure TForm1.FormCreate(Sender: TObject); begin oldProc := Edit1.WindowProc; Edit1.WindowProc := MyProc; end;procedure TForm1.MYProc(var Msg: TMessage); begin if Msg.Msg = WM_PASTE then ShowMessage('你不能粘贴') else oldProc(Msg); end;end.
//我想应该拦截粘贴的事件来实现,才是最完善的
procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (Key = 86) and (ssCtrl in Shift) then
begin
Edit1.ReadOnly := true;
Key := 0;
end
else Edit1.ReadOnly := False;
end;
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Edit1: TEdit;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure MYProc(var Msg: TMessage);
end;var
Form1: TForm1;implementation{$R *.dfm}
var
oldProc: TWndMethod;procedure TForm1.FormCreate(Sender: TObject);
begin
oldProc := Edit1.WindowProc;
Edit1.WindowProc := MyProc;
end;procedure TForm1.MYProc(var Msg: TMessage);
begin
if Msg.Msg = WM_PASTE then ShowMessage('你不能粘贴')
else oldProc(Msg);
end;end.
如果应用于Stringgrid1上那怎么办呢? (stringgrid1处于编辑状态下,怎么让用户不能用Ctrl+V粘贴功能呢键)
oldProc := Edit1.WindowProc;
Edit1.WindowProc := MyProc;
不过不能写Edit1
要写Stringgrid1中的那个Edit(如果是private的,就publish出来),而且那个Edit还不一定存在,要Assigned()判断一下
THackGrid = class(TStringGrid)
public
property InPlaceEditor;
end ;