страничка tripsin'а


Главная | Статьи | Заметки | Файлы| Ссылки | я

Отмена копирования в TEdit

Вот простенький способ, отменяющий копирование из 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

Hosted by uCoz