Вот, набросал на примере Эдита - будут вставляться только числа. Может можно оптимизировать.
Код | unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,Clipbrd;
type TForm1 = class(TForm) Edit1: TEdit; procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end;
var Form1: TForm1;
implementation
{$R *.dfm}
function NewEditProc(wnd:HWND; uMsg:UINT; wParam:WPARAM; lParam:LPARAM):integer; stdcall; var T: TClipboard; olds,s:string; i:word; begin if uMsg=wm_paste then begin T:=TClipboard.Create; olds:=T.AsText; s:=olds; for i:=length(s) downto 1 do begin if not (s[i] in ['0'..'9']) then delete(s,i,1); end; t.AsText:=s; result:=CallWindowProc(Pointer(GetWindowLong(wnd,GWL_USERDATA)),wnd,uMsg,wParam,lParam); t.AsText:=olds; T.Free; end else result:=CallWindowProc(Pointer(GetWindowLong(wnd,GWL_USERDATA)),wnd,uMsg,wParam,lParam); end;
procedure TForm1.FormCreate(Sender: TObject); begin SetWindowLong(edit1.Handle,GWL_USERDATA,SetWindowLong(edit1.Handle,GWL_WNDPROC, LPARAM(@NewEditProc))); end;
end.
|
|