delphi 为什么EN_PROTECT通知消息不发送到RichEdit?

xuo3flqw  于 2023-06-29  发布在  其他
关注(0)|答案(1)|浏览(114)

使用运行时创建的TRichEdit后代,当EN_PROTECTED通知消息发送到RichEdit时,我需要得到通知。
据我所知,它应该被发送到RichEdit, Package 任何可以编辑文本受保护部分的通知消息(例如:WM_PASTE),并且原始通知消息代码应该在TWMNotifyRE.ENProtected.msg中可用。
不幸的是,我的RichEdit似乎从未收到EN_PROTECTED通知消息。
代码示例:

unit Unit1;

interface

uses
  Vcl.ComCtrls, Winapi.RichEdit, System.UITypes, Vcl.StdCtrls,
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs;

type
  TMyRichEdit = class(Vcl.ComCtrls.TRichEdit)
  private
    procedure CNNotify(var AMessage: TWMNotifyRE); message CN_NOTIFY;
  end;

  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TMyRichEdit.CNNotify(var AMessage: TWMNotifyRE);
begin
  if (AMessage.NMHdr.code = EN_PROTECTED) then
  begin
    //this code is never executed
    DoSometing();
  end else
  begin
    inherited;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  RichEdit : TMyRichEdit;
begin
  RichEdit := TMyRichEdit.Create(Self);
  RichEdit.Align := alClient;
  RichEdit.Parent := Self;
  RichEdit.ScrollBars := ssVertical;
  RichEdit.DefAttributes.Protected := True;
end;

end.

我已经readDefAttributes.Protected必须设置为True,以获得EN_PROTECTED通知,但它没有解决问题

d4so4syb

d4so4syb1#

问题出在DefAttributes实现中。如果它的TRichEdit控制窗口句柄还没有被分配,它将忽略对它的任何更改。
要解决这个问题,您可以在更改DefAttributes之前强制分配句柄:

RichEdit.HandleNeeded;
RichEdit.DefAttributes.Protected := True;

当您在设计时将TRichEdit放在窗体上时,设计器将其Lines属性初始化为'RichEdit1'或其他属性,这将在从DFM加载控件时导致隐式句柄分配。这可以解释设计者创建的控件行为和手动创建的控件行为之间的差异。

相关问题