I'm intercepting and suppressing the WM_PASTE
message for a TDBEdit
by assigning its WindowProc
property, as described in this answer.
After pressing Ctrl+V, despite the WM_PASTE
is intercepted, the dataset's state changes from dsBrowse
to dsEdit
.
Why is this happening and how could I avoid that?
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, DBCtrls, StdCtrls, Mask, DB, DBClient;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
FPrevWindowProc : TWndMethod;
procedure MyWindowProc(var AMessage: TMessage);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var
Dst : TClientDataSet;
Dsc : TDataSource;
Fld : TField;
Nav : TDBNavigator;
Edt : TDBEdit;
begin
//dataset
Dst := TClientDataSet.Create(Self);
Dst.FieldDefs.Add('TEST', ftString, 20);
Dst.CreateDataSet();
Dst.Active := True;
Fld := Dst.Fields[0];
Dst.Append();
Fld.AsString := 'test';
Dst.Post();
//datasource
Dsc := TDataSource.Create(Self);
Dsc.DataSet := Dst;
//navigator
Nav := TDBNavigator.Create(Self);
Nav.DataSource := Dsc;
Nav.Top := 3;
Nav.Left := 3;
Nav.Parent := Self;
//editor
Edt := TDBEdit.Create(Self);
Edt.DataSource := Dsc;
Edt.DataField := Fld.FieldName;
Edt.Top := 31;
Edt.Left := 3;
Edt.Parent := Self;
FPrevWindowProc := Edt.WindowProc;
Edt.WindowProc := MyWindowProc;
end;
procedure TForm1.MyWindowProc(var AMessage: TMessage);
begin
if(AMessage.Msg = WM_PASTE) then
begin
ShowMessage('WM_PASTE, exit!');
Exit;
end;
FPrevWindowProc(AMessage);
end;
end.