我总是被TMemo(和其他类似控件)只有OnChange事件的事实所掩盖。我想知道USER何时更改了文本,而不是以编程方式更改文本。
我知道两种方法来区分用户更改的文本和以编程方式更改的文本:
有一种更优雅的方式吗?
答案 0 :(得分:5)
您可以编写帮助程序来执行选项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
,因此您可以创建另一个接受Lines: TStrings
参数的类似过程。
答案 1 :(得分:1)
如何使用Modified属性?
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;