![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
OnChange - игнор
chir © (2005-01-09 22:35:00)Можно ли как нибудь сделать так, чтобы на
Edit1.Text := 'lalala';
Не срабатывало событие OnChange?
begin...end (2005-01-14 11:11:00) [1]> [13] chir (14.01.05 00:47)
Класс TObject не содержит свойства Text и метода OnChange.
Юрий Зотов (2005-01-14 00:56:00) [2]> chir (14.01.05 00:47) [13]
> а еще лучше вот так:
А еще лучше вот так:
OldOnChange := Receiver.OnChange;
try
Receiver.OnChange:= NIL;
Receiver.Text := NewText;
finally
Receiver.OnChange:= OldOnChange;
end;
chir (2005-01-14 00:47:00) [3]> A.S.D
а еще лучше вот так:
procedure SetEditText(Receiver: TObject; NewText: string);
var
OldOnChange: TNotifyEnent;
begin
OldOnChange := Receiver.OnChange;
Receiver.OnChange:= NIL;
Receiver.Text := NewText;
Receiver.OnChange:= OldOnChange;
end;
умнею однако :) test
chir (2005-01-14 00:42:00) [4]> A.S.D.
Отличная идея! :) ща переделаю... а то у меня штук 20 подряд идет подобного текста:
cxTE_surname.Properties.OnChange := nil;
cxTE_surname.Text := DM.ADOQ2.FieldByName('surname').AsString;
cxTE_surname.Properties.OnChange := cxFIOPropertiesChange;
спасибо всем!
A.S.D. (2005-01-10 13:46:00) [5]
> begin...end © (10.01.05 13:36) [9]
А ещё лучше оформить процедуру установки значения Edit:
procedure SetEditText(Edit: TEdit; NewText: string);
var
OldOnChange: TNotifyEnent;
begin
OldOnChange := Edit.OnChange;
Edit.OnChange:= NIL;
Edit.Text := NewText;
Edit.OnChange:= OldOnChange;
end;
Gero (2005-01-10 13:39:00) [6]
> var
> ...
> OldChange: TNotifyEvent;
> begin
> with (Sender as TEdit) do
> begin
> OldChange := OnChange;
> OnChange := NIL;
> // Здесь - манипуляции с Text
> OnChange := OldChange
> end
> end.
Угу, пожалуй лучший вариант.
begin...end (2005-01-10 13:36:00) [7]> [8] pasha_golub © (10.01.05 12:38)
А зачем заводить флажок, если можно обойтись и без флажка? :-)
Но вот ещё пример. Допустим, требуется изменять (как-нибудь преобразовывать) текст edit'а в самом обработчике OnChange.
Вот код обработчика Edit1.OnChange (высосанный из пальца):
var
I: Integer;
S: String;
begin
with (Sender as TEdit) do
begin
S := Text;
for I := 1 to Length(S) do
S[I] := Chr(Ord(S[I]) + 1);
Text := S
end
end.
Присвоение значения свойству Text снова вызывает обработчик OnChange, и... ничего хорошего из этого не выйдет.
Здесь-то и можно поступить так, как написано выше:
var
I: Integer;
S: String;
begin
with (Sender as TEdit) do
begin
OnChange := NIL;
S := Text;
for I := 1 to Length(S) do
S[I] := Chr(Ord(S[I]) + 1);
Text := S;
OnChange := Edit1Change
end
end.
Хотя последняя выделенная строка - это тоже не есть хорошо. Я бы сохранял старый обработчик события, а потом восстанавливал его:
var
...
OldChange: TNotifyEvent;
begin
with (Sender as TEdit) do
begin
OldChange := OnChange;
OnChange := NIL;
// Здесь - манипуляции с Text
OnChange := OldChange
end
end.
pasha_golub (2005-01-10 12:38:00) [8]begin...end © (10.01.05 12:27) [6]
Все равно неудачный, если изменения сделаны програмно можно завести флажок, а в OnChange его опрашивать и сбрасывать.
pasha_golub (2005-01-10 12:30:00) [9]begin...end © (10.01.05 12:27) [6]
Может. :0) Спасибо за пример
begin...end (2005-01-10 12:27:00) [10]> [3] pasha_golub © (10.01.05 11:41)
Разве не может возникнуть ситуация, когда требуется отслеживать толькоизменения edit'а, сделанные пользователем?
pasha_golub (2005-01-10 12:25:00) [11]www.Vlad.uk (10.01.05 11:54) [4]
Ага, хук слева, хук справа....
www.Vlad.uk (2005-01-10 11:54:00) [12]Хук ставь!
pasha_golub (2005-01-10 11:41:00) [13]А можно узнать, зачем?
chir (2005-01-09 23:16:00) [14]какой здоровский совет однако!
спасибо преогроменное! :)
DrPass (2005-01-09 22:39:00) [15]Edit1.OnChange:=nil;
Edit1.Text := 'lalala';
Edit1.OnChange:=Edit1Change;