2017-01-18 2 views
2

Меня всегда беспокоил тот факт, что TMemo (и другие аналогичные элементы управления) имеют только событие OnChange. Я хотел бы знать, когда USER изменил текст, а не когда текст был изменен программно.Как узнать, когда ПОЛЬЗОВАТЕЛЬ изменил текст в TMemo/TEdit?

Я знаю два способа различения пользователь изменил текст и программно изменен текст:

  1. Помещенный OnChange: = NIL, прежде чем изменить текст программно. Затем восстановите OnChange. Это подвержено ошибкам, так как вам нужно помнить о том, чтобы делать это каждый раз, когда вы меняете текст из кода (и для каких заметок/исправлений требуется эта специальная обработка, которая будет применяться). Теперь мы знаем, что каждый раз, когда вызывается OnChange, элемент управления редактировался пользователем.
  2. Захват событий OnKeyPress, MouseDown и т. Д. Решите, действительно ли текст был изменен, и вручную вызовите код, который нужно вызвать, когда пользователь отредактировал ext. Это может добавить большой объем процедур в уже большой файл.

Существует более элегантный способ сделать это?

+1

Что делать, если изменение происходит от вставки? Или от автоматизации? Есть намного больше, что может изменить содержимое, чем просто набирать текст или код приложения. –

+5

Это задает вопрос - почему это имеет значение? Может быть, вы пытаетесь решить неправильную проблему. –

ответ

4

Вы можете написать процедуру помощника, чтобы сделать ваш вариант 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.

Смежные вопросы