Вот простенький способ, отменяющий копирование из TEdit. Просто делаем так, чтобы текст не выделялся и все. Для этого приравниванием позицию конца выделенного текста к его началу:
procedure TForm1.Edit1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var StartPos: LongInt;
begin
SendMessage(Edit1.Handle, EM_GETSEL, WPARAM(@StartPos), 0);
SendMessage(Edit1.Handle, EM_SETSEL, StartPos, StartPos);
end;
На самом деле этот способ плохой. Ну во первых обработать событие копирования тут нельзя, потому что никакого копирования не происходит. :) Во вторых возможность копирования все равно остается. Выделить текст можно, выбрав пункт "Выделить все" в контекстном меню. Затем нажимаем CTRL+C и дело в шдяпе. Все. Этот способ на помойку.
А вот решение задачи в чистом виде. При копировании Винда посылает в окошко TEdit сообщение WM_COPY. Его надо перехватить и обработать по-своему. Делаем потомка TEdit с перекрытым обработчиком сообщений. Подробности в коде :D
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TCancelCopyEdit = class(TEdit)
private
procedure DefaultHandler(var Message); override;
end;
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
procedure FormDestroy(Sender: TObject);
procedure FormCreate(Sender: TObject);
end;
var
Form1: TForm1;
CPEdit: TCancelCopyEdit;
implementation
{$R *.dfm}
{ TCancelCopyEdit }
procedure TCancelCopyEdit.DefaultHandler(var Message);
begin
case TMessage(Message).Msg of
WM_COPY:
begin
{Делай тут шо хош}
ShowMessage('Отвали. Копировать нельзя!');
Exit;
end;
end;
inherited;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
CPEdit.Free;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
CPEdit := TCancelCopyEdit.Create(Self);
CPEdit.Parent := Self;
CPEdit.Top := 10;
CPEdit.Left := 10;
end;
end.
Пользуйся :)
tripsin