Link to home
Start Free TrialLog in
Avatar of cwwkie
cwwkie

asked on

Disable paste in a TEdit?

Hi,

Is there an easy way to disable pasting (using a mouse)?

I need to fix a program where OnKeyUp is used for input validation. Ofcourse when data is pasted using the mouse, this event is not generated. But the problem is that I cannot simply change all events to an OnChange. So a quick fix would be simply not allowing pasting.

cwwkie
Avatar of cwwkie
cwwkie

ASKER

This is a simplified example of what is happening;

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    procedure Edit1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure Edit2KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure FormShow(Sender: TObject);
    procedure EditChange(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  GlobalText1 : AnsiString;
  GlobalText2 : AnsiString;

implementation

{$R *.dfm}

procedure TForm1.Edit1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  GlobalText1 := Edit1.Text;
  Edit2.Text := '';
end;

procedure TForm1.Edit2KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  GlobalText2 := Edit2.Text;
  Edit1.Text := '';
end;

procedure TForm1.FormShow(Sender: TObject);
begin
  GlobalText1 := 'test';
  GlobalText2 := '';

  Edit1.Text := GlobalText1;
  Edit2.Text := GlobalText2;
end;

procedure TForm1.EditChange(Sender: TObject);
begin
  SendMessage(TEdit(Sender).Handle, WM_KEYUP, 0, 0);
end;

end.

When I simply call the keyup eventhandler from the onchange, it will also be called when the data is manually changed (Edit2.Text := GlobalText2;), which will clear Edit1 on it's turn. So I need to change all the eventhandlers to avoid this, but because this takes time, I like to have an alternative in the mean time.
ASKER CERTIFIED SOLUTION
Avatar of Russell Libby
Russell Libby
Flag of United States of America image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of cwwkie

ASKER

Yes, that will do it.
Thanks!
in your 2nd problem you have a circular reference going on with your events...

Edit1.keyup calls edit1.change which calls keyup and so on and so on...

There's 2 ways to go about this...

one disable the event

procedure TForm1.Edit1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
var
  aEventHolder: TNotifyEvent;
begin
  aEventHolder := Edit1.OnChange;
  try
    GlobalText1 := Edit1.Text;
    Edit2.Text := '';
  finally
    Edit1.OnChange := aEventHolder;
  end
end;


or better Create a State varible
I usually a Set

//TFormStateType ...use this if you need to know what the state is...
{CAREFUL...if you add to this...change TFormStateType}
const
  cEditKeyUp = 0;
  cEditChange = 1;
....add state that you are interested in here...
  cSomeStateChange =9;
 
 
cFormStateSet = [cEditKeyUp..cSomeStateChange ]

type
    TFormStateType =  cIsInitialize..cIsUpdateStatus;
    TFormStateSet = Set of TFormStateType;

//ususally declare something like this in Private of Form

  FFormState: TFormStateSet ;

procedure TForm1.Edit1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  GlobalText1 := Edit1.Text;
  Edit2.Text := '';
  FFormState := FFormState + cEditKeyUp ;
end;

procedure TForm1.EditChange(Sender: TObject);
begin
  if cEditKeyUp in FFormState then
    FFormState :=  FFormState - cEditKeyUp
  else
    SendMessage(TEdit(Sender).Handle, WM_KEYUP, 0, 0);
end;

procedure TForm1.Edit1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
var
  aEventHolder: TNotifyEvent;
begin
  aEventHolder := Edit1.OnChange;
  try
   Edit1.OnChange := nil;  <--forgot this
    GlobalText1 := Edit1.Text;
    Edit2.Text := '';
  finally
    Edit1.OnChange := aEventHolder;
  end
end;
Avatar of cwwkie

ASKER

> in your 2nd problem you have a circular reference going on with your events...

But If I disable pasting, I don't need the onchange, and have no circular reference. As soon as I have properly implemeted a good OnChange for all edit's, I can enable pasting (and cutting) again.
True...but if you ever implement an OnChange you will need to do something like I showed...