Delphi 如何知道用户何时更改了TMemo/TEdit中的文本?
TMemo(和其他类似的控件)只有OnChange事件,这一事实一直困扰着我。我想知道用户何时更改文本,而不是何时以编程方式更改文本 我知道有两种方法可以区分用户更改的文本和程序更改的文本:Delphi 如何知道用户何时更改了TMemo/TEdit中的文本?,delphi,Delphi,TMemo(和其他类似的控件)只有OnChange事件,这一事实一直困扰着我。我想知道用户何时更改文本,而不是何时以编程方式更改文本 我知道有两种方法可以区分用户更改的文本和程序更改的文本: 在以编程方式更改文本之前,Put OnChange:=NIL。然后恢复OnChange。这很容易出错,因为您需要记住每次更改代码中的文本时都要这样做(并且需要对哪些备忘录/编辑应用这种特殊处理)。现在我们知道,每次调用OnChange时,控件都是由用户编辑的 捕获OnKeyPress、MouseDown等事
有一种更优雅的方法吗?您可以编写一个帮助程序来执行选项1,并在框架中使用它,以确保在设置文本时不会触发
OnChange
事件。e、 g:
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
,因此您可以执行另一个类似的过程来接受行:TStrings
参数。如何使用该属性
procedure TForm1.MyEditChange(Sender: TObject);
begin
if MyEdit.Modified then
begin
// The user changed the text since it was last reset (i.e. set programmatically)
// If you want/need to indicate you've "taken care" of the
// current modification, you can reset Modified to false manually here.
// Otherwise it will be reset the next time you assign something to the
// Text property programmatically.
MyEdit.Modified := false;
end;
end;
如果更改来自粘贴,该怎么办?还是来自自动化?除了打字或应用程序代码,还有很多东西可以改变内容。这就引出了一个问题——为什么这很重要?也许你试图解决错误的问题。