Solved

Disable paste in a TEdit?

Posted on 2006-07-14
7
736 Views
Last Modified: 2012-05-05
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
0
Comment
Question by:cwwkie
  • 3
  • 3
7 Comments
 
LVL 14

Author Comment

by:cwwkie
ID: 17108734
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.
0
 
LVL 26

Accepted Solution

by:
Russell Libby earned 500 total points
ID: 17109024
You can subclass the edit and discard the message.

Regards,
Rusell

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

type
  TForm1            = class(TForm)
     Edit1:         TEdit;
     procedure      FormCreate(Sender: TObject);
  private
     // Private declarations
     FOldEditProc:  TWndMethod;
  protected
     // Protected declartions
     procedure      EditWndProc(var Message: TMessage);

  public
     // Public declarations
  end;

var
  Form1:            TForm1;

implementation
{$R *.DFM}

procedure TForm1.EditWndProc(var Message: TMessage);
begin

  if (Message.Msg = WM_PASTE) then
     Message.Result:=1
  else
     FOldEditProc(Message);

end;

procedure TForm1.FormCreate(Sender: TObject);
begin

  FOldEditProc:=Edit1.WindowProc;
  Edit1.WindowProc:=EditWndProc;

end;

end.
0
 
LVL 14

Author Comment

by:cwwkie
ID: 17109200
Yes, that will do it.
Thanks!
0
Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

 
LVL 6

Expert Comment

by:House_of_Dexter
ID: 17109292
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;

0
 
LVL 6

Expert Comment

by:House_of_Dexter
ID: 17109439
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;
0
 
LVL 14

Author Comment

by:cwwkie
ID: 17111804
> 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.
0
 
LVL 6

Expert Comment

by:House_of_Dexter
ID: 17114413
True...but if you ever implement an OnChange you will need to do something like I showed...
0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

A lot of questions regard threads in Delphi.   One of the more specific questions is how to show progress of the thread.   Updating a progressbar from inside a thread is a mistake. A solution to this would be to send a synchronized message to the…
Introduction The parallel port is a very commonly known port, it was widely used to connect a printer to the PC, if you look at the back of your computer, for those who don't have newer computers, there will be a port with 25 pins and a small print…
This Micro Tutorial will give you a basic overview how to record your screen with Microsoft Expression Encoder. This program is still free and open for the public to download. This will be demonstrated using Microsoft Expression Encoder 4.
In this video I am going to show you how to back up and restore Office 365 mailboxes using CodeTwo Backup for Office 365. Learn more about the tool used in this video here: http://www.codetwo.com/backup-for-office-365/ (http://www.codetwo.com/ba…

910 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

20 Experts available now in Live!

Get 1:1 Help Now