Предотвратить работу с командами буфера обмена в TEdit

Previous  Top  Next

    
 

 

Code:

unit MyEdit;

 

interface

 

uses

  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,

  Dialogs, stdctrls, clipbrd;

 

type

  TPreventNotifyEvent = procedure(Sender: TObject; Text: string; var Accept: Boolean) of object;

 

type

  TMyEdit = class(TCustomEdit)

  private

    FPreventCut: Boolean;

    FPreventCopy: Boolean;

    FPreventPaste: Boolean;

    FPreventClear: Boolean;

 

    FOnCut: TPreventNotifyEvent;

    FOnCopy: TPreventNotifyEvent;

    FOnPaste: TPreventNotifyEvent;

    FOnClear: TPreventNotifyEvent;

 

    procedure WMCut(var Message: TMessage); message WM_CUT;

    procedure WMCopy(var Message: TMessage); message WM_COPY;

    procedure WMPaste(var Message: TMessage); message WM_PASTE;

    procedure WMClear(var Message: TMessage); message WM_CLEAR;

  protected

    { Protected declarations }

  public

    { Public declarations }

  published

    property PreventCut: Boolean read FPreventCut write FPreventCut default False;

    property PreventCopy: Boolean read FPreventCopy write FPreventCopy default False;

    property PreventPaste: Boolean read FPreventPaste write FPreventPaste default False;

    property PreventClear: Boolean read FPreventClear write FPreventClear default False;

    property OnCut: TPreventNotifyEvent read FOnCut write FOnCut;

    property OnCopy: TPreventNotifyEvent read FOnCopy write FOnCopy;

    property OnPaste: TPreventNotifyEvent read FOnPaste write FOnPaste;

    property OnClear: TPreventNotifyEvent read FOnClear write FOnClear;

  end;

 

procedure Register;

 

implementation

 

procedure TMyEdit.WMCut(var Message: TMessage);

var

  Accept: Boolean;

  Handle: THandle;

  HandlePtr: Pointer;

  CText: string;

begin

  if FPreventCut then

    Exit;

  if SelLength = 0 then

    Exit;

  CText := Copy(Text, SelStart + 1, SelLength);

  try

    OpenClipBoard(Self.Handle);

    Accept := True;

    if Assigned(FOnCut) then

      FOnCut(Self, CText, Accept);

    if not Accept then

      Exit;

    Handle := GlobalAlloc(GMEM_MOVEABLE + GMEM_DDESHARE, Length(CText) + 1);

    if Handle = 0 then

      Exit;

    HandlePtr := GlobalLock(Handle);

    Move((PChar(CText))^, HandlePtr^, Length(CText));

    SetClipboardData(CF_TEXT, Handle);

    GlobalUnlock(Handle);

    CText := Text;

    Delete(CText, SelStart + 1, SelLength);

    Text := CText;

  finally

    CloseClipBoard;

  end;

end;

 

 

procedure TMyEdit.WMCopy(var Message: TMessage);

var

  Accept: Boolean;

  Handle: THandle;

  HandlePtr: Pointer;

  CText: string;

begin

  if FPreventCopy then

    Exit;

  if SelLength = 0 then

    Exit;

  CText := Copy(Text, SelStart + 1, SelLength);

  try

    OpenClipBoard(Self.Handle);

    Accept := True;

    if Assigned(FOnCopy) then

      FOnCopy(Self, CText, Accept);

    if not Accept then

      Exit;

    Handle := GlobalAlloc(GMEM_MOVEABLE + GMEM_DDESHARE, Length(CText) + 1);

    if Handle = 0 then

      Exit;

    HandlePtr := GlobalLock(Handle);

    Move((PChar(CText))^, HandlePtr^, Length(CText));

    SetClipboardData(CF_TEXT, Handle);

    GlobalUnlock(Handle);

  finally

    CloseClipBoard;

  end;

end;

 

 

procedure TMyEdit.WMPaste(var Message: TMessage);

var

  Accept: Boolean;

  Handle: THandle;

  CText: string;

  LText: string;

  AText: string;

begin

  if FPreventPaste then

    Exit;

  if IsClipboardFormatAvailable(CF_TEXT) then

  begin

    try

      OpenClipBoard(Self.Handle);

      Handle := GetClipboardData(CF_TEXT);

      if Handle = 0 then

        Exit;

      CText := StrPas(GlobalLock(Handle));

      GlobalUnlock(Handle);

      Accept := True;

      if Assigned(FOnPaste) then

        FOnPaste(Self, CText, Accept);

      if not Accept then

        Exit;

      LText := '';

      if SelStart > 0 then

        LText := Copy(Text, 1, SelStart);

      LText := LText + CText;

      AText := '';

      if (SelStart + 1) < Length(Text) then

        AText := Copy(Text, SelStart + SelLength + 1, Length(Text) - SelStart + SelLength + 1);

      Text := LText + AText;

    finally

      CloseClipBoard;

    end;

  end;

end;

 

 

procedure TMyEdit.WMClear(var Message: TMessage);

var

  Accept: Boolean;

  CText: string;

begin

  if FPreventClear then

    Exit;

  if SelStart = 0 then

    Exit;

  CText  := Copy(Text, SelStart + 1, SelLength);

  Accept := True;

  if Assigned(FOnClear) then

    FOnClear(Self, CText, Accept);

  if not Accept then

    Exit;

  CText := Text;

  Delete(CText, SelStart + 1, SelLength);

  Text := CText;

end;

 

 

procedure Register;

begin

  RegisterComponents('Samples', [TMyEdit]);

end;

 

end.

 

©Drkb::01884

Взято с сайта: http://www.swissdelphicenter.ch