使用运行时创建的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.
我已经read,DefAttributes.Protected
必须设置为True
,以获得EN_PROTECTED
通知,但它没有解决问题
1条答案
按热度按时间d4so4syb1#
问题出在
DefAttributes
实现中。如果它的TRichEdit
控制窗口句柄还没有被分配,它将忽略对它的任何更改。要解决这个问题,您可以在更改
DefAttributes
之前强制分配句柄:当您在设计时将
TRichEdit
放在窗体上时,设计器将其Lines
属性初始化为'RichEdit1'
或其他属性,这将在从DFM加载控件时导致隐式句柄分配。这可以解释设计者创建的控件行为和手动创建的控件行为之间的差异。