我总是被TMemo(和其他类似控件)只有OnChange事件的事实所困扰.我想知道USER何时更改了文本,而不是以编程方式更改文本.
我知道两种方法来区分用户更改的文本和以编程方式更改的文本:
在以编程方式更改文本之前放置OnChange:= NIL.然后恢复OnChange.这很容易出错,因为每次更改代码中的文本时都需要记住这一点(以及要应用此特殊处理的备忘录/编辑).现在我们知道每次调用OnChange时,控件都是由用户编辑的.
捕获OnKeyPress,MouseDown等事件.确定文本是否实际更改并手动调用用户编辑ext时需要调用的代码.这可能会为已经很大的文件添加大量过程.
有一种更优雅的方式吗?
您可以编写一个帮助程序来执行选项1,并在您希望确保在设置文本时不触发任何事件时在框架中使用它OnChange
.例如:
type TCustomEditAccess = class(TCustomEdit); procedure SetEditTextNoEvent(Edit: TCustomEdit; const AText: string); var OldOnChange: TNotifyEvent; begin with TCustomEditAccess(Edit) do begin OldOnChange := OnChange; try OnChange := nil; Text := AText; finally OnChange := OldOnChange; end; end; end;
TMemo
还有也Lines
触发的属性OnChange
,因此您可以创建另一个接受Lines: TStrings
参数的类似过程.