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
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
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Yes, that will do it.
Thanks!
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..cSomeStateCha nge ]
type
TFormStateType = cIsInitialize..cIsUpdateSt atus;
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;
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..cSomeStateCha
type
TFormStateType = cIsInitialize..cIsUpdateSt
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).
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;
var
aEventHolder: TNotifyEvent;
begin
aEventHolder := Edit1.OnChange;
try
Edit1.OnChange := nil; <--forgot this
GlobalText1 := Edit1.Text;
Edit2.Text := '';
finally
Edit1.OnChange := aEventHolder;
end
end;
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.
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...
ASKER
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).
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.